DPDK patches and discussions
 help / color / mirror / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download: 
* Re: [dpdk-dev] [PATCH] mem: remove old function from symbol list
  @ 2017-11-03 11:34  3% ` Gonzalez Monroy, Sergio
  0 siblings, 0 replies; 200+ results
From: Gonzalez Monroy, Sergio @ 2017-11-03 11:34 UTC (permalink / raw)
  To: Thomas Monjalon, jianfeng.tan; +Cc: dev, bluca

Hi Thomas,

I reckon you need to bump ABI version when you remove public symbol from 
.map file.

Thanks,
Sergio

On 03/11/2017 11:24, Thomas Monjalon wrote:
> The function rte_mem_phy2mch() was removed with the support
> of Xen dom0.
>
> Fixes: a7cb2e20d23c ("mem: remove API to get physical address in dom0")
>
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---
>   lib/librte_eal/rte_eal_version.map | 1 -
>   1 file changed, 1 deletion(-)
>
> diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
> index d2a4ff974..7c9bdc2ae 100644
> --- a/lib/librte_eal/rte_eal_version.map
> +++ b/lib/librte_eal/rte_eal_version.map
> @@ -62,7 +62,6 @@ DPDK_2.0 {
>   	rte_malloc_validate;
>   	rte_malloc_virt2phy;
>   	rte_mem_lock_page;
> -	rte_mem_phy2mch;
>   	rte_mem_virt2phy;
>   	rte_memdump;
>   	rte_memory_get_nchannel;

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 4/6] eal/memory: rename memory API to iova types
  @ 2017-11-03 11:11  4%       ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-11-03 11:11 UTC (permalink / raw)
  To: Santosh Shukla
  Cc: dev, olivier.matz, jerin.jacob, hemant.agrawal, anatoly.burakov

20/10/2017 14:31, Santosh Shukla:
> Renamed memory translational api to _iova types.
> The following api renamed from:
> 
> rte_mempool_populate_phys()
> rte_mempool_populate_phys_tab()

These functions still have "physical addresses" in their description.
It is not consistent.

Please provide ABI compatibility for mempool functions.

> rte_eal_using_phys_addrs()

Why renaming rte_eal_using_phys_addrs?
I think we need to review how it is used.
Maybe it requires a rework.

> rte_mem_virt2phy()
> rte_dump_physmem_layout()
> rte_eal_get_physmem_layout()
> rte_eal_get_physmem_size()

Those 3 functions deal with physical memory layout.
I don't see a need to rename them.

But the dump function needs a change to avoid printing
"phys" even in VA case.

> rte_malloc_virt2phy()
> rte_mem_phy2mch()

This last function was removed with Xen.
It is wrong to rename it in the release notes.
It should just be removed from the map file (I will send a patch).

> To the following iova types api:
> 
> rte_mempool_populate_iova()
> rte_mempool_populate_iova_tab()
> rte_eal_using_iova_addrs()
> rte_mem_virt2iova()
[...]
> rte_malloc_virt2iova()

I am not convinced by the names virt2iova.
I sounds like "virt to virt".
What about "virt2io" or "virt2io_addr"?

As the ABI is broken in EAL 17.11, we do not care about compatibility.
But we must keep an alias to the old function name in order to allow
a smooth API transition for applications.
I suggest to add static inline functions with the old names and set
the deprecated attribute.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH ] examples/l3fwd: fix aliasing in port grouping
  @ 2017-11-03  5:42  3%         ` Guduri Prathyusha
  0 siblings, 0 replies; 200+ results
From: Guduri Prathyusha @ 2017-11-03  5:42 UTC (permalink / raw)
  To: konstantin.ananyev
  Cc: dev, guduri.prathyusha, guduriprathyusha, tomasz.kantecki,
	konstantin.ananyev

On Fri, Nov 03, 2017 at 11:21:43AM +0800, Jianbo.Liu@arm.com wrote:
> The 11/02/2017 15:52, Ananyev, Konstantin wrote:
> >
> >
> > > -----Original Message-----
> > > From: Guduri Prathyusha [mailto:gprathyusha@caviumnetworks.com]
> > > Sent: Thursday, November 2, 2017 3:34 PM
> > > To: Ananyev, Konstantin <konstantin.ananyev@intel.com>
> > > Cc: dev@dpdk.org; Jianbo.Liu@arm.com; guduriprathyusha@gmail.com; Kantecki, Tomasz <tomasz.kantecki@intel.com>
> > > Subject: Re: [dpdk-dev] [PATCH ] examples/l3fwd: fix aliasing in port grouping
> > >
> > > On Thu, Nov 02, 2017 at 02:46:43PM +0000, Ananyev, Konstantin wrote:
> > > > Hi,
> > > Hi
> > > >
> > > > > -----Original Message-----
> > > > > From: Guduri Prathyusha [mailto:gprathyusha@caviumnetworks.com]
> > > > > Sent: Thursday, November 2, 2017 2:31 PM
> > > > > To: Kantecki, Tomasz <tomasz.kantecki@intel.com>
> > > > > Cc: Jianbo.Liu@arm.com; guduriprathyusha@gmail.com; Ananyev, Konstantin <konstantin.ananyev@intel.com>; dev@dpdk.org; Guduri
> > > > > Prathyusha <gprathyusha@caviumnetworks.com>
> > > > > Subject: [dpdk-dev] [PATCH ] examples/l3fwd: fix aliasing in port grouping
> > > > >
> > > > > With -f-strict-aliasing enabled by default from -O2, gcc > 5.x gives
>
> May I ask the detail version about the gcc you are using?
>
Am using gcc provided by ubuntu rootfs

root@localhost:~/dpdk# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/5/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
5.4.0-6ubuntu1~16.04.4'
--with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs
--enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++
--prefix=/usr --program-suffix=-5 --enable-shared
--enable-linker-build-id --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --libdir=/usr/lib
--enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object
--disable-libquadmath --enable-plugin --with-system-zlib
--disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-arm64/jre
--enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-arm64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-arm64
--with-arch-directory=aarch64
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-multiarch
--enable-fix-cortex-a53-843419 --disable-werror
--enable-checking=release --build=aarch64-linux-gnu
--host=aarch64-linux-gnu --target=aarch64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4)

> > > > > undefined behavior in port_groupx4. 'pn' and 'pnum' are two different
> > > > > pointers pointing to same chunk of memory and with -f-strict-aliasing the
> > > > > pointers are assumed to be pointing to different memory and compiler
> > > > > reorders instructions that depend on pnum and pn. This breaks port
> > > > > grouping algorithm.
> > > > >
> > > > > This patch eliminates the usage of union and uses memcpy for copying
> > > > > gptbl[v].pnum to pn. memcpy when applied on built_in constant size does
> > > > > not call its library implementation but uses appropriate LD and ST
> > > > > instructions directly and hence no performance overhead.
> > > > >
> > > > > Fixes: 569b290cdb36 ("examples/l3fwd: add NEON implementation")
> > > > > Fixes: af1694d94bf1 ("examples/l3fwd: fix crash with gcc 5")
> > > > > Signed-off-by: Guduri Prathyusha <gprathyusha@caviumnetworks.com>
> > > > > ---
> > > > >  examples/l3fwd/l3fwd_neon.h | 11 +++--------
> > > > >  examples/l3fwd/l3fwd_sse.h  | 11 +++--------
> > > > >  2 files changed, 6 insertions(+), 16 deletions(-)
> > > > >
> > > > > diff --git a/examples/l3fwd/l3fwd_neon.h b/examples/l3fwd/l3fwd_neon.h
> > > > > index 4bc161394..10a602a04 100644
> > > > > --- a/examples/l3fwd/l3fwd_neon.h
> > > > > +++ b/examples/l3fwd/l3fwd_neon.h
> > > > > @@ -100,11 +100,6 @@ static inline uint16_t *
> > > > >  port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, uint16x8_t dp1,
> > > > >              uint16x8_t dp2)
> > > > >  {
> > > > > -       union {
> > > > > -               uint16_t u16[FWDSTEP + 1];
> > > > > -               uint64_t u64;
> > > > > -       } *pnum = (void *)pn;
> > > > > -
> > > > >         int32_t v;
> > > > >         uint16x8_t mask = {1, 2, 4, 8, 0, 0, 0, 0};
> > > > >
> > > > > @@ -117,9 +112,9 @@ port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, uint16x8_t dp1,
> > > > >
> > > > >         /* if dest port value has changed. */
> > > > >         if (v != GRPMSK) {
> > > > > -               pnum->u64 = gptbl[v].pnum;
> > > > > -               pnum->u16[FWDSTEP] = 1;
> > > > > -               lp = pnum->u16 + gptbl[v].idx;
> > > > > +               rte_memcpy(pn, &gptbl[v].pnum, sizeof(gptbl[v].pnum));
> > > > > +               pn[FWDSTEP] = 1;
> > > > > +               lp = pn + gptbl[v].idx;
> > > > >         }
> > > > >
> > > > >         return lp;
> > > > > diff --git a/examples/l3fwd/l3fwd_sse.h b/examples/l3fwd/l3fwd_sse.h
> > > > > index 831760f02..79a71d77e 100644
> > > > > --- a/examples/l3fwd/l3fwd_sse.h
> > > > > +++ b/examples/l3fwd/l3fwd_sse.h
> > > > > @@ -98,11 +98,6 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP])
> > > > >  static inline uint16_t *
> > > > >  port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, __m128i dp1, __m128i dp2)
> > > > >  {
> > > > > -       union {
> > > > > -               uint16_t u16[FWDSTEP + 1];
> > > > > -               uint64_t u64;
> > > > > -       } *pnum = (void *)pn;
> > > > > -
> > > > >         int32_t v;
> > > > >
> > > > >         dp1 = _mm_cmpeq_epi16(dp1, dp2);
> > > > > @@ -114,9 +109,9 @@ port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, __m128i dp1, __m128i dp2)
> > > > >
> > > > >         /* if dest port value has changed. */
> > > > >         if (v != GRPMSK) {
> > > > > -               pnum->u64 = gptbl[v].pnum;
> > > > > -               pnum->u16[FWDSTEP] = 1;
> > > > > -               lp = pnum->u16 + gptbl[v].idx;
> > > > > +               rte_memcpy(pn, &gptbl[v].pnum, sizeof(gptbl[v].pnum));
> > > > > +               pn[FWDSTEP] = 1;
> > > > > +               lp = pn + gptbl[v].idx;
> > > >
> > > > Could you explain a bit more here - which exactly instructions were reordered
> > > > and what kind of problems did it cause?
> > > > Specially on IA?
> > >
> > > This issue is observed on ARM since ARM gcc is more aggressive in
> > > reordering than x86 gcc.
> >
> > Ok, then if x86 is not affected why to modify l3fwd_sse.h at all?
> > Unless there is a reproducible problem with x86 -
> > my preference would be to keep that file intact.
> >
> > > In ARM when v != GRPMSK, the following
> > > instructions ordering is not guarenteed because of strict aliasing.
> > >
> > > lp[0] += gptbl[v].lpv;
> > > pnum->u64 = gptbl[v].pnum;
> > > pnum->u16[FWDSTEP] = 1;
> > > lp = pnum->u16 + gptbl[v].idx;
> >
> > Ok, so what in particular is reordered by the compiler:
> >
> >  lp[0] += gptbl[v].lpv; (1)
> >  pnum->u64 = gptbl[v].pnum; (2)
> >  pnum->u16[FWDSTEP] = 1;   (3)
> >  lp = pnum->u16 + gptbl[v].idx; (4)
> >
> > (2) and (3)?
> > If so I am not sure how it could be a problem:
> > they do stores to the different locations.
> > (1) and (4) as I can see shouldn't be reordered.
> > Anyway - if you think this a compiler reordering issue,
> > then adding rte_compiler_barrier() should fix the issue, right?
>
> Agree.
>
Yes, rte_compiler_barrier() solves the issue. I will spin a V2 if you
are ok with it.
> >
> > >
> > > That results in wrong lp[0] updation.
> > > memcpy in this case will avoid this problem.
> > >
> > > > In any case I don't think using rte_memcpy is a good thing to use here:
> > > > it is a huge inline function - way too much to copy just 64 bit variable.
> > >
> > > I agree that rte_memcpy is overhead in this case but how about using
> > > memcpy that will not use library implementation if the size is constant.
> > > memcpy with constant size uses built_in_memcpy that does not add
> > > performance overhead.
> >
> > On x86 rte_memcpy() doesn't call libc memcpy() at all - it is a separate function:
> > ib/librte_eal/common/include/arch/x86/rte_memcpy.h
> >
> > >
> > > Thoughts?
> >
> > As I said - if x86 is  not affected - please keep l3fwd_sse.h intact.
> > If it does (still not sure how) - check would compiler barrier help here.
> > Konstantin
> >
>
> --
> IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] doc: update release notes for rte_security
  2017-11-01  6:20  0%   ` Akhil Goyal
@ 2017-11-02 16:36  0%     ` Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2017-11-02 16:36 UTC (permalink / raw)
  To: Akhil Goyal, Thomas Monjalon
  Cc: dev, Doherty, Declan, De Lara Guarch, Pablo, hemant.agrawal,
	Nicolau, Radu, borisp, aviadye, jerin.jacob, Ananyev, Konstantin



> -----Original Message-----
> From: Akhil Goyal [mailto:akhil.goyal@nxp.com]
> Sent: Wednesday, November 1, 2017 6:21 AM
> To: Thomas Monjalon <thomas@monjalon.net>; Mcnamara, John
> <john.mcnamara@intel.com>
> Cc: dev@dpdk.org; Doherty, Declan <declan.doherty@intel.com>; De Lara
> Guarch, Pablo <pablo.de.lara.guarch@intel.com>; hemant.agrawal@nxp.com;
> Nicolau, Radu <radu.nicolau@intel.com>; borisp@mellanox.com;
> aviadye@mellanox.com; jerin.jacob@caviumnetworks.com; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>
> Subject: Re: [PATCH] doc: update release notes for rte_security
> 
> Hi Thomas,
> On 10/30/2017 7:52 PM, Thomas Monjalon wrote:
> > 30/10/2017 13:27, Akhil Goyal:
> >> Removed the deprication notice for ABI breakage and updated release
> >> notes for rte_security.
> >>
> >> Signed-off-by: Akhil Goyal <akhil.goyal@nxp.com>
> >> ---
> >> +.. _security_library:
> >> +
> >>   Security Library
> >>   ================
> > [...]
> >> +* **Added the Security Offload Library.**
> >> +
> >> +  Added an experimental library - rte_security. It provide security
> >> + APIs for  protocols like IPSec using inline ipsec offload to
> >> + ethernet device or full  protocol offload with lookaside crypto
> device.
> >> +
> >> +  See the :ref:`Security Library <Security_Library>` documentation
> >> + in  the Programmers Guide document, for more information.
> >
> > I think the reference to the programmer's guide is not so useful.
> > I prefer avoiding it because it won't work in PDF format.
> >
> > John, any opinion?
> >
> 
> I added this reference as there was another one in the release notes
> already for membership library.
> 
> I will remove reference to security library, if it is not required.
> Please let me know.
> 

You could refer to it without a link:

    See the "Security_Library" section of the DPDK Programmers Guide document,
    for more information.

John


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] doc: update release notes for rte_security
  2017-10-30 14:22  0% ` Thomas Monjalon
@ 2017-11-01  6:20  0%   ` Akhil Goyal
  2017-11-02 16:36  0%     ` Mcnamara, John
  0 siblings, 1 reply; 200+ results
From: Akhil Goyal @ 2017-11-01  6:20 UTC (permalink / raw)
  To: Thomas Monjalon, john.mcnamara
  Cc: dev, declan.doherty, pablo.de.lara.guarch, hemant.agrawal,
	radu.nicolau, borisp, aviadye, jerin.jacob, konstantin.ananyev

Hi Thomas,
On 10/30/2017 7:52 PM, Thomas Monjalon wrote:
> 30/10/2017 13:27, Akhil Goyal:
>> Removed the deprication notice for ABI breakage and updated
>> release notes for rte_security.
>>
>> Signed-off-by: Akhil Goyal <akhil.goyal@nxp.com>
>> ---
>> +.. _security_library:
>> +
>>   Security Library
>>   ================
> [...]
>> +* **Added the Security Offload Library.**
>> +
>> +  Added an experimental library - rte_security. It provide security APIs for
>> +  protocols like IPSec using inline ipsec offload to ethernet device or full
>> +  protocol offload with lookaside crypto device.
>> +
>> +  See the :ref:`Security Library <Security_Library>` documentation in
>> +  the Programmers Guide document, for more information.
> 
> I think the reference to the programmer's guide is not so useful.
> I prefer avoiding it because it won't work in PDF format.
> 
> John, any opinion?
> 

I added this reference as there was another one in the release notes 
already for membership library.

I will remove reference to security library, if it is not required. 
Please let me know.

Thanks,
Akhil

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] doc: update release notes for rte_security
  2017-10-30 12:27  8% [dpdk-dev] [PATCH] doc: update release notes for rte_security Akhil Goyal
@ 2017-10-30 14:22  0% ` Thomas Monjalon
  2017-11-01  6:20  0%   ` Akhil Goyal
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-30 14:22 UTC (permalink / raw)
  To: Akhil Goyal, john.mcnamara
  Cc: dev, declan.doherty, pablo.de.lara.guarch, hemant.agrawal,
	radu.nicolau, borisp, aviadye, jerin.jacob, konstantin.ananyev

30/10/2017 13:27, Akhil Goyal:
> Removed the deprication notice for ABI breakage and updated
> release notes for rte_security.
> 
> Signed-off-by: Akhil Goyal <akhil.goyal@nxp.com>
> ---
> +.. _security_library:
> +
>  Security Library
>  ================
[...]
> +* **Added the Security Offload Library.**
> +
> +  Added an experimental library - rte_security. It provide security APIs for
> +  protocols like IPSec using inline ipsec offload to ethernet device or full
> +  protocol offload with lookaside crypto device.
> +
> +  See the :ref:`Security Library <Security_Library>` documentation in
> +  the Programmers Guide document, for more information.

I think the reference to the programmer's guide is not so useful.
I prefer avoiding it because it won't work in PDF format.

John, any opinion?

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] doc: update release notes for rte_security
@ 2017-10-30 12:27  8% Akhil Goyal
  2017-10-30 14:22  0% ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Akhil Goyal @ 2017-10-30 12:27 UTC (permalink / raw)
  To: dev
  Cc: declan.doherty, pablo.de.lara.guarch, hemant.agrawal,
	radu.nicolau, borisp, aviadye, thomas, jerin.jacob,
	john.mcnamara, konstantin.ananyev, Akhil Goyal

Removed the deprication notice for ABI breakage and updated
release notes for rte_security.

Signed-off-by: Akhil Goyal <akhil.goyal@nxp.com>
---
 doc/guides/prog_guide/rte_security.rst |  2 ++
 doc/guides/rel_notes/deprecation.rst   | 10 ----------
 doc/guides/rel_notes/release_17_11.rst | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/doc/guides/prog_guide/rte_security.rst b/doc/guides/prog_guide/rte_security.rst
index 71be036..ef6ed0f 100644
--- a/doc/guides/prog_guide/rte_security.rst
+++ b/doc/guides/prog_guide/rte_security.rst
@@ -28,6 +28,8 @@
     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
+.. _security_library:
+
 Security Library
 ================
 
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index a93c3e1..b8dff0e 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -50,16 +50,6 @@ Deprecation Notices
   Target release for removal of the legacy API will be defined once most
   PMDs have switched to rte_flow.
 
-* ethdev: new parameters - ``rte_security_capabilities`` and
-  ``rte_security_ops`` will be added to ``rte_eth_dev_info`` and
-  ``rte_eth_dev`` respectively  to support security operations like
-  ipsec inline.
-
-* cryptodev: new parameters - ``rte_security_capabilities`` and
-  ``rte_security_ops`` will be added to ``rte_cryptodev_info`` and
-  ``rte_cryptodev`` respectively to support security protocol offloaded
-  operations.
-
 * cryptodev: the following function is deprecated starting from 17.08 and will
   be removed in 17.11:
 
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index b96b236..132a916 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -208,6 +208,29 @@ New Features
   applications to classify an input packet by matching it against a set of flow
   rules. It uses the librte_table API to manage the flow rules.
 
+* **Added the Security Offload Library.**
+
+  Added an experimental library - rte_security. It provide security APIs for
+  protocols like IPSec using inline ipsec offload to ethernet device or full
+  protocol offload with lookaside crypto device.
+
+  See the :ref:`Security Library <Security_Library>` documentation in
+  the Programmers Guide document, for more information.
+
+* **Updated DPAA2_SEC crypto driver.**
+
+  Updated dpaa2_sec crypto PMD to support rte_security lookaside protocol
+  offload for IPSec.
+
+* **Updated IXGBE ethernet driver.**
+
+  Updated ixgbe ethernet PMD to support rte_security inline IPSec offload.
+
+* **Updated ipsec-secgw application**
+
+  Updated ipsec-secgw sample application to support rte_security actions for
+  ipsec inline and full protocol offload using lookaside crypto offload.
+
 
 Resolved Issues
 ---------------
@@ -422,6 +445,16 @@ ABI Changes
   The size of the field ``port_id`` in the ``rte_eth_dev_data`` structure
   changed, as described in the `New Features` section.
 
+* **New parameter added to rte_eth_dev.**
+
+  New parameter ``security_ctx``  added to ``rte_eth_dev`` to support security
+  operations like IPSec inline.
+
+* **New parameter added to rte_cryptodev.**
+
+  New parameter ``security_ctx``  added to ``rte_cryptodev`` to support security
+  operations like lookaside crypto.
+
 
 Removed Items
 -------------
-- 
2.9.3

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] rte_security deprecation
  2017-10-30 11:06  3% [dpdk-dev] rte_security deprecation Thomas Monjalon
@ 2017-10-30 11:30  0% ` Akhil Goyal
  0 siblings, 0 replies; 200+ results
From: Akhil Goyal @ 2017-10-30 11:30 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: pablo.de.lara.guarch, declan.doherty, dev

Hi Thomas,
On 10/30/2017 4:36 PM, Thomas Monjalon wrote:
> Hi,
> 
> The deprecation notice for rte_security was not removed:
> 	http://dpdk.org/commit/be7c7cce25
> 
> Please submit a patch to remove it and explain what was really done.
> The API and ABI changes must be described in the release notes.
> 
> Thanks
> 

Will do that shortly. Thanks for reminding this.

-Akhil

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] rte_security deprecation
@ 2017-10-30 11:06  3% Thomas Monjalon
  2017-10-30 11:30  0% ` Akhil Goyal
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-30 11:06 UTC (permalink / raw)
  To: akhil.goyal; +Cc: pablo.de.lara.guarch, declan.doherty, dev

Hi,

The deprecation notice for rte_security was not removed:
	http://dpdk.org/commit/be7c7cce25

Please submit a patch to remove it and explain what was really done.
The API and ABI changes must be described in the release notes.

Thanks

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v11 3/4] bus/vdev: move to vdev bus to drivers/bus
    2017-10-30  8:28  4%   ` [dpdk-dev] [PATCH v11 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
@ 2017-10-30  8:28  1%   ` Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-10-30  8:28 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Move the vdev bus from lib/librte_eal to drivers/bus.

As the crypto vdev helper function refers to data structure
in rte_vdev.h, so we move those helper function into drivers/bus
too.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 config/common_base                          |   5 +
 doc/guides/rel_notes/release_17_11.rst      |   9 +
 drivers/bus/Makefile                        |   4 +-
 drivers/bus/vdev/Makefile                   |  57 +++++
 drivers/bus/vdev/rte_bus_vdev.h             | 153 +++++++++++++
 drivers/bus/vdev/rte_bus_vdev_version.map   |   8 +
 drivers/bus/vdev/vdev.c                     | 344 ++++++++++++++++++++++++++++
 drivers/crypto/Makefile                     |   1 +
 drivers/crypto/aesni_gcm/aesni_gcm_pmd.c    |   2 +-
 drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c  |   2 +-
 drivers/crypto/armv8/rte_armv8_pmd.c        |   2 +-
 drivers/crypto/kasumi/rte_kasumi_pmd.c      |   2 +-
 drivers/crypto/mrvl/rte_mrvl_pmd.c          |   2 +-
 drivers/crypto/null/null_crypto_pmd.c       |   2 +-
 drivers/crypto/openssl/rte_openssl_pmd.c    |   2 +-
 drivers/crypto/scheduler/scheduler_pmd.c    |   2 +-
 drivers/crypto/snow3g/rte_snow3g_pmd.c      |   2 +-
 drivers/crypto/zuc/rte_zuc_pmd.c            |   2 +-
 drivers/event/Makefile                      |   2 +-
 drivers/event/dpaa2/dpaa2_eventdev.c        |   2 +-
 drivers/event/octeontx/ssovf_evdev.c        |   2 +-
 drivers/event/skeleton/skeleton_eventdev.c  |   2 +-
 drivers/event/sw/sw_evdev.c                 |   2 +-
 drivers/net/Makefile                        |   2 +-
 drivers/net/af_packet/rte_eth_af_packet.c   |   2 +-
 drivers/net/bonding/rte_eth_bond_api.c      |   2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c      |   2 +-
 drivers/net/failsafe/failsafe.c             |   2 +-
 drivers/net/kni/rte_eth_kni.c               |   2 +-
 drivers/net/mrvl/mrvl_ethdev.c              |   2 +-
 drivers/net/null/rte_eth_null.c             |   2 +-
 drivers/net/octeontx/octeontx_ethdev.c      |   2 +-
 drivers/net/pcap/rte_eth_pcap.c             |   2 +-
 drivers/net/ring/rte_eth_ring.c             |   2 +-
 drivers/net/softnic/rte_eth_softnic.c       |   2 +-
 drivers/net/tap/rte_eth_tap.c               |   2 +-
 drivers/net/vhost/rte_eth_vhost.c           |   2 +-
 drivers/net/virtio/virtio_user_ethdev.c     |   2 +-
 lib/librte_eal/bsdapp/eal/Makefile          |   3 +-
 lib/librte_eal/common/.eal_common_dev.c.swp | Bin 0 -> 16384 bytes
 lib/librte_eal/common/Makefile              |   2 +-
 lib/librte_eal/common/eal_common_vdev.c     | 342 ---------------------------
 lib/librte_eal/common/include/rte_dev.h     |  24 +-
 lib/librte_eal/common/include/rte_vdev.h    | 131 -----------
 lib/librte_eal/linuxapp/eal/Makefile        |   3 +-
 lib/librte_eal/rte_eal_version.map          |   4 -
 lib/librte_ether/rte_ethdev_vdev.h          |   2 +-
 lib/librte_eventdev/rte_eventdev_pmd_vdev.h |   2 +-
 mk/rte.app.mk                               |   1 +
 test/test/autotest_data.pyc                 | Bin 0 -> 6122 bytes
 test/test/autotest_test_funcs.pyc           | Bin 0 -> 6812 bytes
 test/test/test_cryptodev.c                  |   1 +
 test/test/test_event_eth_rx_adapter.c       |   1 +
 test/test/test_eventdev.c                   |   1 +
 test/test/test_eventdev_octeontx.c          |   1 +
 test/test/test_eventdev_sw.c                |   1 +
 test/test/test_link_bonding_rssconf.c       |   1 +
 57 files changed, 622 insertions(+), 539 deletions(-)
 create mode 100644 drivers/bus/vdev/Makefile
 create mode 100644 drivers/bus/vdev/rte_bus_vdev.h
 create mode 100644 drivers/bus/vdev/rte_bus_vdev_version.map
 create mode 100644 drivers/bus/vdev/vdev.c
 create mode 100644 lib/librte_eal/common/.eal_common_dev.c.swp
 delete mode 100644 lib/librte_eal/common/eal_common_vdev.c
 delete mode 100644 lib/librte_eal/common/include/rte_vdev.h
 create mode 100644 test/test/autotest_data.pyc
 create mode 100644 test/test/autotest_test_funcs.pyc

diff --git a/config/common_base b/config/common_base
index 82ee754..d39e657 100644
--- a/config/common_base
+++ b/config/common_base
@@ -814,3 +814,8 @@ CONFIG_RTE_APP_CRYPTO_PERF=y
 # Compile the eventdev application
 #
 CONFIG_RTE_APP_EVENTDEV=y
+
+#
+# Compile the vdev bus
+#
+CONFIG_RTE_LIBRTE_VDEV_BUS=y
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index bab5d73..8f76ecd 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -406,6 +406,14 @@ API Changes
 * ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
   in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
+* **Moved vdev bus APIs outside of the EAL**
+
+  Moved the following APIs from ``librte_eal`` to ``librte_bus_vdev``:
+  * ``rte_vdev_init``
+  * ``rte_vdev_register``
+  * ``rte_vdev_uninit``
+  * ``rte_vdev_unregister``
+
 ABI Changes
 -----------
 
@@ -461,6 +469,7 @@ The libraries prepended with a plus sign were incremented in this version.
 
      librte_acl.so.2
    + librte_bitratestats.so.2
+   + librte_bus_vdev.so.1
      librte_cfgfile.so.2
      librte_cmdline.so.2
    + librte_cryptodev.so.4
diff --git a/drivers/bus/Makefile b/drivers/bus/Makefile
index a220d27..6c7e203 100644
--- a/drivers/bus/Makefile
+++ b/drivers/bus/Makefile
@@ -30,12 +30,12 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
-core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_ether
-
 DIRS-$(CONFIG_RTE_LIBRTE_DPAA_BUS) += dpaa
 
 DIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc
 
 DIRS-$(CONFIG_RTE_LIBRTE_PCI_BUS) += pci
 
+DIRS-$(CONFIG_RTE_LIBRTE_VDEV_BUS) += vdev
+
 include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile
new file mode 100644
index 0000000..84bd724
--- /dev/null
+++ b/drivers/bus/vdev/Makefile
@@ -0,0 +1,57 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_bus_vdev.a
+
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+# versioning export map
+EXPORT_MAP := rte_bus_vdev_version.map
+
+# library version
+LIBABIVER := 1
+
+SRCS-y += vdev.c
+
+LDLIBS += -lrte_eal
+
+#
+# Export include files
+#
+SYMLINK-y-include += rte_bus_vdev.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/bus/vdev/rte_bus_vdev.h b/drivers/bus/vdev/rte_bus_vdev.h
new file mode 100644
index 0000000..41762b8
--- /dev/null
+++ b/drivers/bus/vdev/rte_bus_vdev.h
@@ -0,0 +1,153 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of RehiveTech nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RTE_VDEV_H
+#define RTE_VDEV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/queue.h>
+#include <rte_dev.h>
+#include <rte_devargs.h>
+
+struct rte_vdev_device {
+	TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
+	struct rte_device device;               /**< Inherit core device */
+};
+
+/**
+ * @internal
+ * Helper macro for drivers that need to convert to struct rte_vdev_device.
+ */
+#define RTE_DEV_TO_VDEV(ptr) \
+	container_of(ptr, struct rte_vdev_device, device)
+
+static inline const char *
+rte_vdev_device_name(const struct rte_vdev_device *dev)
+{
+	if (dev && dev->device.name)
+		return dev->device.name;
+	return NULL;
+}
+
+static inline const char *
+rte_vdev_device_args(const struct rte_vdev_device *dev)
+{
+	if (dev && dev->device.devargs)
+		return dev->device.devargs->args;
+	return "";
+}
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
+
+/**
+ * Probe function called for each virtual device driver once.
+ */
+typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
+
+/**
+ * Remove function called for each virtual device driver once.
+ */
+typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
+
+/**
+ * A virtual device driver abstraction.
+ */
+struct rte_vdev_driver {
+	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
+	struct rte_driver driver;      /**< Inherited general driver. */
+	rte_vdev_probe_t *probe;       /**< Virtual device probe function. */
+	rte_vdev_remove_t *remove;     /**< Virtual device remove function. */
+};
+
+/**
+ * Register a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be registered.
+ */
+void rte_vdev_register(struct rte_vdev_driver *driver);
+
+/**
+ * Unregister a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be unregistered.
+ */
+void rte_vdev_unregister(struct rte_vdev_driver *driver);
+
+#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
+RTE_INIT(vdrvinitfn_ ##vdrv);\
+static const char *vdrvinit_ ## nm ## _alias;\
+static void vdrvinitfn_ ##vdrv(void)\
+{\
+	(vdrv).driver.name = RTE_STR(nm);\
+	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
+	rte_vdev_register(&vdrv);\
+} \
+RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
+
+#define RTE_PMD_REGISTER_ALIAS(nm, alias)\
+static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
+
+/**
+ * Initialize a driver specified by name.
+ *
+ * @param name
+ *   The pointer to a driver name to be initialized.
+ * @param args
+ *   The pointer to arguments used by driver initialization.
+ * @return
+ *  0 on success, negative on error
+ */
+int rte_vdev_init(const char *name, const char *args);
+
+/**
+ * Uninitalize a driver specified by name.
+ *
+ * @param name
+ *   The pointer to a driver name to be initialized.
+ * @return
+ *  0 on success, negative on error
+ */
+int rte_vdev_uninit(const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/drivers/bus/vdev/rte_bus_vdev_version.map b/drivers/bus/vdev/rte_bus_vdev_version.map
new file mode 100644
index 0000000..6ccb789
--- /dev/null
+++ b/drivers/bus/vdev/rte_bus_vdev_version.map
@@ -0,0 +1,8 @@
+DPDK_17.11 {
+	global:
+
+	rte_vdev_init;
+	rte_vdev_register;
+	rte_vdev_uninit;
+	rte_vdev_unregister;
+};
diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
new file mode 100644
index 0000000..04ed49b
--- /dev/null
+++ b/drivers/bus/vdev/vdev.c
@@ -0,0 +1,344 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of RehiveTech nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <sys/queue.h>
+
+#include <rte_eal.h>
+#include <rte_dev.h>
+#include <rte_bus.h>
+#include <rte_common.h>
+#include <rte_devargs.h>
+#include <rte_memory.h>
+#include <rte_errno.h>
+
+#include "rte_bus_vdev.h"
+
+/* Forward declare to access virtual bus name */
+static struct rte_bus rte_vdev_bus;
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_device_list, rte_vdev_device);
+
+static struct vdev_device_list vdev_device_list =
+	TAILQ_HEAD_INITIALIZER(vdev_device_list);
+struct vdev_driver_list vdev_driver_list =
+	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
+
+/* register a driver */
+void
+rte_vdev_register(struct rte_vdev_driver *driver)
+{
+	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
+}
+
+/* unregister a driver */
+void
+rte_vdev_unregister(struct rte_vdev_driver *driver)
+{
+	TAILQ_REMOVE(&vdev_driver_list, driver, next);
+}
+
+static int
+vdev_parse(const char *name, void *addr)
+{
+	struct rte_vdev_driver **out = addr;
+	struct rte_vdev_driver *driver = NULL;
+
+	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
+		if (strncmp(driver->driver.name, name,
+			    strlen(driver->driver.name)) == 0)
+			break;
+		if (driver->driver.alias &&
+		    strncmp(driver->driver.alias, name,
+			    strlen(driver->driver.alias)) == 0)
+			break;
+	}
+	if (driver != NULL &&
+	    addr != NULL)
+		*out = driver;
+	return driver == NULL;
+}
+
+static int
+vdev_probe_all_drivers(struct rte_vdev_device *dev)
+{
+	const char *name;
+	struct rte_vdev_driver *driver;
+	int ret;
+
+	name = rte_vdev_device_name(dev);
+
+	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
+		rte_vdev_device_name(dev));
+
+	if (vdev_parse(name, &driver))
+		return -1;
+	dev->device.driver = &driver->driver;
+	ret = driver->probe(dev);
+	if (ret)
+		dev->device.driver = NULL;
+	return ret;
+}
+
+static struct rte_vdev_device *
+find_vdev(const char *name)
+{
+	struct rte_vdev_device *dev;
+
+	if (!name)
+		return NULL;
+
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+		const char *devname = rte_vdev_device_name(dev);
+
+		if (!strncmp(devname, name, strlen(name)))
+			return dev;
+	}
+
+	return NULL;
+}
+
+static struct rte_devargs *
+alloc_devargs(const char *name, const char *args)
+{
+	struct rte_devargs *devargs;
+	int ret;
+
+	devargs = calloc(1, sizeof(*devargs));
+	if (!devargs)
+		return NULL;
+
+	devargs->bus = &rte_vdev_bus;
+	if (args)
+		devargs->args = strdup(args);
+	else
+		devargs->args = strdup("");
+
+	ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name);
+	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
+		free(devargs->args);
+		free(devargs);
+		return NULL;
+	}
+
+	return devargs;
+}
+
+int
+rte_vdev_init(const char *name, const char *args)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+	int ret;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	dev = find_vdev(name);
+	if (dev)
+		return -EEXIST;
+
+	devargs = alloc_devargs(name, args);
+	if (!devargs)
+		return -ENOMEM;
+
+	dev = calloc(1, sizeof(*dev));
+	if (!dev) {
+		ret = -ENOMEM;
+		goto fail;
+	}
+
+	dev->device.devargs = devargs;
+	dev->device.numa_node = SOCKET_ID_ANY;
+	dev->device.name = devargs->name;
+
+	ret = vdev_probe_all_drivers(dev);
+	if (ret) {
+		if (ret > 0)
+			RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
+		goto fail;
+	}
+
+	TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
+
+	TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+	return 0;
+
+fail:
+	free(devargs->args);
+	free(devargs);
+	free(dev);
+	return ret;
+}
+
+static int
+vdev_remove_driver(struct rte_vdev_device *dev)
+{
+	const char *name = rte_vdev_device_name(dev);
+	const struct rte_vdev_driver *driver;
+
+	if (!dev->device.driver) {
+		RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name);
+		return 1;
+	}
+
+	driver = container_of(dev->device.driver, const struct rte_vdev_driver,
+		driver);
+	return driver->remove(dev);
+}
+
+int
+rte_vdev_uninit(const char *name)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+	int ret;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	dev = find_vdev(name);
+	if (!dev)
+		return -ENOENT;
+
+	devargs = dev->device.devargs;
+
+	ret = vdev_remove_driver(dev);
+	if (ret)
+		return ret;
+
+	TAILQ_REMOVE(&vdev_device_list, dev, next);
+
+	TAILQ_REMOVE(&devargs_list, devargs, next);
+
+	free(devargs->args);
+	free(devargs);
+	free(dev);
+	return 0;
+}
+
+static int
+vdev_scan(void)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+
+	/* for virtual devices we scan the devargs_list populated via cmdline */
+	TAILQ_FOREACH(devargs, &devargs_list, next) {
+
+		if (devargs->bus != &rte_vdev_bus)
+			continue;
+
+		dev = find_vdev(devargs->name);
+		if (dev)
+			continue;
+
+		dev = calloc(1, sizeof(*dev));
+		if (!dev)
+			return -1;
+
+		dev->device.devargs = devargs;
+		dev->device.numa_node = SOCKET_ID_ANY;
+		dev->device.name = devargs->name;
+
+		TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+	}
+
+	return 0;
+}
+
+static int
+vdev_probe(void)
+{
+	struct rte_vdev_device *dev;
+
+	/* call the init function for each virtual device */
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+
+		if (dev->device.driver)
+			continue;
+
+		if (vdev_probe_all_drivers(dev)) {
+			RTE_LOG(ERR, EAL, "failed to initialize %s device\n",
+				rte_vdev_device_name(dev));
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+static struct rte_device *
+vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
+		 const void *data)
+{
+	struct rte_vdev_device *dev;
+
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+		if (start && &dev->device == start) {
+			start = NULL;
+			continue;
+		}
+		if (cmp(&dev->device, data) == 0)
+			return &dev->device;
+	}
+	return NULL;
+}
+
+static int
+vdev_plug(struct rte_device *dev)
+{
+	return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev));
+}
+
+static int
+vdev_unplug(struct rte_device *dev)
+{
+	return rte_vdev_uninit(dev->name);
+}
+
+static struct rte_bus rte_vdev_bus = {
+	.scan = vdev_scan,
+	.probe = vdev_probe,
+	.find_device = vdev_find_device,
+	.plug = vdev_plug,
+	.unplug = vdev_unplug,
+	.parse = vdev_parse,
+};
+
+RTE_REGISTER_BUS(vdev, rte_vdev_bus);
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile
index d551541..1cb4cdb 100644
--- a/drivers/crypto/Makefile
+++ b/drivers/crypto/Makefile
@@ -32,6 +32,7 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_cryptodev
+core-libs += librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += aesni_gcm
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_MB) += aesni_mb
diff --git a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
index 1d18217..88554c3 100644
--- a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
+++ b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
@@ -35,7 +35,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 #include <rte_byteorder.h>
diff --git a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
index a589557..7004389 100644
--- a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
+++ b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
@@ -36,7 +36,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 
diff --git a/drivers/crypto/armv8/rte_armv8_pmd.c b/drivers/crypto/armv8/rte_armv8_pmd.c
index 2d2f3ff..97719f2 100644
--- a/drivers/crypto/armv8/rte_armv8_pmd.c
+++ b/drivers/crypto/armv8/rte_armv8_pmd.c
@@ -36,7 +36,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 
diff --git a/drivers/crypto/kasumi/rte_kasumi_pmd.c b/drivers/crypto/kasumi/rte_kasumi_pmd.c
index 7c1b56b..e76821d 100644
--- a/drivers/crypto/kasumi/rte_kasumi_pmd.c
+++ b/drivers/crypto/kasumi/rte_kasumi_pmd.c
@@ -35,7 +35,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 
diff --git a/drivers/crypto/mrvl/rte_mrvl_pmd.c b/drivers/crypto/mrvl/rte_mrvl_pmd.c
index 63895c5..1f09d7d 100644
--- a/drivers/crypto/mrvl/rte_mrvl_pmd.c
+++ b/drivers/crypto/mrvl/rte_mrvl_pmd.c
@@ -36,7 +36,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 
diff --git a/drivers/crypto/null/null_crypto_pmd.c b/drivers/crypto/null/null_crypto_pmd.c
index 4b9a58a..62a2802 100644
--- a/drivers/crypto/null/null_crypto_pmd.c
+++ b/drivers/crypto/null/null_crypto_pmd.c
@@ -33,7 +33,7 @@
 #include <rte_common.h>
 #include <rte_config.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 
 #include "null_crypto_pmd_private.h"
diff --git a/drivers/crypto/openssl/rte_openssl_pmd.c b/drivers/crypto/openssl/rte_openssl_pmd.c
index 25c1154..06e1a6d 100644
--- a/drivers/crypto/openssl/rte_openssl_pmd.c
+++ b/drivers/crypto/openssl/rte_openssl_pmd.c
@@ -34,7 +34,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 
diff --git a/drivers/crypto/scheduler/scheduler_pmd.c b/drivers/crypto/scheduler/scheduler_pmd.c
index 40ab304..acdf636 100644
--- a/drivers/crypto/scheduler/scheduler_pmd.c
+++ b/drivers/crypto/scheduler/scheduler_pmd.c
@@ -33,7 +33,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 #include <rte_reorder.h>
diff --git a/drivers/crypto/snow3g/rte_snow3g_pmd.c b/drivers/crypto/snow3g/rte_snow3g_pmd.c
index fe7bb86..2738b2c 100644
--- a/drivers/crypto/snow3g/rte_snow3g_pmd.c
+++ b/drivers/crypto/snow3g/rte_snow3g_pmd.c
@@ -35,7 +35,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 
diff --git a/drivers/crypto/zuc/rte_zuc_pmd.c b/drivers/crypto/zuc/rte_zuc_pmd.c
index b99f6ec..1f4ca7b 100644
--- a/drivers/crypto/zuc/rte_zuc_pmd.c
+++ b/drivers/crypto/zuc/rte_zuc_pmd.c
@@ -35,7 +35,7 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
 
diff --git a/drivers/event/Makefile b/drivers/event/Makefile
index 05dec1b..9c9ae82 100644
--- a/drivers/event/Makefile
+++ b/drivers/event/Makefile
@@ -31,7 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
-core-libs := librte_eal librte_ether librte_eventdev
+core-libs := librte_eal librte_ether librte_eventdev librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += skeleton
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw
diff --git a/drivers/event/dpaa2/dpaa2_eventdev.c b/drivers/event/dpaa2/dpaa2_eventdev.c
index 45e2ebc..c293087 100644
--- a/drivers/event/dpaa2/dpaa2_eventdev.c
+++ b/drivers/event/dpaa2/dpaa2_eventdev.c
@@ -52,7 +52,7 @@
 #include <rte_memory.h>
 #include <rte_memzone.h>
 #include <rte_pci.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_ethdev.h>
 #include <rte_event_eth_rx_adapter.h>
 
diff --git a/drivers/event/octeontx/ssovf_evdev.c b/drivers/event/octeontx/ssovf_evdev.c
index cfbd958..7606b60 100644
--- a/drivers/event/octeontx/ssovf_evdev.c
+++ b/drivers/event/octeontx/ssovf_evdev.c
@@ -43,7 +43,7 @@
 #include <rte_malloc.h>
 #include <rte_memory.h>
 #include <rte_memzone.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 #include "ssovf_evdev.h"
 
diff --git a/drivers/event/skeleton/skeleton_eventdev.c b/drivers/event/skeleton/skeleton_eventdev.c
index 4d1a1da..70bb186 100644
--- a/drivers/event/skeleton/skeleton_eventdev.c
+++ b/drivers/event/skeleton/skeleton_eventdev.c
@@ -47,7 +47,7 @@
 #include <rte_memory.h>
 #include <rte_memzone.h>
 #include <rte_lcore.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 #include "skeleton_eventdev.h"
 
diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c
index 178f169..0b54afa 100644
--- a/drivers/event/sw/sw_evdev.c
+++ b/drivers/event/sw/sw_evdev.c
@@ -33,7 +33,7 @@
 #include <inttypes.h>
 #include <string.h>
 
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_memzone.h>
 #include <rte_kvargs.h>
 #include <rte_ring.h>
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index cf33233..00be153 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -37,7 +37,7 @@ ifeq ($(CONFIG_RTE_LIBRTE_THUNDERX_NICVF_PMD),d)
 endif
 
 core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_ether
-core-libs += librte_net librte_kvargs
+core-libs += librte_net librte_kvargs librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet
 DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index 28e6a94..fa84eb9 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -41,7 +41,7 @@
 #include <rte_ethdev_vdev.h>
 #include <rte_malloc.h>
 #include <rte_kvargs.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 #include <linux/if_ether.h>
 #include <linux/if_packet.h>
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index 8c602f8..980e636 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -37,7 +37,7 @@
 #include <rte_malloc.h>
 #include <rte_ethdev.h>
 #include <rte_tcp.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_kvargs.h>
 
 #include "rte_eth_bond.h"
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index af33529..9f66dfc 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -43,7 +43,7 @@
 #include <rte_ip_frag.h>
 #include <rte_devargs.h>
 #include <rte_kvargs.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_alarm.h>
 #include <rte_cycles.h>
 
diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c
index 6006bef..6bc5aba 100644
--- a/drivers/net/failsafe/failsafe.c
+++ b/drivers/net/failsafe/failsafe.c
@@ -37,7 +37,7 @@
 #include <rte_ethdev_vdev.h>
 #include <rte_devargs.h>
 #include <rte_kvargs.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 #include "failsafe_private.h"
 
diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c
index d68ff7a..36e90fd 100644
--- a/drivers/net/kni/rte_eth_kni.c
+++ b/drivers/net/kni/rte_eth_kni.c
@@ -40,7 +40,7 @@
 #include <rte_kni.h>
 #include <rte_kvargs.h>
 #include <rte_malloc.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 /* Only single queue supported */
 #define KNI_MAX_QUEUE_PER_PORT 1
diff --git a/drivers/net/mrvl/mrvl_ethdev.c b/drivers/net/mrvl/mrvl_ethdev.c
index 03d9fec..c60ee37 100644
--- a/drivers/net/mrvl/mrvl_ethdev.c
+++ b/drivers/net/mrvl/mrvl_ethdev.c
@@ -36,7 +36,7 @@
 #include <rte_kvargs.h>
 #include <rte_log.h>
 #include <rte_malloc.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 /* Unluckily, container_of is defined by both DPDK and MUSDK,
  * we'll declare only one version.
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c
index 3433c9c..032c30e 100644
--- a/drivers/net/null/rte_eth_null.c
+++ b/drivers/net/null/rte_eth_null.c
@@ -36,7 +36,7 @@
 #include <rte_ethdev_vdev.h>
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_kvargs.h>
 #include <rte_spinlock.h>
 
diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c
index 86de5d1..bd24ec3 100644
--- a/drivers/net/octeontx/octeontx_ethdev.c
+++ b/drivers/net/octeontx/octeontx_ethdev.c
@@ -44,7 +44,7 @@
 #include <rte_kvargs.h>
 #include <rte_malloc.h>
 #include <rte_prefetch.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 #include "octeontx_ethdev.h"
 #include "octeontx_rxtx.h"
diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index 3205df8..f683d3a 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -44,7 +44,7 @@
 #include <rte_kvargs.h>
 #include <rte_malloc.h>
 #include <rte_mbuf.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 #define RTE_ETH_PCAP_SNAPSHOT_LEN 65535
 #define RTE_ETH_PCAP_SNAPLEN ETHER_MAX_JUMBO_FRAME_LEN
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index d82d207..cdc3cc1 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -38,7 +38,7 @@
 #include <rte_memcpy.h>
 #include <rte_memzone.h>
 #include <rte_string_fns.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_kvargs.h>
 #include <rte_errno.h>
 
diff --git a/drivers/net/softnic/rte_eth_softnic.c b/drivers/net/softnic/rte_eth_softnic.c
index abb617a..3e47c2f 100644
--- a/drivers/net/softnic/rte_eth_softnic.c
+++ b/drivers/net/softnic/rte_eth_softnic.c
@@ -38,7 +38,7 @@
 #include <rte_ethdev.h>
 #include <rte_ethdev_vdev.h>
 #include <rte_malloc.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_kvargs.h>
 #include <rte_errno.h>
 #include <rte_ring.h>
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index 64dd3b0..6b27679 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -39,7 +39,7 @@
 #include <rte_ethdev.h>
 #include <rte_ethdev_vdev.h>
 #include <rte_malloc.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_kvargs.h>
 #include <rte_net.h>
 #include <rte_debug.h>
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index f98c980..53f61f0 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -39,7 +39,7 @@
 #include <rte_ethdev_vdev.h>
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_kvargs.h>
 #include <rte_vhost.h>
 #include <rte_spinlock.h>
diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
index 0cfa27b..7be57ce 100644
--- a/drivers/net/virtio/virtio_user_ethdev.c
+++ b/drivers/net/virtio/virtio_user_ethdev.c
@@ -40,7 +40,7 @@
 #include <rte_malloc.h>
 #include <rte_kvargs.h>
 #include <rte_ethdev_vdev.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_alarm.h>
 
 #include "virtio_ethdev.h"
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 934c12b..5d9ace9 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,7 +48,7 @@ LDLIBS += -lgcc_s
 
 EXPORT_MAP := ../../rte_eal_version.map
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 # specific to bsdapp exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c
@@ -67,7 +67,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_launch.c
-SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memory.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_tailqs.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_errno.c
diff --git a/lib/librte_eal/common/.eal_common_dev.c.swp b/lib/librte_eal/common/.eal_common_dev.c.swp
new file mode 100644
index 0000000000000000000000000000000000000000..86626d122c3c6ce6980bc1ff0419c99ff5647222
GIT binary patch
literal 16384
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
Nz%;1^3>J<{{{d!`pU?mR

literal 0
HcmV?d00001

diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 16a2f26..9effd0d 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -39,7 +39,7 @@ INC += rte_per_lcore.h rte_random.h
 INC += rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_version.h
 INC += rte_eal_memconfig.h rte_malloc_heap.h
-INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h rte_vdev.h
+INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h
 INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
 INC += rte_malloc.h rte_keepalive.h rte_time.h
 INC += rte_service.h rte_service_component.h
diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c
deleted file mode 100644
index f7e547a..0000000
--- a/lib/librte_eal/common/eal_common_vdev.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 RehiveTech. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of RehiveTech nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <sys/queue.h>
-
-#include <rte_eal.h>
-#include <rte_dev.h>
-#include <rte_bus.h>
-#include <rte_vdev.h>
-#include <rte_common.h>
-#include <rte_devargs.h>
-#include <rte_memory.h>
-#include <rte_errno.h>
-
-/* Forward declare to access virtual bus name */
-static struct rte_bus rte_vdev_bus;
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(vdev_device_list, rte_vdev_device);
-
-static struct vdev_device_list vdev_device_list =
-	TAILQ_HEAD_INITIALIZER(vdev_device_list);
-struct vdev_driver_list vdev_driver_list =
-	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
-
-/* register a driver */
-void
-rte_vdev_register(struct rte_vdev_driver *driver)
-{
-	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
-}
-
-/* unregister a driver */
-void
-rte_vdev_unregister(struct rte_vdev_driver *driver)
-{
-	TAILQ_REMOVE(&vdev_driver_list, driver, next);
-}
-
-static int
-vdev_parse(const char *name, void *addr)
-{
-	struct rte_vdev_driver **out = addr;
-	struct rte_vdev_driver *driver = NULL;
-
-	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
-		if (strncmp(driver->driver.name, name,
-			    strlen(driver->driver.name)) == 0)
-			break;
-		if (driver->driver.alias &&
-		    strncmp(driver->driver.alias, name,
-			    strlen(driver->driver.alias)) == 0)
-			break;
-	}
-	if (driver != NULL &&
-	    addr != NULL)
-		*out = driver;
-	return driver == NULL;
-}
-
-static int
-vdev_probe_all_drivers(struct rte_vdev_device *dev)
-{
-	const char *name;
-	struct rte_vdev_driver *driver;
-	int ret;
-
-	name = rte_vdev_device_name(dev);
-
-	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
-		rte_vdev_device_name(dev));
-
-	if (vdev_parse(name, &driver))
-		return -1;
-	dev->device.driver = &driver->driver;
-	ret = driver->probe(dev);
-	if (ret)
-		dev->device.driver = NULL;
-	return ret;
-}
-
-static struct rte_vdev_device *
-find_vdev(const char *name)
-{
-	struct rte_vdev_device *dev;
-
-	if (!name)
-		return NULL;
-
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-		const char *devname = rte_vdev_device_name(dev);
-		if (!strncmp(devname, name, strlen(name)))
-			return dev;
-	}
-
-	return NULL;
-}
-
-static struct rte_devargs *
-alloc_devargs(const char *name, const char *args)
-{
-	struct rte_devargs *devargs;
-	int ret;
-
-	devargs = calloc(1, sizeof(*devargs));
-	if (!devargs)
-		return NULL;
-
-	devargs->bus = &rte_vdev_bus;
-	if (args)
-		devargs->args = strdup(args);
-	else
-		devargs->args = strdup("");
-
-	ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name);
-	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
-		free(devargs->args);
-		free(devargs);
-		return NULL;
-	}
-
-	return devargs;
-}
-
-int
-rte_vdev_init(const char *name, const char *args)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-	int ret;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	dev = find_vdev(name);
-	if (dev)
-		return -EEXIST;
-
-	devargs = alloc_devargs(name, args);
-	if (!devargs)
-		return -ENOMEM;
-
-	dev = calloc(1, sizeof(*dev));
-	if (!dev) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
-	dev->device.devargs = devargs;
-	dev->device.numa_node = SOCKET_ID_ANY;
-	dev->device.name = devargs->name;
-
-	ret = vdev_probe_all_drivers(dev);
-	if (ret) {
-		if (ret > 0)
-			RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
-		goto fail;
-	}
-
-	TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
-
-	TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
-	return 0;
-
-fail:
-	free(devargs->args);
-	free(devargs);
-	free(dev);
-	return ret;
-}
-
-static int
-vdev_remove_driver(struct rte_vdev_device *dev)
-{
-	const char *name = rte_vdev_device_name(dev);
-	const struct rte_vdev_driver *driver;
-
-	if (!dev->device.driver) {
-		RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name);
-		return 1;
-	}
-
-	driver = container_of(dev->device.driver, const struct rte_vdev_driver,
-		driver);
-	return driver->remove(dev);
-}
-
-int
-rte_vdev_uninit(const char *name)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-	int ret;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	dev = find_vdev(name);
-	if (!dev)
-		return -ENOENT;
-
-	devargs = dev->device.devargs;
-
-	ret = vdev_remove_driver(dev);
-	if (ret)
-		return ret;
-
-	TAILQ_REMOVE(&vdev_device_list, dev, next);
-
-	TAILQ_REMOVE(&devargs_list, devargs, next);
-
-	free(devargs->args);
-	free(devargs);
-	free(dev);
-	return 0;
-}
-
-static int
-vdev_scan(void)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-
-	/* for virtual devices we scan the devargs_list populated via cmdline */
-	TAILQ_FOREACH(devargs, &devargs_list, next) {
-
-		if (devargs->bus != &rte_vdev_bus)
-			continue;
-
-		dev = find_vdev(devargs->name);
-		if (dev)
-			continue;
-
-		dev = calloc(1, sizeof(*dev));
-		if (!dev)
-			return -1;
-
-		dev->device.devargs = devargs;
-		dev->device.numa_node = SOCKET_ID_ANY;
-		dev->device.name = devargs->name;
-
-		TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
-	}
-
-	return 0;
-}
-
-static int
-vdev_probe(void)
-{
-	struct rte_vdev_device *dev;
-
-	/* call the init function for each virtual device */
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-
-		if (dev->device.driver)
-			continue;
-
-		if (vdev_probe_all_drivers(dev)) {
-			RTE_LOG(ERR, EAL, "failed to initialize %s device\n",
-				rte_vdev_device_name(dev));
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static struct rte_device *
-vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
-		 const void *data)
-{
-	struct rte_vdev_device *dev;
-
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-		if (start && &dev->device == start) {
-			start = NULL;
-			continue;
-		}
-		if (cmp(&dev->device, data) == 0)
-			return &dev->device;
-	}
-	return NULL;
-}
-
-static int
-vdev_plug(struct rte_device *dev)
-{
-	return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev));
-}
-
-static int
-vdev_unplug(struct rte_device *dev)
-{
-	return rte_vdev_uninit(dev->name);
-}
-
-static struct rte_bus rte_vdev_bus = {
-	.scan = vdev_scan,
-	.probe = vdev_probe,
-	.find_device = vdev_find_device,
-	.plug = vdev_plug,
-	.unplug = vdev_unplug,
-	.parse = vdev_parse,
-};
-
-RTE_REGISTER_BUS(vdev, rte_vdev_bus);
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index 4c4ac7e..8088dcc 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -170,28 +170,6 @@ struct rte_device {
 };
 
 /**
- * Initialize a driver specified by name.
- *
- * @param name
- *   The pointer to a driver name to be initialized.
- * @param args
- *   The pointer to arguments used by driver initialization.
- * @return
- *  0 on success, negative on error
- */
-int rte_vdev_init(const char *name, const char *args);
-
-/**
- * Uninitalize a driver specified by name.
- *
- * @param name
- *   The pointer to a driver name to be initialized.
- * @return
- *  0 on success, negative on error
- */
-int rte_vdev_uninit(const char *name);
-
-/**
  * Attach a device to a registered driver.
  *
  * @param name
@@ -316,4 +294,4 @@ __attribute__((used)) = str
 }
 #endif
 
-#endif /* _RTE_VDEV_H_ */
+#endif /* _RTE_DEV_H_ */
diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h
deleted file mode 100644
index 29f5a52..0000000
--- a/lib/librte_eal/common/include/rte_vdev.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 RehiveTech. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of RehiveTech nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef RTE_VDEV_H
-#define RTE_VDEV_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/queue.h>
-#include <rte_dev.h>
-#include <rte_devargs.h>
-
-struct rte_vdev_device {
-	TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
-	struct rte_device device;               /**< Inherit core device */
-};
-
-/**
- * @internal
- * Helper macro for drivers that need to convert to struct rte_vdev_device.
- */
-#define RTE_DEV_TO_VDEV(ptr) \
-	container_of(ptr, struct rte_vdev_device, device)
-
-static inline const char *
-rte_vdev_device_name(const struct rte_vdev_device *dev)
-{
-	if (dev && dev->device.name)
-		return dev->device.name;
-	return NULL;
-}
-
-static inline const char *
-rte_vdev_device_args(const struct rte_vdev_device *dev)
-{
-	if (dev && dev->device.devargs)
-		return dev->device.devargs->args;
-	return "";
-}
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
-
-/**
- * Probe function called for each virtual device driver once.
- */
-typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
-
-/**
- * Remove function called for each virtual device driver once.
- */
-typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
-
-/**
- * A virtual device driver abstraction.
- */
-struct rte_vdev_driver {
-	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
-	struct rte_driver driver;      /**< Inherited general driver. */
-	rte_vdev_probe_t *probe;       /**< Virtual device probe function. */
-	rte_vdev_remove_t *remove;     /**< Virtual device remove function. */
-};
-
-/**
- * Register a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev_driver structure describing the driver
- *   to be registered.
- */
-void rte_vdev_register(struct rte_vdev_driver *driver);
-
-/**
- * Unregister a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev_driver structure describing the driver
- *   to be unregistered.
- */
-void rte_vdev_unregister(struct rte_vdev_driver *driver);
-
-#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
-RTE_INIT(vdrvinitfn_ ##vdrv);\
-static const char *vdrvinit_ ## nm ## _alias;\
-static void vdrvinitfn_ ##vdrv(void)\
-{\
-	(vdrv).driver.name = RTE_STR(nm);\
-	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
-	rte_vdev_register(&vdrv);\
-} \
-RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
-
-#define RTE_PMD_REGISTER_ALIAS(nm, alias)\
-static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 1d3a42d..2975c25c 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -37,7 +37,7 @@ ARCH_DIR ?= $(RTE_ARCH)
 EXPORT_MAP := ../../rte_eal_version.map
 VPATH += $(RTE_SDK)/lib/librte_eal/common/arch/$(ARCH_DIR)
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
@@ -74,7 +74,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_launch.c
-SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memory.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_tailqs.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_errno.c
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index d2a4ff9..5966a03 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -166,10 +166,6 @@ DPDK_17.05 {
 	rte_log_set_global_level;
 	rte_log_set_level;
 	rte_log_set_level_regexp;
-	rte_vdev_init;
-	rte_vdev_register;
-	rte_vdev_uninit;
-	rte_vdev_unregister;
 	vfio_get_container_fd;
 	vfio_get_group_fd;
 	vfio_get_group_no;
diff --git a/lib/librte_ether/rte_ethdev_vdev.h b/lib/librte_ether/rte_ethdev_vdev.h
index 4d2c3e2..ff92e6e 100644
--- a/lib/librte_ether/rte_ethdev_vdev.h
+++ b/lib/librte_ether/rte_ethdev_vdev.h
@@ -35,7 +35,7 @@
 #define _RTE_ETHDEV_VDEV_H_
 
 #include <rte_malloc.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 #include <rte_ethdev.h>
 
 /**
diff --git a/lib/librte_eventdev/rte_eventdev_pmd_vdev.h b/lib/librte_eventdev/rte_eventdev_pmd_vdev.h
index 135e8b8..56232de 100644
--- a/lib/librte_eventdev/rte_eventdev_pmd_vdev.h
+++ b/lib/librte_eventdev/rte_eventdev_pmd_vdev.h
@@ -48,7 +48,7 @@ extern "C" {
 
 #include <rte_debug.h>
 #include <rte_eal.h>
-#include <rte_vdev.h>
+#include <rte_bus_vdev.h>
 
 #include "rte_eventdev_pmd.h"
 
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 047121d..de2f557 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -101,6 +101,7 @@ _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING)   += -lrte_mempool_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_RING)           += -lrte_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_PCI)            += -lrte_pci
 _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lrte_eal
+_LDLIBS-$(CONFIG_RTE_LIBRTE_VDEV_BUS)       += -lrte_bus_vdev
 _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE)        += -lrte_cmdline
 _LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER)        += -lrte_reorder
 _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED)          += -lrte_sched
diff --git a/test/test/autotest_data.pyc b/test/test/autotest_data.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e2e917de5c2ffd5315f7d32c484f4fa4659a25a6
GIT binary patch
literal 6122
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
HXUD$-S%8l+

literal 0
HcmV?d00001

diff --git a/test/test/autotest_test_funcs.pyc b/test/test/autotest_test_funcs.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..794b45b4e9a79cc3ddbd08d5031d78e4c7a2387a
GIT binary patch
literal 6812
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
C_uuIN

literal 0
HcmV?d00001

diff --git a/test/test/test_cryptodev.c b/test/test/test_cryptodev.c
index 72988c5..a83b361 100644
--- a/test/test/test_cryptodev.c
+++ b/test/test/test_cryptodev.c
@@ -36,6 +36,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_pause.h>
+#include <rte_bus_vdev.h>
 
 #include <rte_crypto.h>
 #include <rte_cryptodev.h>
diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
index 56ed1f8..90a5c64 100644
--- a/test/test/test_event_eth_rx_adapter.c
+++ b/test/test/test_event_eth_rx_adapter.c
@@ -35,6 +35,7 @@
 #include <rte_mbuf.h>
 #include <rte_ethdev.h>
 #include <rte_eventdev.h>
+#include <rte_bus_vdev.h>
 
 #include <rte_event_eth_rx_adapter.h>
 
diff --git a/test/test/test_eventdev.c b/test/test/test_eventdev.c
index 4118b75..ba39cba 100644
--- a/test/test/test_eventdev.c
+++ b/test/test/test_eventdev.c
@@ -37,6 +37,7 @@
 #include <rte_memcpy.h>
 #include <rte_eventdev.h>
 #include <rte_dev.h>
+#include <rte_bus_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_eventdev_octeontx.c b/test/test/test_eventdev_octeontx.c
index b88b0d2..dbc36d9 100644
--- a/test/test/test_eventdev_octeontx.c
+++ b/test/test/test_eventdev_octeontx.c
@@ -45,6 +45,7 @@
 #include <rte_lcore.h>
 #include <rte_per_lcore.h>
 #include <rte_random.h>
+#include <rte_bus_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_eventdev_sw.c b/test/test/test_eventdev_sw.c
index 5c7751b..f6a3fa3 100644
--- a/test/test/test_eventdev_sw.c
+++ b/test/test/test_eventdev_sw.c
@@ -51,6 +51,7 @@
 #include <rte_pause.h>
 #include <rte_service.h>
 #include <rte_service_component.h>
+#include <rte_bus_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_link_bonding_rssconf.c b/test/test/test_link_bonding_rssconf.c
index 7dccc6e..54cbf12 100644
--- a/test/test/test_link_bonding_rssconf.c
+++ b/test/test/test_link_bonding_rssconf.c
@@ -48,6 +48,7 @@
 #include <rte_log.h>
 #include <rte_lcore.h>
 #include <rte_memory.h>
+#include <rte_bus_vdev.h>
 
 #include <rte_string_fns.h>
 #include <rte_errno.h>
-- 
2.7.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v11 1/4] cryptodev: remove crypto vdev init API
  @ 2017-10-30  8:28  4%   ` Jianfeng Tan
  2017-10-30  8:28  1%   ` [dpdk-dev] [PATCH v11 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-10-30  8:28 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Remove rte_cryptodev_create_vdev() for duplication.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 doc/guides/rel_notes/deprecation.rst           |  5 -----
 doc/guides/rel_notes/release_17_11.rst         |  2 ++
 lib/librte_cryptodev/rte_cryptodev.c           |  6 ------
 lib/librte_cryptodev/rte_cryptodev.h           | 17 -----------------
 lib/librte_cryptodev/rte_cryptodev_version.map |  1 -
 5 files changed, 2 insertions(+), 29 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index a93c3e1..9120121 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -60,10 +60,5 @@ Deprecation Notices
   ``rte_cryptodev`` respectively to support security protocol offloaded
   operations.
 
-* cryptodev: the following function is deprecated starting from 17.08 and will
-  be removed in 17.11:
-
-  - ``rte_cryptodev_create_vdev``
-
 * librte_meter: The API will change to accommodate configuration profiles.
   Most of the API functions will have an additional opaque parameter.
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index b96b236..bab5d73 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -403,6 +403,8 @@ API Changes
   the backing device supports the operation or if the operation was
   successfully performed.
 
+* ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
+  in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
 ABI Changes
 -----------
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index 8063211..973c8db 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -377,12 +377,6 @@ rte_cryptodev_get_feature_name(uint64_t flag)
 	}
 }
 
-int
-rte_cryptodev_create_vdev(const char *name, const char *args)
-{
-	return rte_vdev_init(name, args);
-}
-
 struct rte_cryptodev *
 rte_cryptodev_pmd_get_dev(uint8_t dev_id)
 {
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index a0d3a12..2c1377b 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -435,23 +435,6 @@ struct rte_cryptodev_stats {
 /**< Max length of name of crypto PMD */
 
 /**
- * @deprecated
- *
- * Create a virtual crypto device
- *
- * @param	name	Cryptodev PMD name of device to be created.
- * @param	args	Options arguments for device.
- *
- * @return
- * - On successful creation of the cryptodev the device index is returned,
- *   which will be between 0 and rte_cryptodev_count().
- * - In the case of a failure, returns -1.
- */
-__rte_deprecated
-extern int
-rte_cryptodev_create_vdev(const char *name, const char *args);
-
-/**
  * Get the device identifier for the named crypto device.
  *
  * @param	name	device name to select the device structure.
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index e82296c..eb47308 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -7,7 +7,6 @@ DPDK_16.04 {
 	rte_cryptodev_close;
 	rte_cryptodev_count;
 	rte_cryptodev_configure;
-	rte_cryptodev_create_vdev;
 	rte_cryptodev_get_dev_id;
 	rte_cryptodev_get_feature_name;
 	rte_cryptodev_info_get;
-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v10 3/4] bus/vdev: move to vdev bus to drivers/bus
    2017-10-27  3:23  4%   ` [dpdk-dev] [PATCH v10 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
@ 2017-10-27  3:23  1%   ` Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-10-27  3:23 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Move the vdev bus from lib/librte_eal to drivers/bus.

As the crypto vdev helper function refers to data structure
in rte_vdev.h, so we move those helper function into drivers/bus
too.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 config/common_base                        |   5 +
 doc/guides/rel_notes/release_17_11.rst    |   8 +
 drivers/bus/Makefile                      |   4 +-
 drivers/bus/vdev/Makefile                 |  57 +++++
 drivers/bus/vdev/rte_bus_vdev_version.map |   8 +
 drivers/bus/vdev/rte_vdev.h               | 153 +++++++++++++
 drivers/bus/vdev/vdev.c                   | 344 ++++++++++++++++++++++++++++++
 drivers/crypto/Makefile                   |   1 +
 drivers/event/Makefile                    |   2 +-
 drivers/net/Makefile                      |   2 +-
 lib/librte_eal/bsdapp/eal/Makefile        |   3 +-
 lib/librte_eal/common/Makefile            |   2 +-
 lib/librte_eal/common/eal_common_vdev.c   | 342 -----------------------------
 lib/librte_eal/common/include/rte_dev.h   |  24 +--
 lib/librte_eal/common/include/rte_vdev.h  | 131 ------------
 lib/librte_eal/linuxapp/eal/Makefile      |   3 +-
 lib/librte_eal/rte_eal_version.map        |   4 -
 mk/rte.app.mk                             |   1 +
 test/test/test_cryptodev.c                |   1 +
 test/test/test_event_eth_rx_adapter.c     |   1 +
 test/test/test_eventdev.c                 |   1 +
 test/test/test_eventdev_octeontx.c        |   1 +
 test/test/test_eventdev_sw.c              |   1 +
 test/test/test_link_bonding_rssconf.c     |   1 +
 24 files changed, 591 insertions(+), 509 deletions(-)
 create mode 100644 drivers/bus/vdev/Makefile
 create mode 100644 drivers/bus/vdev/rte_bus_vdev_version.map
 create mode 100644 drivers/bus/vdev/rte_vdev.h
 create mode 100644 drivers/bus/vdev/vdev.c
 delete mode 100644 lib/librte_eal/common/eal_common_vdev.c
 delete mode 100644 lib/librte_eal/common/include/rte_vdev.h

diff --git a/config/common_base b/config/common_base
index 82ee754..d39e657 100644
--- a/config/common_base
+++ b/config/common_base
@@ -814,3 +814,8 @@ CONFIG_RTE_APP_CRYPTO_PERF=y
 # Compile the eventdev application
 #
 CONFIG_RTE_APP_EVENTDEV=y
+
+#
+# Compile the vdev bus
+#
+CONFIG_RTE_LIBRTE_VDEV_BUS=y
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index bab5d73..08b1c3d 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -406,6 +406,13 @@ API Changes
 * ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
   in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
+* **Moved the following APIs from eal library to bus_vdev library**
+
+  * ``rte_vdev_init``
+  * ``rte_vdev_register``
+  * ``rte_vdev_uninit``
+  * ``rte_vdev_unregister``
+
 ABI Changes
 -----------
 
@@ -461,6 +468,7 @@ The libraries prepended with a plus sign were incremented in this version.
 
      librte_acl.so.2
    + librte_bitratestats.so.2
+   + librte_bus_vdev.so.1
      librte_cfgfile.so.2
      librte_cmdline.so.2
    + librte_cryptodev.so.4
diff --git a/drivers/bus/Makefile b/drivers/bus/Makefile
index a220d27..6c7e203 100644
--- a/drivers/bus/Makefile
+++ b/drivers/bus/Makefile
@@ -30,12 +30,12 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
-core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_ether
-
 DIRS-$(CONFIG_RTE_LIBRTE_DPAA_BUS) += dpaa
 
 DIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc
 
 DIRS-$(CONFIG_RTE_LIBRTE_PCI_BUS) += pci
 
+DIRS-$(CONFIG_RTE_LIBRTE_VDEV_BUS) += vdev
+
 include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile
new file mode 100644
index 0000000..fe31654
--- /dev/null
+++ b/drivers/bus/vdev/Makefile
@@ -0,0 +1,57 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_bus_vdev.a
+
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+# versioning export map
+EXPORT_MAP := rte_bus_vdev_version.map
+
+# library version
+LIBABIVER := 1
+
+SRCS-y += vdev.c
+
+LDLIBS += -lrte_eal
+
+#
+# Export include files
+#
+SYMLINK-y-include += rte_vdev.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/bus/vdev/rte_bus_vdev_version.map b/drivers/bus/vdev/rte_bus_vdev_version.map
new file mode 100644
index 0000000..6ccb789
--- /dev/null
+++ b/drivers/bus/vdev/rte_bus_vdev_version.map
@@ -0,0 +1,8 @@
+DPDK_17.11 {
+	global:
+
+	rte_vdev_init;
+	rte_vdev_register;
+	rte_vdev_uninit;
+	rte_vdev_unregister;
+};
diff --git a/drivers/bus/vdev/rte_vdev.h b/drivers/bus/vdev/rte_vdev.h
new file mode 100644
index 0000000..41762b8
--- /dev/null
+++ b/drivers/bus/vdev/rte_vdev.h
@@ -0,0 +1,153 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of RehiveTech nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RTE_VDEV_H
+#define RTE_VDEV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/queue.h>
+#include <rte_dev.h>
+#include <rte_devargs.h>
+
+struct rte_vdev_device {
+	TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
+	struct rte_device device;               /**< Inherit core device */
+};
+
+/**
+ * @internal
+ * Helper macro for drivers that need to convert to struct rte_vdev_device.
+ */
+#define RTE_DEV_TO_VDEV(ptr) \
+	container_of(ptr, struct rte_vdev_device, device)
+
+static inline const char *
+rte_vdev_device_name(const struct rte_vdev_device *dev)
+{
+	if (dev && dev->device.name)
+		return dev->device.name;
+	return NULL;
+}
+
+static inline const char *
+rte_vdev_device_args(const struct rte_vdev_device *dev)
+{
+	if (dev && dev->device.devargs)
+		return dev->device.devargs->args;
+	return "";
+}
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
+
+/**
+ * Probe function called for each virtual device driver once.
+ */
+typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
+
+/**
+ * Remove function called for each virtual device driver once.
+ */
+typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
+
+/**
+ * A virtual device driver abstraction.
+ */
+struct rte_vdev_driver {
+	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
+	struct rte_driver driver;      /**< Inherited general driver. */
+	rte_vdev_probe_t *probe;       /**< Virtual device probe function. */
+	rte_vdev_remove_t *remove;     /**< Virtual device remove function. */
+};
+
+/**
+ * Register a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be registered.
+ */
+void rte_vdev_register(struct rte_vdev_driver *driver);
+
+/**
+ * Unregister a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be unregistered.
+ */
+void rte_vdev_unregister(struct rte_vdev_driver *driver);
+
+#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
+RTE_INIT(vdrvinitfn_ ##vdrv);\
+static const char *vdrvinit_ ## nm ## _alias;\
+static void vdrvinitfn_ ##vdrv(void)\
+{\
+	(vdrv).driver.name = RTE_STR(nm);\
+	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
+	rte_vdev_register(&vdrv);\
+} \
+RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
+
+#define RTE_PMD_REGISTER_ALIAS(nm, alias)\
+static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
+
+/**
+ * Initialize a driver specified by name.
+ *
+ * @param name
+ *   The pointer to a driver name to be initialized.
+ * @param args
+ *   The pointer to arguments used by driver initialization.
+ * @return
+ *  0 on success, negative on error
+ */
+int rte_vdev_init(const char *name, const char *args);
+
+/**
+ * Uninitalize a driver specified by name.
+ *
+ * @param name
+ *   The pointer to a driver name to be initialized.
+ * @return
+ *  0 on success, negative on error
+ */
+int rte_vdev_uninit(const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
new file mode 100644
index 0000000..a16eb71
--- /dev/null
+++ b/drivers/bus/vdev/vdev.c
@@ -0,0 +1,344 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of RehiveTech nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <sys/queue.h>
+
+#include <rte_eal.h>
+#include <rte_dev.h>
+#include <rte_bus.h>
+#include <rte_common.h>
+#include <rte_devargs.h>
+#include <rte_memory.h>
+#include <rte_errno.h>
+
+#include "rte_vdev.h"
+
+/* Forward declare to access virtual bus name */
+static struct rte_bus rte_vdev_bus;
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_device_list, rte_vdev_device);
+
+static struct vdev_device_list vdev_device_list =
+	TAILQ_HEAD_INITIALIZER(vdev_device_list);
+struct vdev_driver_list vdev_driver_list =
+	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
+
+/* register a driver */
+void
+rte_vdev_register(struct rte_vdev_driver *driver)
+{
+	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
+}
+
+/* unregister a driver */
+void
+rte_vdev_unregister(struct rte_vdev_driver *driver)
+{
+	TAILQ_REMOVE(&vdev_driver_list, driver, next);
+}
+
+static int
+vdev_parse(const char *name, void *addr)
+{
+	struct rte_vdev_driver **out = addr;
+	struct rte_vdev_driver *driver = NULL;
+
+	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
+		if (strncmp(driver->driver.name, name,
+			    strlen(driver->driver.name)) == 0)
+			break;
+		if (driver->driver.alias &&
+		    strncmp(driver->driver.alias, name,
+			    strlen(driver->driver.alias)) == 0)
+			break;
+	}
+	if (driver != NULL &&
+	    addr != NULL)
+		*out = driver;
+	return driver == NULL;
+}
+
+static int
+vdev_probe_all_drivers(struct rte_vdev_device *dev)
+{
+	const char *name;
+	struct rte_vdev_driver *driver;
+	int ret;
+
+	name = rte_vdev_device_name(dev);
+
+	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
+		rte_vdev_device_name(dev));
+
+	if (vdev_parse(name, &driver))
+		return -1;
+	dev->device.driver = &driver->driver;
+	ret = driver->probe(dev);
+	if (ret)
+		dev->device.driver = NULL;
+	return ret;
+}
+
+static struct rte_vdev_device *
+find_vdev(const char *name)
+{
+	struct rte_vdev_device *dev;
+
+	if (!name)
+		return NULL;
+
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+		const char *devname = rte_vdev_device_name(dev);
+
+		if (!strncmp(devname, name, strlen(name)))
+			return dev;
+	}
+
+	return NULL;
+}
+
+static struct rte_devargs *
+alloc_devargs(const char *name, const char *args)
+{
+	struct rte_devargs *devargs;
+	int ret;
+
+	devargs = calloc(1, sizeof(*devargs));
+	if (!devargs)
+		return NULL;
+
+	devargs->bus = &rte_vdev_bus;
+	if (args)
+		devargs->args = strdup(args);
+	else
+		devargs->args = strdup("");
+
+	ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name);
+	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
+		free(devargs->args);
+		free(devargs);
+		return NULL;
+	}
+
+	return devargs;
+}
+
+int
+rte_vdev_init(const char *name, const char *args)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+	int ret;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	dev = find_vdev(name);
+	if (dev)
+		return -EEXIST;
+
+	devargs = alloc_devargs(name, args);
+	if (!devargs)
+		return -ENOMEM;
+
+	dev = calloc(1, sizeof(*dev));
+	if (!dev) {
+		ret = -ENOMEM;
+		goto fail;
+	}
+
+	dev->device.devargs = devargs;
+	dev->device.numa_node = SOCKET_ID_ANY;
+	dev->device.name = devargs->name;
+
+	ret = vdev_probe_all_drivers(dev);
+	if (ret) {
+		if (ret > 0)
+			RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
+		goto fail;
+	}
+
+	TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
+
+	TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+	return 0;
+
+fail:
+	free(devargs->args);
+	free(devargs);
+	free(dev);
+	return ret;
+}
+
+static int
+vdev_remove_driver(struct rte_vdev_device *dev)
+{
+	const char *name = rte_vdev_device_name(dev);
+	const struct rte_vdev_driver *driver;
+
+	if (!dev->device.driver) {
+		RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name);
+		return 1;
+	}
+
+	driver = container_of(dev->device.driver, const struct rte_vdev_driver,
+		driver);
+	return driver->remove(dev);
+}
+
+int
+rte_vdev_uninit(const char *name)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+	int ret;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	dev = find_vdev(name);
+	if (!dev)
+		return -ENOENT;
+
+	devargs = dev->device.devargs;
+
+	ret = vdev_remove_driver(dev);
+	if (ret)
+		return ret;
+
+	TAILQ_REMOVE(&vdev_device_list, dev, next);
+
+	TAILQ_REMOVE(&devargs_list, devargs, next);
+
+	free(devargs->args);
+	free(devargs);
+	free(dev);
+	return 0;
+}
+
+static int
+vdev_scan(void)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+
+	/* for virtual devices we scan the devargs_list populated via cmdline */
+	TAILQ_FOREACH(devargs, &devargs_list, next) {
+
+		if (devargs->bus != &rte_vdev_bus)
+			continue;
+
+		dev = find_vdev(devargs->name);
+		if (dev)
+			continue;
+
+		dev = calloc(1, sizeof(*dev));
+		if (!dev)
+			return -1;
+
+		dev->device.devargs = devargs;
+		dev->device.numa_node = SOCKET_ID_ANY;
+		dev->device.name = devargs->name;
+
+		TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+	}
+
+	return 0;
+}
+
+static int
+vdev_probe(void)
+{
+	struct rte_vdev_device *dev;
+
+	/* call the init function for each virtual device */
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+
+		if (dev->device.driver)
+			continue;
+
+		if (vdev_probe_all_drivers(dev)) {
+			RTE_LOG(ERR, EAL, "failed to initialize %s device\n",
+				rte_vdev_device_name(dev));
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+static struct rte_device *
+vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
+		 const void *data)
+{
+	struct rte_vdev_device *dev;
+
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+		if (start && &dev->device == start) {
+			start = NULL;
+			continue;
+		}
+		if (cmp(&dev->device, data) == 0)
+			return &dev->device;
+	}
+	return NULL;
+}
+
+static int
+vdev_plug(struct rte_device *dev)
+{
+	return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev));
+}
+
+static int
+vdev_unplug(struct rte_device *dev)
+{
+	return rte_vdev_uninit(dev->name);
+}
+
+static struct rte_bus rte_vdev_bus = {
+	.scan = vdev_scan,
+	.probe = vdev_probe,
+	.find_device = vdev_find_device,
+	.plug = vdev_plug,
+	.unplug = vdev_unplug,
+	.parse = vdev_parse,
+};
+
+RTE_REGISTER_BUS(vdev, rte_vdev_bus);
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile
index d551541..1cb4cdb 100644
--- a/drivers/crypto/Makefile
+++ b/drivers/crypto/Makefile
@@ -32,6 +32,7 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_cryptodev
+core-libs += librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += aesni_gcm
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_MB) += aesni_mb
diff --git a/drivers/event/Makefile b/drivers/event/Makefile
index 05dec1b..9c9ae82 100644
--- a/drivers/event/Makefile
+++ b/drivers/event/Makefile
@@ -31,7 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
-core-libs := librte_eal librte_ether librte_eventdev
+core-libs := librte_eal librte_ether librte_eventdev librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += skeleton
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index cf33233..00be153 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -37,7 +37,7 @@ ifeq ($(CONFIG_RTE_LIBRTE_THUNDERX_NICVF_PMD),d)
 endif
 
 core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_ether
-core-libs += librte_net librte_kvargs
+core-libs += librte_net librte_kvargs librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet
 DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 934c12b..5d9ace9 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,7 +48,7 @@ LDLIBS += -lgcc_s
 
 EXPORT_MAP := ../../rte_eal_version.map
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 # specific to bsdapp exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c
@@ -67,7 +67,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_launch.c
-SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memory.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_tailqs.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_errno.c
diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 16a2f26..9effd0d 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -39,7 +39,7 @@ INC += rte_per_lcore.h rte_random.h
 INC += rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_version.h
 INC += rte_eal_memconfig.h rte_malloc_heap.h
-INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h rte_vdev.h
+INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h
 INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
 INC += rte_malloc.h rte_keepalive.h rte_time.h
 INC += rte_service.h rte_service_component.h
diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c
deleted file mode 100644
index f7e547a..0000000
--- a/lib/librte_eal/common/eal_common_vdev.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 RehiveTech. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of RehiveTech nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <sys/queue.h>
-
-#include <rte_eal.h>
-#include <rte_dev.h>
-#include <rte_bus.h>
-#include <rte_vdev.h>
-#include <rte_common.h>
-#include <rte_devargs.h>
-#include <rte_memory.h>
-#include <rte_errno.h>
-
-/* Forward declare to access virtual bus name */
-static struct rte_bus rte_vdev_bus;
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(vdev_device_list, rte_vdev_device);
-
-static struct vdev_device_list vdev_device_list =
-	TAILQ_HEAD_INITIALIZER(vdev_device_list);
-struct vdev_driver_list vdev_driver_list =
-	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
-
-/* register a driver */
-void
-rte_vdev_register(struct rte_vdev_driver *driver)
-{
-	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
-}
-
-/* unregister a driver */
-void
-rte_vdev_unregister(struct rte_vdev_driver *driver)
-{
-	TAILQ_REMOVE(&vdev_driver_list, driver, next);
-}
-
-static int
-vdev_parse(const char *name, void *addr)
-{
-	struct rte_vdev_driver **out = addr;
-	struct rte_vdev_driver *driver = NULL;
-
-	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
-		if (strncmp(driver->driver.name, name,
-			    strlen(driver->driver.name)) == 0)
-			break;
-		if (driver->driver.alias &&
-		    strncmp(driver->driver.alias, name,
-			    strlen(driver->driver.alias)) == 0)
-			break;
-	}
-	if (driver != NULL &&
-	    addr != NULL)
-		*out = driver;
-	return driver == NULL;
-}
-
-static int
-vdev_probe_all_drivers(struct rte_vdev_device *dev)
-{
-	const char *name;
-	struct rte_vdev_driver *driver;
-	int ret;
-
-	name = rte_vdev_device_name(dev);
-
-	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
-		rte_vdev_device_name(dev));
-
-	if (vdev_parse(name, &driver))
-		return -1;
-	dev->device.driver = &driver->driver;
-	ret = driver->probe(dev);
-	if (ret)
-		dev->device.driver = NULL;
-	return ret;
-}
-
-static struct rte_vdev_device *
-find_vdev(const char *name)
-{
-	struct rte_vdev_device *dev;
-
-	if (!name)
-		return NULL;
-
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-		const char *devname = rte_vdev_device_name(dev);
-		if (!strncmp(devname, name, strlen(name)))
-			return dev;
-	}
-
-	return NULL;
-}
-
-static struct rte_devargs *
-alloc_devargs(const char *name, const char *args)
-{
-	struct rte_devargs *devargs;
-	int ret;
-
-	devargs = calloc(1, sizeof(*devargs));
-	if (!devargs)
-		return NULL;
-
-	devargs->bus = &rte_vdev_bus;
-	if (args)
-		devargs->args = strdup(args);
-	else
-		devargs->args = strdup("");
-
-	ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name);
-	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
-		free(devargs->args);
-		free(devargs);
-		return NULL;
-	}
-
-	return devargs;
-}
-
-int
-rte_vdev_init(const char *name, const char *args)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-	int ret;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	dev = find_vdev(name);
-	if (dev)
-		return -EEXIST;
-
-	devargs = alloc_devargs(name, args);
-	if (!devargs)
-		return -ENOMEM;
-
-	dev = calloc(1, sizeof(*dev));
-	if (!dev) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
-	dev->device.devargs = devargs;
-	dev->device.numa_node = SOCKET_ID_ANY;
-	dev->device.name = devargs->name;
-
-	ret = vdev_probe_all_drivers(dev);
-	if (ret) {
-		if (ret > 0)
-			RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
-		goto fail;
-	}
-
-	TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
-
-	TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
-	return 0;
-
-fail:
-	free(devargs->args);
-	free(devargs);
-	free(dev);
-	return ret;
-}
-
-static int
-vdev_remove_driver(struct rte_vdev_device *dev)
-{
-	const char *name = rte_vdev_device_name(dev);
-	const struct rte_vdev_driver *driver;
-
-	if (!dev->device.driver) {
-		RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name);
-		return 1;
-	}
-
-	driver = container_of(dev->device.driver, const struct rte_vdev_driver,
-		driver);
-	return driver->remove(dev);
-}
-
-int
-rte_vdev_uninit(const char *name)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-	int ret;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	dev = find_vdev(name);
-	if (!dev)
-		return -ENOENT;
-
-	devargs = dev->device.devargs;
-
-	ret = vdev_remove_driver(dev);
-	if (ret)
-		return ret;
-
-	TAILQ_REMOVE(&vdev_device_list, dev, next);
-
-	TAILQ_REMOVE(&devargs_list, devargs, next);
-
-	free(devargs->args);
-	free(devargs);
-	free(dev);
-	return 0;
-}
-
-static int
-vdev_scan(void)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-
-	/* for virtual devices we scan the devargs_list populated via cmdline */
-	TAILQ_FOREACH(devargs, &devargs_list, next) {
-
-		if (devargs->bus != &rte_vdev_bus)
-			continue;
-
-		dev = find_vdev(devargs->name);
-		if (dev)
-			continue;
-
-		dev = calloc(1, sizeof(*dev));
-		if (!dev)
-			return -1;
-
-		dev->device.devargs = devargs;
-		dev->device.numa_node = SOCKET_ID_ANY;
-		dev->device.name = devargs->name;
-
-		TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
-	}
-
-	return 0;
-}
-
-static int
-vdev_probe(void)
-{
-	struct rte_vdev_device *dev;
-
-	/* call the init function for each virtual device */
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-
-		if (dev->device.driver)
-			continue;
-
-		if (vdev_probe_all_drivers(dev)) {
-			RTE_LOG(ERR, EAL, "failed to initialize %s device\n",
-				rte_vdev_device_name(dev));
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static struct rte_device *
-vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
-		 const void *data)
-{
-	struct rte_vdev_device *dev;
-
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-		if (start && &dev->device == start) {
-			start = NULL;
-			continue;
-		}
-		if (cmp(&dev->device, data) == 0)
-			return &dev->device;
-	}
-	return NULL;
-}
-
-static int
-vdev_plug(struct rte_device *dev)
-{
-	return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev));
-}
-
-static int
-vdev_unplug(struct rte_device *dev)
-{
-	return rte_vdev_uninit(dev->name);
-}
-
-static struct rte_bus rte_vdev_bus = {
-	.scan = vdev_scan,
-	.probe = vdev_probe,
-	.find_device = vdev_find_device,
-	.plug = vdev_plug,
-	.unplug = vdev_unplug,
-	.parse = vdev_parse,
-};
-
-RTE_REGISTER_BUS(vdev, rte_vdev_bus);
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index 4c4ac7e..8088dcc 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -170,28 +170,6 @@ struct rte_device {
 };
 
 /**
- * Initialize a driver specified by name.
- *
- * @param name
- *   The pointer to a driver name to be initialized.
- * @param args
- *   The pointer to arguments used by driver initialization.
- * @return
- *  0 on success, negative on error
- */
-int rte_vdev_init(const char *name, const char *args);
-
-/**
- * Uninitalize a driver specified by name.
- *
- * @param name
- *   The pointer to a driver name to be initialized.
- * @return
- *  0 on success, negative on error
- */
-int rte_vdev_uninit(const char *name);
-
-/**
  * Attach a device to a registered driver.
  *
  * @param name
@@ -316,4 +294,4 @@ __attribute__((used)) = str
 }
 #endif
 
-#endif /* _RTE_VDEV_H_ */
+#endif /* _RTE_DEV_H_ */
diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h
deleted file mode 100644
index 29f5a52..0000000
--- a/lib/librte_eal/common/include/rte_vdev.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 RehiveTech. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of RehiveTech nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef RTE_VDEV_H
-#define RTE_VDEV_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/queue.h>
-#include <rte_dev.h>
-#include <rte_devargs.h>
-
-struct rte_vdev_device {
-	TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
-	struct rte_device device;               /**< Inherit core device */
-};
-
-/**
- * @internal
- * Helper macro for drivers that need to convert to struct rte_vdev_device.
- */
-#define RTE_DEV_TO_VDEV(ptr) \
-	container_of(ptr, struct rte_vdev_device, device)
-
-static inline const char *
-rte_vdev_device_name(const struct rte_vdev_device *dev)
-{
-	if (dev && dev->device.name)
-		return dev->device.name;
-	return NULL;
-}
-
-static inline const char *
-rte_vdev_device_args(const struct rte_vdev_device *dev)
-{
-	if (dev && dev->device.devargs)
-		return dev->device.devargs->args;
-	return "";
-}
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
-
-/**
- * Probe function called for each virtual device driver once.
- */
-typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
-
-/**
- * Remove function called for each virtual device driver once.
- */
-typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
-
-/**
- * A virtual device driver abstraction.
- */
-struct rte_vdev_driver {
-	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
-	struct rte_driver driver;      /**< Inherited general driver. */
-	rte_vdev_probe_t *probe;       /**< Virtual device probe function. */
-	rte_vdev_remove_t *remove;     /**< Virtual device remove function. */
-};
-
-/**
- * Register a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev_driver structure describing the driver
- *   to be registered.
- */
-void rte_vdev_register(struct rte_vdev_driver *driver);
-
-/**
- * Unregister a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev_driver structure describing the driver
- *   to be unregistered.
- */
-void rte_vdev_unregister(struct rte_vdev_driver *driver);
-
-#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
-RTE_INIT(vdrvinitfn_ ##vdrv);\
-static const char *vdrvinit_ ## nm ## _alias;\
-static void vdrvinitfn_ ##vdrv(void)\
-{\
-	(vdrv).driver.name = RTE_STR(nm);\
-	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
-	rte_vdev_register(&vdrv);\
-} \
-RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
-
-#define RTE_PMD_REGISTER_ALIAS(nm, alias)\
-static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 1d3a42d..2975c25c 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -37,7 +37,7 @@ ARCH_DIR ?= $(RTE_ARCH)
 EXPORT_MAP := ../../rte_eal_version.map
 VPATH += $(RTE_SDK)/lib/librte_eal/common/arch/$(ARCH_DIR)
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
@@ -74,7 +74,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_launch.c
-SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memory.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_tailqs.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_errno.c
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index d2a4ff9..5966a03 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -166,10 +166,6 @@ DPDK_17.05 {
 	rte_log_set_global_level;
 	rte_log_set_level;
 	rte_log_set_level_regexp;
-	rte_vdev_init;
-	rte_vdev_register;
-	rte_vdev_uninit;
-	rte_vdev_unregister;
 	vfio_get_container_fd;
 	vfio_get_group_fd;
 	vfio_get_group_no;
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 047121d..de2f557 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -101,6 +101,7 @@ _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING)   += -lrte_mempool_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_RING)           += -lrte_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_PCI)            += -lrte_pci
 _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lrte_eal
+_LDLIBS-$(CONFIG_RTE_LIBRTE_VDEV_BUS)       += -lrte_bus_vdev
 _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE)        += -lrte_cmdline
 _LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER)        += -lrte_reorder
 _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED)          += -lrte_sched
diff --git a/test/test/test_cryptodev.c b/test/test/test_cryptodev.c
index 72988c5..9045873 100644
--- a/test/test/test_cryptodev.c
+++ b/test/test/test_cryptodev.c
@@ -36,6 +36,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_pause.h>
+#include <rte_vdev.h>
 
 #include <rte_crypto.h>
 #include <rte_cryptodev.h>
diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
index 56ed1f8..c0b864b 100644
--- a/test/test/test_event_eth_rx_adapter.c
+++ b/test/test/test_event_eth_rx_adapter.c
@@ -35,6 +35,7 @@
 #include <rte_mbuf.h>
 #include <rte_ethdev.h>
 #include <rte_eventdev.h>
+#include <rte_vdev.h>
 
 #include <rte_event_eth_rx_adapter.h>
 
diff --git a/test/test/test_eventdev.c b/test/test/test_eventdev.c
index 4118b75..a56f5a2 100644
--- a/test/test/test_eventdev.c
+++ b/test/test/test_eventdev.c
@@ -37,6 +37,7 @@
 #include <rte_memcpy.h>
 #include <rte_eventdev.h>
 #include <rte_dev.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_eventdev_octeontx.c b/test/test/test_eventdev_octeontx.c
index b88b0d2..ecae3e9 100644
--- a/test/test/test_eventdev_octeontx.c
+++ b/test/test/test_eventdev_octeontx.c
@@ -45,6 +45,7 @@
 #include <rte_lcore.h>
 #include <rte_per_lcore.h>
 #include <rte_random.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_eventdev_sw.c b/test/test/test_eventdev_sw.c
index 5c7751b..5e41140 100644
--- a/test/test/test_eventdev_sw.c
+++ b/test/test/test_eventdev_sw.c
@@ -51,6 +51,7 @@
 #include <rte_pause.h>
 #include <rte_service.h>
 #include <rte_service_component.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_link_bonding_rssconf.c b/test/test/test_link_bonding_rssconf.c
index 7dccc6e..6199188 100644
--- a/test/test/test_link_bonding_rssconf.c
+++ b/test/test/test_link_bonding_rssconf.c
@@ -48,6 +48,7 @@
 #include <rte_log.h>
 #include <rte_lcore.h>
 #include <rte_memory.h>
+#include <rte_vdev.h>
 
 #include <rte_string_fns.h>
 #include <rte_errno.h>
-- 
2.7.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v10 1/4] cryptodev: remove crypto vdev init API
  @ 2017-10-27  3:23  4%   ` Jianfeng Tan
  2017-10-27  3:23  1%   ` [dpdk-dev] [PATCH v10 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-10-27  3:23 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Remove rte_cryptodev_create_vdev() for duplication.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 doc/guides/rel_notes/deprecation.rst           |  5 -----
 doc/guides/rel_notes/release_17_11.rst         |  2 ++
 lib/librte_cryptodev/rte_cryptodev.c           |  6 ------
 lib/librte_cryptodev/rte_cryptodev.h           | 17 -----------------
 lib/librte_cryptodev/rte_cryptodev_version.map |  1 -
 5 files changed, 2 insertions(+), 29 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index a93c3e1..9120121 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -60,10 +60,5 @@ Deprecation Notices
   ``rte_cryptodev`` respectively to support security protocol offloaded
   operations.
 
-* cryptodev: the following function is deprecated starting from 17.08 and will
-  be removed in 17.11:
-
-  - ``rte_cryptodev_create_vdev``
-
 * librte_meter: The API will change to accommodate configuration profiles.
   Most of the API functions will have an additional opaque parameter.
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index b96b236..bab5d73 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -403,6 +403,8 @@ API Changes
   the backing device supports the operation or if the operation was
   successfully performed.
 
+* ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
+  in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
 ABI Changes
 -----------
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index 8063211..973c8db 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -377,12 +377,6 @@ rte_cryptodev_get_feature_name(uint64_t flag)
 	}
 }
 
-int
-rte_cryptodev_create_vdev(const char *name, const char *args)
-{
-	return rte_vdev_init(name, args);
-}
-
 struct rte_cryptodev *
 rte_cryptodev_pmd_get_dev(uint8_t dev_id)
 {
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index a0d3a12..2c1377b 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -435,23 +435,6 @@ struct rte_cryptodev_stats {
 /**< Max length of name of crypto PMD */
 
 /**
- * @deprecated
- *
- * Create a virtual crypto device
- *
- * @param	name	Cryptodev PMD name of device to be created.
- * @param	args	Options arguments for device.
- *
- * @return
- * - On successful creation of the cryptodev the device index is returned,
- *   which will be between 0 and rte_cryptodev_count().
- * - In the case of a failure, returns -1.
- */
-__rte_deprecated
-extern int
-rte_cryptodev_create_vdev(const char *name, const char *args);
-
-/**
  * Get the device identifier for the named crypto device.
  *
  * @param	name	device name to select the device structure.
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index e82296c..eb47308 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -7,7 +7,6 @@ DPDK_16.04 {
 	rte_cryptodev_close;
 	rte_cryptodev_count;
 	rte_cryptodev_configure;
-	rte_cryptodev_create_vdev;
 	rte_cryptodev_get_dev_id;
 	rte_cryptodev_get_feature_name;
 	rte_cryptodev_info_get;
-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v9 3/4] bus/vdev: move to vdev bus to drivers/bus
    2017-10-27  1:06  4%   ` [dpdk-dev] [PATCH v9 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
@ 2017-10-27  1:06  1%   ` Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-10-27  1:06 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Move the vdev bus from lib/librte_eal to drivers/bus.

As the crypto vdev helper function refers to data structure
in rte_vdev.h, so we move those helper function into drivers/bus
too.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 config/common_base                        |   5 +
 doc/guides/rel_notes/release_17_11.rst    |   8 +
 drivers/bus/Makefile                      |   4 +-
 drivers/bus/vdev/Makefile                 |  57 +++++
 drivers/bus/vdev/rte_bus_vdev_version.map |   8 +
 drivers/bus/vdev/rte_vdev.h               | 153 +++++++++++++
 drivers/bus/vdev/vdev.c                   | 344 ++++++++++++++++++++++++++++++
 drivers/crypto/Makefile                   |   1 +
 drivers/event/Makefile                    |   2 +-
 drivers/net/Makefile                      |   2 +-
 lib/librte_eal/bsdapp/eal/Makefile        |   3 +-
 lib/librte_eal/common/Makefile            |   2 +-
 lib/librte_eal/common/eal_common_vdev.c   | 342 -----------------------------
 lib/librte_eal/common/include/rte_dev.h   |  24 +--
 lib/librte_eal/common/include/rte_vdev.h  | 131 ------------
 lib/librte_eal/linuxapp/eal/Makefile      |   3 +-
 lib/librte_eal/rte_eal_version.map        |   4 -
 mk/rte.app.mk                             |   1 +
 test/test/test_cryptodev.c                |   1 +
 test/test/test_event_eth_rx_adapter.c     |   1 +
 test/test/test_eventdev.c                 |   1 +
 test/test/test_eventdev_octeontx.c        |   1 +
 test/test/test_eventdev_sw.c              |   1 +
 test/test/test_link_bonding_rssconf.c     |   1 +
 24 files changed, 591 insertions(+), 509 deletions(-)
 create mode 100644 drivers/bus/vdev/Makefile
 create mode 100644 drivers/bus/vdev/rte_bus_vdev_version.map
 create mode 100644 drivers/bus/vdev/rte_vdev.h
 create mode 100644 drivers/bus/vdev/vdev.c
 delete mode 100644 lib/librte_eal/common/eal_common_vdev.c
 delete mode 100644 lib/librte_eal/common/include/rte_vdev.h

diff --git a/config/common_base b/config/common_base
index 4ddde59..65b13e5 100644
--- a/config/common_base
+++ b/config/common_base
@@ -800,3 +800,8 @@ CONFIG_RTE_APP_CRYPTO_PERF=y
 # Compile the eventdev application
 #
 CONFIG_RTE_APP_EVENTDEV=y
+
+#
+# Compile the vdev bus
+#
+CONFIG_RTE_LIBRTE_VDEV_BUS=y
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 06de87b..58d4c58 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -300,6 +300,13 @@ API Changes
 * ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
   in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
+* **Moved the following APIs from eal library to bus_vdev library**
+
+  * ``rte_vdev_init``
+  * ``rte_vdev_register``
+  * ``rte_vdev_uninit``
+  * ``rte_vdev_unregister``
+
 ABI Changes
 -----------
 
@@ -355,6 +362,7 @@ The libraries prepended with a plus sign were incremented in this version.
 
      librte_acl.so.2
    + librte_bitratestats.so.2
+   + librte_bus_vdev.so.1
      librte_cfgfile.so.2
      librte_cmdline.so.2
      librte_cryptodev.so.3
diff --git a/drivers/bus/Makefile b/drivers/bus/Makefile
index 4b29e3d..038e10c 100644
--- a/drivers/bus/Makefile
+++ b/drivers/bus/Makefile
@@ -30,10 +30,10 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
-core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_ether
-
 DIRS-$(CONFIG_RTE_LIBRTE_DPAA_BUS) += dpaa
 
 DIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc
 
+DIRS-$(CONFIG_RTE_LIBRTE_VDEV_BUS) += vdev
+
 include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile
new file mode 100644
index 0000000..fe31654
--- /dev/null
+++ b/drivers/bus/vdev/Makefile
@@ -0,0 +1,57 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_bus_vdev.a
+
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+# versioning export map
+EXPORT_MAP := rte_bus_vdev_version.map
+
+# library version
+LIBABIVER := 1
+
+SRCS-y += vdev.c
+
+LDLIBS += -lrte_eal
+
+#
+# Export include files
+#
+SYMLINK-y-include += rte_vdev.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/bus/vdev/rte_bus_vdev_version.map b/drivers/bus/vdev/rte_bus_vdev_version.map
new file mode 100644
index 0000000..6ccb789
--- /dev/null
+++ b/drivers/bus/vdev/rte_bus_vdev_version.map
@@ -0,0 +1,8 @@
+DPDK_17.11 {
+	global:
+
+	rte_vdev_init;
+	rte_vdev_register;
+	rte_vdev_uninit;
+	rte_vdev_unregister;
+};
diff --git a/drivers/bus/vdev/rte_vdev.h b/drivers/bus/vdev/rte_vdev.h
new file mode 100644
index 0000000..41762b8
--- /dev/null
+++ b/drivers/bus/vdev/rte_vdev.h
@@ -0,0 +1,153 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of RehiveTech nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RTE_VDEV_H
+#define RTE_VDEV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/queue.h>
+#include <rte_dev.h>
+#include <rte_devargs.h>
+
+struct rte_vdev_device {
+	TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
+	struct rte_device device;               /**< Inherit core device */
+};
+
+/**
+ * @internal
+ * Helper macro for drivers that need to convert to struct rte_vdev_device.
+ */
+#define RTE_DEV_TO_VDEV(ptr) \
+	container_of(ptr, struct rte_vdev_device, device)
+
+static inline const char *
+rte_vdev_device_name(const struct rte_vdev_device *dev)
+{
+	if (dev && dev->device.name)
+		return dev->device.name;
+	return NULL;
+}
+
+static inline const char *
+rte_vdev_device_args(const struct rte_vdev_device *dev)
+{
+	if (dev && dev->device.devargs)
+		return dev->device.devargs->args;
+	return "";
+}
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
+
+/**
+ * Probe function called for each virtual device driver once.
+ */
+typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
+
+/**
+ * Remove function called for each virtual device driver once.
+ */
+typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
+
+/**
+ * A virtual device driver abstraction.
+ */
+struct rte_vdev_driver {
+	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
+	struct rte_driver driver;      /**< Inherited general driver. */
+	rte_vdev_probe_t *probe;       /**< Virtual device probe function. */
+	rte_vdev_remove_t *remove;     /**< Virtual device remove function. */
+};
+
+/**
+ * Register a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be registered.
+ */
+void rte_vdev_register(struct rte_vdev_driver *driver);
+
+/**
+ * Unregister a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be unregistered.
+ */
+void rte_vdev_unregister(struct rte_vdev_driver *driver);
+
+#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
+RTE_INIT(vdrvinitfn_ ##vdrv);\
+static const char *vdrvinit_ ## nm ## _alias;\
+static void vdrvinitfn_ ##vdrv(void)\
+{\
+	(vdrv).driver.name = RTE_STR(nm);\
+	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
+	rte_vdev_register(&vdrv);\
+} \
+RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
+
+#define RTE_PMD_REGISTER_ALIAS(nm, alias)\
+static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
+
+/**
+ * Initialize a driver specified by name.
+ *
+ * @param name
+ *   The pointer to a driver name to be initialized.
+ * @param args
+ *   The pointer to arguments used by driver initialization.
+ * @return
+ *  0 on success, negative on error
+ */
+int rte_vdev_init(const char *name, const char *args);
+
+/**
+ * Uninitalize a driver specified by name.
+ *
+ * @param name
+ *   The pointer to a driver name to be initialized.
+ * @return
+ *  0 on success, negative on error
+ */
+int rte_vdev_uninit(const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
new file mode 100644
index 0000000..a16eb71
--- /dev/null
+++ b/drivers/bus/vdev/vdev.c
@@ -0,0 +1,344 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of RehiveTech nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <sys/queue.h>
+
+#include <rte_eal.h>
+#include <rte_dev.h>
+#include <rte_bus.h>
+#include <rte_common.h>
+#include <rte_devargs.h>
+#include <rte_memory.h>
+#include <rte_errno.h>
+
+#include "rte_vdev.h"
+
+/* Forward declare to access virtual bus name */
+static struct rte_bus rte_vdev_bus;
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_device_list, rte_vdev_device);
+
+static struct vdev_device_list vdev_device_list =
+	TAILQ_HEAD_INITIALIZER(vdev_device_list);
+struct vdev_driver_list vdev_driver_list =
+	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
+
+/* register a driver */
+void
+rte_vdev_register(struct rte_vdev_driver *driver)
+{
+	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
+}
+
+/* unregister a driver */
+void
+rte_vdev_unregister(struct rte_vdev_driver *driver)
+{
+	TAILQ_REMOVE(&vdev_driver_list, driver, next);
+}
+
+static int
+vdev_parse(const char *name, void *addr)
+{
+	struct rte_vdev_driver **out = addr;
+	struct rte_vdev_driver *driver = NULL;
+
+	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
+		if (strncmp(driver->driver.name, name,
+			    strlen(driver->driver.name)) == 0)
+			break;
+		if (driver->driver.alias &&
+		    strncmp(driver->driver.alias, name,
+			    strlen(driver->driver.alias)) == 0)
+			break;
+	}
+	if (driver != NULL &&
+	    addr != NULL)
+		*out = driver;
+	return driver == NULL;
+}
+
+static int
+vdev_probe_all_drivers(struct rte_vdev_device *dev)
+{
+	const char *name;
+	struct rte_vdev_driver *driver;
+	int ret;
+
+	name = rte_vdev_device_name(dev);
+
+	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
+		rte_vdev_device_name(dev));
+
+	if (vdev_parse(name, &driver))
+		return -1;
+	dev->device.driver = &driver->driver;
+	ret = driver->probe(dev);
+	if (ret)
+		dev->device.driver = NULL;
+	return ret;
+}
+
+static struct rte_vdev_device *
+find_vdev(const char *name)
+{
+	struct rte_vdev_device *dev;
+
+	if (!name)
+		return NULL;
+
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+		const char *devname = rte_vdev_device_name(dev);
+
+		if (!strncmp(devname, name, strlen(name)))
+			return dev;
+	}
+
+	return NULL;
+}
+
+static struct rte_devargs *
+alloc_devargs(const char *name, const char *args)
+{
+	struct rte_devargs *devargs;
+	int ret;
+
+	devargs = calloc(1, sizeof(*devargs));
+	if (!devargs)
+		return NULL;
+
+	devargs->bus = &rte_vdev_bus;
+	if (args)
+		devargs->args = strdup(args);
+	else
+		devargs->args = strdup("");
+
+	ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name);
+	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
+		free(devargs->args);
+		free(devargs);
+		return NULL;
+	}
+
+	return devargs;
+}
+
+int
+rte_vdev_init(const char *name, const char *args)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+	int ret;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	dev = find_vdev(name);
+	if (dev)
+		return -EEXIST;
+
+	devargs = alloc_devargs(name, args);
+	if (!devargs)
+		return -ENOMEM;
+
+	dev = calloc(1, sizeof(*dev));
+	if (!dev) {
+		ret = -ENOMEM;
+		goto fail;
+	}
+
+	dev->device.devargs = devargs;
+	dev->device.numa_node = SOCKET_ID_ANY;
+	dev->device.name = devargs->name;
+
+	ret = vdev_probe_all_drivers(dev);
+	if (ret) {
+		if (ret > 0)
+			RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
+		goto fail;
+	}
+
+	TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
+
+	TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+	return 0;
+
+fail:
+	free(devargs->args);
+	free(devargs);
+	free(dev);
+	return ret;
+}
+
+static int
+vdev_remove_driver(struct rte_vdev_device *dev)
+{
+	const char *name = rte_vdev_device_name(dev);
+	const struct rte_vdev_driver *driver;
+
+	if (!dev->device.driver) {
+		RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name);
+		return 1;
+	}
+
+	driver = container_of(dev->device.driver, const struct rte_vdev_driver,
+		driver);
+	return driver->remove(dev);
+}
+
+int
+rte_vdev_uninit(const char *name)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+	int ret;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	dev = find_vdev(name);
+	if (!dev)
+		return -ENOENT;
+
+	devargs = dev->device.devargs;
+
+	ret = vdev_remove_driver(dev);
+	if (ret)
+		return ret;
+
+	TAILQ_REMOVE(&vdev_device_list, dev, next);
+
+	TAILQ_REMOVE(&devargs_list, devargs, next);
+
+	free(devargs->args);
+	free(devargs);
+	free(dev);
+	return 0;
+}
+
+static int
+vdev_scan(void)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+
+	/* for virtual devices we scan the devargs_list populated via cmdline */
+	TAILQ_FOREACH(devargs, &devargs_list, next) {
+
+		if (devargs->bus != &rte_vdev_bus)
+			continue;
+
+		dev = find_vdev(devargs->name);
+		if (dev)
+			continue;
+
+		dev = calloc(1, sizeof(*dev));
+		if (!dev)
+			return -1;
+
+		dev->device.devargs = devargs;
+		dev->device.numa_node = SOCKET_ID_ANY;
+		dev->device.name = devargs->name;
+
+		TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+	}
+
+	return 0;
+}
+
+static int
+vdev_probe(void)
+{
+	struct rte_vdev_device *dev;
+
+	/* call the init function for each virtual device */
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+
+		if (dev->device.driver)
+			continue;
+
+		if (vdev_probe_all_drivers(dev)) {
+			RTE_LOG(ERR, EAL, "failed to initialize %s device\n",
+				rte_vdev_device_name(dev));
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+static struct rte_device *
+vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
+		 const void *data)
+{
+	struct rte_vdev_device *dev;
+
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+		if (start && &dev->device == start) {
+			start = NULL;
+			continue;
+		}
+		if (cmp(&dev->device, data) == 0)
+			return &dev->device;
+	}
+	return NULL;
+}
+
+static int
+vdev_plug(struct rte_device *dev)
+{
+	return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev));
+}
+
+static int
+vdev_unplug(struct rte_device *dev)
+{
+	return rte_vdev_uninit(dev->name);
+}
+
+static struct rte_bus rte_vdev_bus = {
+	.scan = vdev_scan,
+	.probe = vdev_probe,
+	.find_device = vdev_find_device,
+	.plug = vdev_plug,
+	.unplug = vdev_unplug,
+	.parse = vdev_parse,
+};
+
+RTE_REGISTER_BUS(vdev, rte_vdev_bus);
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile
index d551541..1cb4cdb 100644
--- a/drivers/crypto/Makefile
+++ b/drivers/crypto/Makefile
@@ -32,6 +32,7 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_cryptodev
+core-libs += librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += aesni_gcm
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_MB) += aesni_mb
diff --git a/drivers/event/Makefile b/drivers/event/Makefile
index 05dec1b..9c9ae82 100644
--- a/drivers/event/Makefile
+++ b/drivers/event/Makefile
@@ -31,7 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
-core-libs := librte_eal librte_ether librte_eventdev
+core-libs := librte_eal librte_ether librte_eventdev librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += skeleton
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index cf33233..00be153 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -37,7 +37,7 @@ ifeq ($(CONFIG_RTE_LIBRTE_THUNDERX_NICVF_PMD),d)
 endif
 
 core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_ether
-core-libs += librte_net librte_kvargs
+core-libs += librte_net librte_kvargs librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet
 DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 351fa57..25a48d1 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,7 +48,7 @@ LDLIBS += -lgcc_s
 
 EXPORT_MAP := ../../rte_eal_version.map
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 # specific to bsdapp exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c
@@ -68,7 +68,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_launch.c
-SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_pci.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_pci_uio.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memory.c
diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 6f5b3f3..2fb5635 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -39,7 +39,7 @@ INC += rte_per_lcore.h rte_random.h
 INC += rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_version.h
 INC += rte_eal_memconfig.h rte_malloc_heap.h
-INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h rte_vdev.h
+INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h
 INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
 INC += rte_malloc.h rte_keepalive.h rte_time.h
 INC += rte_service.h rte_service_component.h
diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c
deleted file mode 100644
index f7e547a..0000000
--- a/lib/librte_eal/common/eal_common_vdev.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 RehiveTech. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of RehiveTech nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <sys/queue.h>
-
-#include <rte_eal.h>
-#include <rte_dev.h>
-#include <rte_bus.h>
-#include <rte_vdev.h>
-#include <rte_common.h>
-#include <rte_devargs.h>
-#include <rte_memory.h>
-#include <rte_errno.h>
-
-/* Forward declare to access virtual bus name */
-static struct rte_bus rte_vdev_bus;
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(vdev_device_list, rte_vdev_device);
-
-static struct vdev_device_list vdev_device_list =
-	TAILQ_HEAD_INITIALIZER(vdev_device_list);
-struct vdev_driver_list vdev_driver_list =
-	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
-
-/* register a driver */
-void
-rte_vdev_register(struct rte_vdev_driver *driver)
-{
-	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
-}
-
-/* unregister a driver */
-void
-rte_vdev_unregister(struct rte_vdev_driver *driver)
-{
-	TAILQ_REMOVE(&vdev_driver_list, driver, next);
-}
-
-static int
-vdev_parse(const char *name, void *addr)
-{
-	struct rte_vdev_driver **out = addr;
-	struct rte_vdev_driver *driver = NULL;
-
-	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
-		if (strncmp(driver->driver.name, name,
-			    strlen(driver->driver.name)) == 0)
-			break;
-		if (driver->driver.alias &&
-		    strncmp(driver->driver.alias, name,
-			    strlen(driver->driver.alias)) == 0)
-			break;
-	}
-	if (driver != NULL &&
-	    addr != NULL)
-		*out = driver;
-	return driver == NULL;
-}
-
-static int
-vdev_probe_all_drivers(struct rte_vdev_device *dev)
-{
-	const char *name;
-	struct rte_vdev_driver *driver;
-	int ret;
-
-	name = rte_vdev_device_name(dev);
-
-	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
-		rte_vdev_device_name(dev));
-
-	if (vdev_parse(name, &driver))
-		return -1;
-	dev->device.driver = &driver->driver;
-	ret = driver->probe(dev);
-	if (ret)
-		dev->device.driver = NULL;
-	return ret;
-}
-
-static struct rte_vdev_device *
-find_vdev(const char *name)
-{
-	struct rte_vdev_device *dev;
-
-	if (!name)
-		return NULL;
-
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-		const char *devname = rte_vdev_device_name(dev);
-		if (!strncmp(devname, name, strlen(name)))
-			return dev;
-	}
-
-	return NULL;
-}
-
-static struct rte_devargs *
-alloc_devargs(const char *name, const char *args)
-{
-	struct rte_devargs *devargs;
-	int ret;
-
-	devargs = calloc(1, sizeof(*devargs));
-	if (!devargs)
-		return NULL;
-
-	devargs->bus = &rte_vdev_bus;
-	if (args)
-		devargs->args = strdup(args);
-	else
-		devargs->args = strdup("");
-
-	ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name);
-	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
-		free(devargs->args);
-		free(devargs);
-		return NULL;
-	}
-
-	return devargs;
-}
-
-int
-rte_vdev_init(const char *name, const char *args)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-	int ret;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	dev = find_vdev(name);
-	if (dev)
-		return -EEXIST;
-
-	devargs = alloc_devargs(name, args);
-	if (!devargs)
-		return -ENOMEM;
-
-	dev = calloc(1, sizeof(*dev));
-	if (!dev) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
-	dev->device.devargs = devargs;
-	dev->device.numa_node = SOCKET_ID_ANY;
-	dev->device.name = devargs->name;
-
-	ret = vdev_probe_all_drivers(dev);
-	if (ret) {
-		if (ret > 0)
-			RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
-		goto fail;
-	}
-
-	TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
-
-	TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
-	return 0;
-
-fail:
-	free(devargs->args);
-	free(devargs);
-	free(dev);
-	return ret;
-}
-
-static int
-vdev_remove_driver(struct rte_vdev_device *dev)
-{
-	const char *name = rte_vdev_device_name(dev);
-	const struct rte_vdev_driver *driver;
-
-	if (!dev->device.driver) {
-		RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name);
-		return 1;
-	}
-
-	driver = container_of(dev->device.driver, const struct rte_vdev_driver,
-		driver);
-	return driver->remove(dev);
-}
-
-int
-rte_vdev_uninit(const char *name)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-	int ret;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	dev = find_vdev(name);
-	if (!dev)
-		return -ENOENT;
-
-	devargs = dev->device.devargs;
-
-	ret = vdev_remove_driver(dev);
-	if (ret)
-		return ret;
-
-	TAILQ_REMOVE(&vdev_device_list, dev, next);
-
-	TAILQ_REMOVE(&devargs_list, devargs, next);
-
-	free(devargs->args);
-	free(devargs);
-	free(dev);
-	return 0;
-}
-
-static int
-vdev_scan(void)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-
-	/* for virtual devices we scan the devargs_list populated via cmdline */
-	TAILQ_FOREACH(devargs, &devargs_list, next) {
-
-		if (devargs->bus != &rte_vdev_bus)
-			continue;
-
-		dev = find_vdev(devargs->name);
-		if (dev)
-			continue;
-
-		dev = calloc(1, sizeof(*dev));
-		if (!dev)
-			return -1;
-
-		dev->device.devargs = devargs;
-		dev->device.numa_node = SOCKET_ID_ANY;
-		dev->device.name = devargs->name;
-
-		TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
-	}
-
-	return 0;
-}
-
-static int
-vdev_probe(void)
-{
-	struct rte_vdev_device *dev;
-
-	/* call the init function for each virtual device */
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-
-		if (dev->device.driver)
-			continue;
-
-		if (vdev_probe_all_drivers(dev)) {
-			RTE_LOG(ERR, EAL, "failed to initialize %s device\n",
-				rte_vdev_device_name(dev));
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static struct rte_device *
-vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
-		 const void *data)
-{
-	struct rte_vdev_device *dev;
-
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-		if (start && &dev->device == start) {
-			start = NULL;
-			continue;
-		}
-		if (cmp(&dev->device, data) == 0)
-			return &dev->device;
-	}
-	return NULL;
-}
-
-static int
-vdev_plug(struct rte_device *dev)
-{
-	return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev));
-}
-
-static int
-vdev_unplug(struct rte_device *dev)
-{
-	return rte_vdev_uninit(dev->name);
-}
-
-static struct rte_bus rte_vdev_bus = {
-	.scan = vdev_scan,
-	.probe = vdev_probe,
-	.find_device = vdev_find_device,
-	.plug = vdev_plug,
-	.unplug = vdev_unplug,
-	.parse = vdev_parse,
-};
-
-RTE_REGISTER_BUS(vdev, rte_vdev_bus);
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index 4c4ac7e..8088dcc 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -170,28 +170,6 @@ struct rte_device {
 };
 
 /**
- * Initialize a driver specified by name.
- *
- * @param name
- *   The pointer to a driver name to be initialized.
- * @param args
- *   The pointer to arguments used by driver initialization.
- * @return
- *  0 on success, negative on error
- */
-int rte_vdev_init(const char *name, const char *args);
-
-/**
- * Uninitalize a driver specified by name.
- *
- * @param name
- *   The pointer to a driver name to be initialized.
- * @return
- *  0 on success, negative on error
- */
-int rte_vdev_uninit(const char *name);
-
-/**
  * Attach a device to a registered driver.
  *
  * @param name
@@ -316,4 +294,4 @@ __attribute__((used)) = str
 }
 #endif
 
-#endif /* _RTE_VDEV_H_ */
+#endif /* _RTE_DEV_H_ */
diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h
deleted file mode 100644
index 29f5a52..0000000
--- a/lib/librte_eal/common/include/rte_vdev.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 RehiveTech. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of RehiveTech nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef RTE_VDEV_H
-#define RTE_VDEV_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/queue.h>
-#include <rte_dev.h>
-#include <rte_devargs.h>
-
-struct rte_vdev_device {
-	TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
-	struct rte_device device;               /**< Inherit core device */
-};
-
-/**
- * @internal
- * Helper macro for drivers that need to convert to struct rte_vdev_device.
- */
-#define RTE_DEV_TO_VDEV(ptr) \
-	container_of(ptr, struct rte_vdev_device, device)
-
-static inline const char *
-rte_vdev_device_name(const struct rte_vdev_device *dev)
-{
-	if (dev && dev->device.name)
-		return dev->device.name;
-	return NULL;
-}
-
-static inline const char *
-rte_vdev_device_args(const struct rte_vdev_device *dev)
-{
-	if (dev && dev->device.devargs)
-		return dev->device.devargs->args;
-	return "";
-}
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
-
-/**
- * Probe function called for each virtual device driver once.
- */
-typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
-
-/**
- * Remove function called for each virtual device driver once.
- */
-typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
-
-/**
- * A virtual device driver abstraction.
- */
-struct rte_vdev_driver {
-	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
-	struct rte_driver driver;      /**< Inherited general driver. */
-	rte_vdev_probe_t *probe;       /**< Virtual device probe function. */
-	rte_vdev_remove_t *remove;     /**< Virtual device remove function. */
-};
-
-/**
- * Register a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev_driver structure describing the driver
- *   to be registered.
- */
-void rte_vdev_register(struct rte_vdev_driver *driver);
-
-/**
- * Unregister a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev_driver structure describing the driver
- *   to be unregistered.
- */
-void rte_vdev_unregister(struct rte_vdev_driver *driver);
-
-#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
-RTE_INIT(vdrvinitfn_ ##vdrv);\
-static const char *vdrvinit_ ## nm ## _alias;\
-static void vdrvinitfn_ ##vdrv(void)\
-{\
-	(vdrv).driver.name = RTE_STR(nm);\
-	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
-	rte_vdev_register(&vdrv);\
-} \
-RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
-
-#define RTE_PMD_REGISTER_ALIAS(nm, alias)\
-static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 965da6e..eef80eb 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -37,7 +37,7 @@ ARCH_DIR ?= $(RTE_ARCH)
 EXPORT_MAP := ../../rte_eal_version.map
 VPATH += $(RTE_SDK)/lib/librte_eal/common/arch/$(ARCH_DIR)
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
@@ -77,7 +77,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_launch.c
-SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci_uio.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memory.c
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index 8eb53ab..f9edb29 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -181,10 +181,6 @@ DPDK_17.05 {
 	rte_pci_unmap_device;
 	rte_pci_unregister;
 	rte_pci_write_config;
-	rte_vdev_init;
-	rte_vdev_register;
-	rte_vdev_uninit;
-	rte_vdev_unregister;
 	vfio_get_container_fd;
 	vfio_get_group_fd;
 	vfio_get_group_no;
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 482656c..6780f4f 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -99,6 +99,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_MEMPOOL)        += -lrte_mempool
 _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING)   += -lrte_mempool_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_RING)           += -lrte_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lrte_eal
+_LDLIBS-$(CONFIG_RTE_LIBRTE_VDEV_BUS)       += -lrte_bus_vdev
 _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE)        += -lrte_cmdline
 _LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER)        += -lrte_reorder
 _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED)          += -lrte_sched
diff --git a/test/test/test_cryptodev.c b/test/test/test_cryptodev.c
index a926779..2e80062 100644
--- a/test/test/test_cryptodev.c
+++ b/test/test/test_cryptodev.c
@@ -36,6 +36,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_pause.h>
+#include <rte_vdev.h>
 
 #include <rte_crypto.h>
 #include <rte_cryptodev.h>
diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
index 56ed1f8..c0b864b 100644
--- a/test/test/test_event_eth_rx_adapter.c
+++ b/test/test/test_event_eth_rx_adapter.c
@@ -35,6 +35,7 @@
 #include <rte_mbuf.h>
 #include <rte_ethdev.h>
 #include <rte_eventdev.h>
+#include <rte_vdev.h>
 
 #include <rte_event_eth_rx_adapter.h>
 
diff --git a/test/test/test_eventdev.c b/test/test/test_eventdev.c
index d6ade78..e3d36f3 100644
--- a/test/test/test_eventdev.c
+++ b/test/test/test_eventdev.c
@@ -37,6 +37,7 @@
 #include <rte_memcpy.h>
 #include <rte_eventdev.h>
 #include <rte_dev.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_eventdev_octeontx.c b/test/test/test_eventdev_octeontx.c
index b88b0d2..ecae3e9 100644
--- a/test/test/test_eventdev_octeontx.c
+++ b/test/test/test_eventdev_octeontx.c
@@ -45,6 +45,7 @@
 #include <rte_lcore.h>
 #include <rte_per_lcore.h>
 #include <rte_random.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_eventdev_sw.c b/test/test/test_eventdev_sw.c
index 7219886..385e743 100644
--- a/test/test/test_eventdev_sw.c
+++ b/test/test/test_eventdev_sw.c
@@ -49,6 +49,7 @@
 #include <rte_cycles.h>
 #include <rte_eventdev.h>
 #include <rte_pause.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_link_bonding_rssconf.c b/test/test/test_link_bonding_rssconf.c
index 7dccc6e..6199188 100644
--- a/test/test/test_link_bonding_rssconf.c
+++ b/test/test/test_link_bonding_rssconf.c
@@ -48,6 +48,7 @@
 #include <rte_log.h>
 #include <rte_lcore.h>
 #include <rte_memory.h>
+#include <rte_vdev.h>
 
 #include <rte_string_fns.h>
 #include <rte_errno.h>
-- 
2.7.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v9 1/4] cryptodev: remove crypto vdev init API
  @ 2017-10-27  1:06  4%   ` Jianfeng Tan
  2017-10-27  1:06  1%   ` [dpdk-dev] [PATCH v9 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-10-27  1:06 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Remove rte_cryptodev_create_vdev() for duplication.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 doc/guides/rel_notes/deprecation.rst           |  5 -----
 doc/guides/rel_notes/release_17_11.rst         |  2 ++
 lib/librte_cryptodev/rte_cryptodev.c           |  6 ------
 lib/librte_cryptodev/rte_cryptodev.h           | 17 -----------------
 lib/librte_cryptodev/rte_cryptodev_version.map |  1 -
 5 files changed, 2 insertions(+), 29 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 3a5d093..6d859c0 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -66,11 +66,6 @@ Deprecation Notices
   ``rte_cryptodev`` respectively to support security protocol offloaded
   operations.
 
-* cryptodev: the following function is deprecated starting from 17.08 and will
-  be removed in 17.11:
-
-  - ``rte_cryptodev_create_vdev``
-
 * cryptodev: the following function will be static in 17.11 and included
   by all crypto drivers, therefore, will not be public:
 
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 3298ef5..06de87b 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -297,6 +297,8 @@ API Changes
   ``rte_log_get_global_level()``, ``rte_log_set_level()`` and
   ``rte_log_get_level()``.
 
+* ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
+  in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
 ABI Changes
 -----------
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index 21da40e..279b861 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -377,12 +377,6 @@ rte_cryptodev_get_feature_name(uint64_t flag)
 	}
 }
 
-int
-rte_cryptodev_create_vdev(const char *name, const char *args)
-{
-	return rte_vdev_init(name, args);
-}
-
 struct rte_cryptodev *
 rte_cryptodev_pmd_get_dev(uint8_t dev_id)
 {
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index b74bbdd..f8341cf 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -433,23 +433,6 @@ struct rte_cryptodev_stats {
 /**< Max length of name of crypto PMD */
 
 /**
- * @deprecated
- *
- * Create a virtual crypto device
- *
- * @param	name	Cryptodev PMD name of device to be created.
- * @param	args	Options arguments for device.
- *
- * @return
- * - On successful creation of the cryptodev the device index is returned,
- *   which will be between 0 and rte_cryptodev_count().
- * - In the case of a failure, returns -1.
- */
-__rte_deprecated
-extern int
-rte_cryptodev_create_vdev(const char *name, const char *args);
-
-/**
  * Get the device identifier for the named crypto device.
  *
  * @param	name	device name to select the device structure.
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index 874c1b5..f148872 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -7,7 +7,6 @@ DPDK_16.04 {
 	rte_cryptodev_close;
 	rte_cryptodev_count;
 	rte_cryptodev_configure;
-	rte_cryptodev_create_vdev;
 	rte_cryptodev_get_dev_id;
 	rte_cryptodev_get_feature_name;
 	rte_cryptodev_info_get;
-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v8 24/25] doc: add notes on EAL PCI API update
  @ 2017-10-26 10:06  4%             ` Gaetan Rivet
  0 siblings, 0 replies; 200+ results
From: Gaetan Rivet @ 2017-10-26 10:06 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

Add a section related to EAL API changes to 17.11 release notes.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 93f94fc..6619711 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -369,6 +369,34 @@ API Changes
   the backing device supports the operation or if the operation was
   successfully performed.
 
+* **PCI bus API moved outside of the EAL**
+
+  The PCI bus previously implemented within the EAL has been moved.
+  A first part has been added as an RTE library providing PCI helpers to
+  parse device locations or other such utilities.
+  A second part consisting in the actual bus driver has been moved to its
+  proper subdirectory, without changing its functionalities.
+
+  As such, several PCI-related functions are not proposed by the EAL anymore:
+
+  * rte_pci_detach
+  * rte_pci_dump
+  * rte_pci_ioport_map
+  * rte_pci_ioport_read
+  * rte_pci_ioport_unmap
+  * rte_pci_ioport_write
+  * rte_pci_map_device
+  * rte_pci_probe
+  * rte_pci_probe_one
+  * rte_pci_read_config
+  * rte_pci_register
+  * rte_pci_scan
+  * rte_pci_unmap_device
+  * rte_pci_unregister
+  * rte_pci_write_config
+
+  These functions are made available either as part of ``librte_pci`` or
+  ``librte_bus_pci``.
 
 ABI Changes
 -----------
-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v7 24/25] doc: add notes on EAL PCI API update
  @ 2017-10-25 22:38  4%           ` Gaetan Rivet
    1 sibling, 0 replies; 200+ results
From: Gaetan Rivet @ 2017-10-25 22:38 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

Add a section related to EAL API changes to 17.11 release notes.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 3298ef5..5aa0f4d 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -297,6 +297,34 @@ API Changes
   ``rte_log_get_global_level()``, ``rte_log_set_level()`` and
   ``rte_log_get_level()``.
 
+* **PCI bus API moved outside of the EAL**
+
+  The PCI bus previously implemented within the EAL has been moved.
+  A first part has been added as an RTE library providing PCI helpers to
+  parse device locations or other such utilities.
+  A second part consisting in the actual bus driver has been moved to its
+  proper subdirectory, without changing its functionalities.
+
+  As such, several PCI-related functions are not proposed by the EAL anymore:
+
+  * rte_pci_detach
+  * rte_pci_dump
+  * rte_pci_ioport_map
+  * rte_pci_ioport_read
+  * rte_pci_ioport_unmap
+  * rte_pci_ioport_write
+  * rte_pci_map_device
+  * rte_pci_probe
+  * rte_pci_probe_one
+  * rte_pci_read_config
+  * rte_pci_register
+  * rte_pci_scan
+  * rte_pci_unmap_device
+  * rte_pci_unregister
+  * rte_pci_write_config
+
+  These functions are made available either as part of ``librte_pci`` or
+  ``librte_bus_pci``.
 
 ABI Changes
 -----------
-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v8 3/4] bus/vdev: move to vdev bus to drivers/bus
  2017-10-25 17:10  1%   ` [dpdk-dev] [PATCH v8 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
@ 2017-10-25 21:32  3%     ` De Lara Guarch, Pablo
  0 siblings, 0 replies; 200+ results
From: De Lara Guarch, Pablo @ 2017-10-25 21:32 UTC (permalink / raw)
  To: Tan, Jianfeng, dev
  Cc: jblunck, Richardson, Bruce, Ananyev, Konstantin, thomas, yliu,
	maxime.coquelin, mtetsuyah, Yigit, Ferruh

Hi Jianfeng,

> -----Original Message-----
> From: Tan, Jianfeng
> Sent: Wednesday, October 25, 2017 6:11 PM
> To: dev@dpdk.org
> Cc: jblunck@infradead.org; Richardson, Bruce
> <bruce.richardson@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; De Lara Guarch, Pablo
> <pablo.de.lara.guarch@intel.com>; thomas@monjalon.net;
> yliu@fridaylinux.org; maxime.coquelin@redhat.com;
> mtetsuyah@gmail.com; Yigit, Ferruh <ferruh.yigit@intel.com>; Tan,
> Jianfeng <jianfeng.tan@intel.com>
> Subject: [PATCH v8 3/4] bus/vdev: move to vdev bus to drivers/bus
> 
> Move the vdev bus from lib/librte_eal to drivers/bus.
> 
> As the crypto vdev helper function refers to data structure in rte_vdev.h, so
> we move those helper function into drivers/bus too.
> 
> Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>

...

>  ABI Changes
>  -----------
> 
> @@ -355,11 +362,12 @@ The libraries prepended with a plus sign were
> incremented in this version.
> 
>       librte_acl.so.2
>     + librte_bitratestats.so.2
> +   + librte_bus_vdev.so.1
>       librte_cfgfile.so.2
>       librte_cmdline.so.2
>       librte_cryptodev.so.4
>       librte_distributor.so.1
> -   + librte_eal.so.6
> +   + librte_eal.so.7

EAL ABI version has been bumped already in this release,
so there is no need to do it again.

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v8 1/4] cryptodev: remove crypto vdev init API
  @ 2017-10-25 17:10  4%   ` Jianfeng Tan
  2017-10-25 17:10  1%   ` [dpdk-dev] [PATCH v8 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-10-25 17:10 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Remove rte_cryptodev_create_vdev() for duplication.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 doc/guides/rel_notes/deprecation.rst           |  5 -----
 doc/guides/rel_notes/release_17_11.rst         |  4 +++-
 lib/librte_cryptodev/Makefile                  |  2 +-
 lib/librte_cryptodev/rte_cryptodev.c           |  6 ------
 lib/librte_cryptodev/rte_cryptodev.h           | 17 -----------------
 lib/librte_cryptodev/rte_cryptodev_version.map |  1 -
 6 files changed, 4 insertions(+), 31 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 3a5d093..6d859c0 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -66,11 +66,6 @@ Deprecation Notices
   ``rte_cryptodev`` respectively to support security protocol offloaded
   operations.
 
-* cryptodev: the following function is deprecated starting from 17.08 and will
-  be removed in 17.11:
-
-  - ``rte_cryptodev_create_vdev``
-
 * cryptodev: the following function will be static in 17.11 and included
   by all crypto drivers, therefore, will not be public:
 
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 3298ef5..898f7a5 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -297,6 +297,8 @@ API Changes
   ``rte_log_get_global_level()``, ``rte_log_set_level()`` and
   ``rte_log_get_level()``.
 
+* ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
+  in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
 ABI Changes
 -----------
@@ -355,7 +357,7 @@ The libraries prepended with a plus sign were incremented in this version.
    + librte_bitratestats.so.2
      librte_cfgfile.so.2
      librte_cmdline.so.2
-     librte_cryptodev.so.3
+     librte_cryptodev.so.4
      librte_distributor.so.1
    + librte_eal.so.6
    + librte_ethdev.so.8
diff --git a/lib/librte_cryptodev/Makefile b/lib/librte_cryptodev/Makefile
index 455151f..9569c99 100644
--- a/lib/librte_cryptodev/Makefile
+++ b/lib/librte_cryptodev/Makefile
@@ -34,7 +34,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
 LIB = librte_cryptodev.a
 
 # library version
-LIBABIVER := 3
+LIBABIVER := 4
 
 # build flags
 CFLAGS += -O3
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index 21da40e..279b861 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -377,12 +377,6 @@ rte_cryptodev_get_feature_name(uint64_t flag)
 	}
 }
 
-int
-rte_cryptodev_create_vdev(const char *name, const char *args)
-{
-	return rte_vdev_init(name, args);
-}
-
 struct rte_cryptodev *
 rte_cryptodev_pmd_get_dev(uint8_t dev_id)
 {
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index b74bbdd..f8341cf 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -433,23 +433,6 @@ struct rte_cryptodev_stats {
 /**< Max length of name of crypto PMD */
 
 /**
- * @deprecated
- *
- * Create a virtual crypto device
- *
- * @param	name	Cryptodev PMD name of device to be created.
- * @param	args	Options arguments for device.
- *
- * @return
- * - On successful creation of the cryptodev the device index is returned,
- *   which will be between 0 and rte_cryptodev_count().
- * - In the case of a failure, returns -1.
- */
-__rte_deprecated
-extern int
-rte_cryptodev_create_vdev(const char *name, const char *args);
-
-/**
  * Get the device identifier for the named crypto device.
  *
  * @param	name	device name to select the device structure.
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index 874c1b5..f148872 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -7,7 +7,6 @@ DPDK_16.04 {
 	rte_cryptodev_close;
 	rte_cryptodev_count;
 	rte_cryptodev_configure;
-	rte_cryptodev_create_vdev;
 	rte_cryptodev_get_dev_id;
 	rte_cryptodev_get_feature_name;
 	rte_cryptodev_info_get;
-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v8 3/4] bus/vdev: move to vdev bus to drivers/bus
    2017-10-25 17:10  4%   ` [dpdk-dev] [PATCH v8 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
@ 2017-10-25 17:10  1%   ` Jianfeng Tan
  2017-10-25 21:32  3%     ` De Lara Guarch, Pablo
  1 sibling, 1 reply; 200+ results
From: Jianfeng Tan @ 2017-10-25 17:10 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Move the vdev bus from lib/librte_eal to drivers/bus.

As the crypto vdev helper function refers to data structure
in rte_vdev.h, so we move those helper function into drivers/bus
too.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 config/common_base                        |   5 +
 doc/guides/rel_notes/release_17_11.rst    |  10 +-
 drivers/bus/Makefile                      |   3 +
 drivers/bus/vdev/Makefile                 |  55 +++++
 drivers/bus/vdev/rte_bus_vdev_version.map |   8 +
 drivers/bus/vdev/rte_vdev.h               | 153 +++++++++++++
 drivers/bus/vdev/vdev.c                   | 344 ++++++++++++++++++++++++++++++
 drivers/crypto/Makefile                   |   1 +
 drivers/event/Makefile                    |   2 +-
 drivers/net/Makefile                      |   2 +-
 lib/librte_eal/bsdapp/eal/Makefile        |   3 +-
 lib/librte_eal/common/Makefile            |   2 +-
 lib/librte_eal/common/eal_common_vdev.c   | 342 -----------------------------
 lib/librte_eal/common/include/rte_dev.h   |  24 +--
 lib/librte_eal/common/include/rte_vdev.h  | 131 ------------
 lib/librte_eal/linuxapp/eal/Makefile      |   3 +-
 lib/librte_eal/rte_eal_version.map        |   4 -
 mk/rte.app.mk                             |   1 +
 test/test/test_cryptodev.c                |   1 +
 test/test/test_event_eth_rx_adapter.c     |   1 +
 test/test/test_eventdev.c                 |   1 +
 test/test/test_eventdev_octeontx.c        |   1 +
 test/test/test_eventdev_sw.c              |   1 +
 test/test/test_link_bonding_rssconf.c     |   1 +
 24 files changed, 591 insertions(+), 508 deletions(-)
 create mode 100644 drivers/bus/vdev/Makefile
 create mode 100644 drivers/bus/vdev/rte_bus_vdev_version.map
 create mode 100644 drivers/bus/vdev/rte_vdev.h
 create mode 100644 drivers/bus/vdev/vdev.c
 delete mode 100644 lib/librte_eal/common/eal_common_vdev.c
 delete mode 100644 lib/librte_eal/common/include/rte_vdev.h

diff --git a/config/common_base b/config/common_base
index 4ddde59..65b13e5 100644
--- a/config/common_base
+++ b/config/common_base
@@ -800,3 +800,8 @@ CONFIG_RTE_APP_CRYPTO_PERF=y
 # Compile the eventdev application
 #
 CONFIG_RTE_APP_EVENTDEV=y
+
+#
+# Compile the vdev bus
+#
+CONFIG_RTE_LIBRTE_VDEV_BUS=y
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 898f7a5..79f810a 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -300,6 +300,13 @@ API Changes
 * ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
   in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
+* **Moved the following APIs from eal library to bus_vdev library**
+
+  * ``rte_vdev_init``
+  * ``rte_vdev_register``
+  * ``rte_vdev_uninit``
+  * ``rte_vdev_unregister``
+
 ABI Changes
 -----------
 
@@ -355,11 +362,12 @@ The libraries prepended with a plus sign were incremented in this version.
 
      librte_acl.so.2
    + librte_bitratestats.so.2
+   + librte_bus_vdev.so.1
      librte_cfgfile.so.2
      librte_cmdline.so.2
      librte_cryptodev.so.4
      librte_distributor.so.1
-   + librte_eal.so.6
+   + librte_eal.so.7
    + librte_ethdev.so.8
    + librte_eventdev.so.3
    + librte_flow_classify.so.1
diff --git a/drivers/bus/Makefile b/drivers/bus/Makefile
index 4b29e3d..cb12d19 100644
--- a/drivers/bus/Makefile
+++ b/drivers/bus/Makefile
@@ -36,4 +36,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_DPAA_BUS) += dpaa
 
 DIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc
 
+DIRS-$(CONFIG_RTE_LIBRTE_VDEV_BUS) += vdev
+DEPDIRS-vdev = $(core-libs)
+
 include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile
new file mode 100644
index 0000000..6c48ba0
--- /dev/null
+++ b/drivers/bus/vdev/Makefile
@@ -0,0 +1,55 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_bus_vdev.a
+
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+# versioning export map
+EXPORT_MAP := rte_bus_vdev_version.map
+
+# library version
+LIBABIVER := 1
+
+SRCS-y += vdev.c
+
+#
+# Export include files
+#
+SYMLINK-y-include += rte_vdev.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/bus/vdev/rte_bus_vdev_version.map b/drivers/bus/vdev/rte_bus_vdev_version.map
new file mode 100644
index 0000000..6ccb789
--- /dev/null
+++ b/drivers/bus/vdev/rte_bus_vdev_version.map
@@ -0,0 +1,8 @@
+DPDK_17.11 {
+	global:
+
+	rte_vdev_init;
+	rte_vdev_register;
+	rte_vdev_uninit;
+	rte_vdev_unregister;
+};
diff --git a/drivers/bus/vdev/rte_vdev.h b/drivers/bus/vdev/rte_vdev.h
new file mode 100644
index 0000000..41762b8
--- /dev/null
+++ b/drivers/bus/vdev/rte_vdev.h
@@ -0,0 +1,153 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of RehiveTech nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RTE_VDEV_H
+#define RTE_VDEV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/queue.h>
+#include <rte_dev.h>
+#include <rte_devargs.h>
+
+struct rte_vdev_device {
+	TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
+	struct rte_device device;               /**< Inherit core device */
+};
+
+/**
+ * @internal
+ * Helper macro for drivers that need to convert to struct rte_vdev_device.
+ */
+#define RTE_DEV_TO_VDEV(ptr) \
+	container_of(ptr, struct rte_vdev_device, device)
+
+static inline const char *
+rte_vdev_device_name(const struct rte_vdev_device *dev)
+{
+	if (dev && dev->device.name)
+		return dev->device.name;
+	return NULL;
+}
+
+static inline const char *
+rte_vdev_device_args(const struct rte_vdev_device *dev)
+{
+	if (dev && dev->device.devargs)
+		return dev->device.devargs->args;
+	return "";
+}
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
+
+/**
+ * Probe function called for each virtual device driver once.
+ */
+typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
+
+/**
+ * Remove function called for each virtual device driver once.
+ */
+typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
+
+/**
+ * A virtual device driver abstraction.
+ */
+struct rte_vdev_driver {
+	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
+	struct rte_driver driver;      /**< Inherited general driver. */
+	rte_vdev_probe_t *probe;       /**< Virtual device probe function. */
+	rte_vdev_remove_t *remove;     /**< Virtual device remove function. */
+};
+
+/**
+ * Register a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be registered.
+ */
+void rte_vdev_register(struct rte_vdev_driver *driver);
+
+/**
+ * Unregister a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vdev_driver structure describing the driver
+ *   to be unregistered.
+ */
+void rte_vdev_unregister(struct rte_vdev_driver *driver);
+
+#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
+RTE_INIT(vdrvinitfn_ ##vdrv);\
+static const char *vdrvinit_ ## nm ## _alias;\
+static void vdrvinitfn_ ##vdrv(void)\
+{\
+	(vdrv).driver.name = RTE_STR(nm);\
+	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
+	rte_vdev_register(&vdrv);\
+} \
+RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
+
+#define RTE_PMD_REGISTER_ALIAS(nm, alias)\
+static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
+
+/**
+ * Initialize a driver specified by name.
+ *
+ * @param name
+ *   The pointer to a driver name to be initialized.
+ * @param args
+ *   The pointer to arguments used by driver initialization.
+ * @return
+ *  0 on success, negative on error
+ */
+int rte_vdev_init(const char *name, const char *args);
+
+/**
+ * Uninitalize a driver specified by name.
+ *
+ * @param name
+ *   The pointer to a driver name to be initialized.
+ * @return
+ *  0 on success, negative on error
+ */
+int rte_vdev_uninit(const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
new file mode 100644
index 0000000..a16eb71
--- /dev/null
+++ b/drivers/bus/vdev/vdev.c
@@ -0,0 +1,344 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 RehiveTech. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of RehiveTech nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <sys/queue.h>
+
+#include <rte_eal.h>
+#include <rte_dev.h>
+#include <rte_bus.h>
+#include <rte_common.h>
+#include <rte_devargs.h>
+#include <rte_memory.h>
+#include <rte_errno.h>
+
+#include "rte_vdev.h"
+
+/* Forward declare to access virtual bus name */
+static struct rte_bus rte_vdev_bus;
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(vdev_device_list, rte_vdev_device);
+
+static struct vdev_device_list vdev_device_list =
+	TAILQ_HEAD_INITIALIZER(vdev_device_list);
+struct vdev_driver_list vdev_driver_list =
+	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
+
+/* register a driver */
+void
+rte_vdev_register(struct rte_vdev_driver *driver)
+{
+	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
+}
+
+/* unregister a driver */
+void
+rte_vdev_unregister(struct rte_vdev_driver *driver)
+{
+	TAILQ_REMOVE(&vdev_driver_list, driver, next);
+}
+
+static int
+vdev_parse(const char *name, void *addr)
+{
+	struct rte_vdev_driver **out = addr;
+	struct rte_vdev_driver *driver = NULL;
+
+	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
+		if (strncmp(driver->driver.name, name,
+			    strlen(driver->driver.name)) == 0)
+			break;
+		if (driver->driver.alias &&
+		    strncmp(driver->driver.alias, name,
+			    strlen(driver->driver.alias)) == 0)
+			break;
+	}
+	if (driver != NULL &&
+	    addr != NULL)
+		*out = driver;
+	return driver == NULL;
+}
+
+static int
+vdev_probe_all_drivers(struct rte_vdev_device *dev)
+{
+	const char *name;
+	struct rte_vdev_driver *driver;
+	int ret;
+
+	name = rte_vdev_device_name(dev);
+
+	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
+		rte_vdev_device_name(dev));
+
+	if (vdev_parse(name, &driver))
+		return -1;
+	dev->device.driver = &driver->driver;
+	ret = driver->probe(dev);
+	if (ret)
+		dev->device.driver = NULL;
+	return ret;
+}
+
+static struct rte_vdev_device *
+find_vdev(const char *name)
+{
+	struct rte_vdev_device *dev;
+
+	if (!name)
+		return NULL;
+
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+		const char *devname = rte_vdev_device_name(dev);
+
+		if (!strncmp(devname, name, strlen(name)))
+			return dev;
+	}
+
+	return NULL;
+}
+
+static struct rte_devargs *
+alloc_devargs(const char *name, const char *args)
+{
+	struct rte_devargs *devargs;
+	int ret;
+
+	devargs = calloc(1, sizeof(*devargs));
+	if (!devargs)
+		return NULL;
+
+	devargs->bus = &rte_vdev_bus;
+	if (args)
+		devargs->args = strdup(args);
+	else
+		devargs->args = strdup("");
+
+	ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name);
+	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
+		free(devargs->args);
+		free(devargs);
+		return NULL;
+	}
+
+	return devargs;
+}
+
+int
+rte_vdev_init(const char *name, const char *args)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+	int ret;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	dev = find_vdev(name);
+	if (dev)
+		return -EEXIST;
+
+	devargs = alloc_devargs(name, args);
+	if (!devargs)
+		return -ENOMEM;
+
+	dev = calloc(1, sizeof(*dev));
+	if (!dev) {
+		ret = -ENOMEM;
+		goto fail;
+	}
+
+	dev->device.devargs = devargs;
+	dev->device.numa_node = SOCKET_ID_ANY;
+	dev->device.name = devargs->name;
+
+	ret = vdev_probe_all_drivers(dev);
+	if (ret) {
+		if (ret > 0)
+			RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
+		goto fail;
+	}
+
+	TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
+
+	TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+	return 0;
+
+fail:
+	free(devargs->args);
+	free(devargs);
+	free(dev);
+	return ret;
+}
+
+static int
+vdev_remove_driver(struct rte_vdev_device *dev)
+{
+	const char *name = rte_vdev_device_name(dev);
+	const struct rte_vdev_driver *driver;
+
+	if (!dev->device.driver) {
+		RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name);
+		return 1;
+	}
+
+	driver = container_of(dev->device.driver, const struct rte_vdev_driver,
+		driver);
+	return driver->remove(dev);
+}
+
+int
+rte_vdev_uninit(const char *name)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+	int ret;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	dev = find_vdev(name);
+	if (!dev)
+		return -ENOENT;
+
+	devargs = dev->device.devargs;
+
+	ret = vdev_remove_driver(dev);
+	if (ret)
+		return ret;
+
+	TAILQ_REMOVE(&vdev_device_list, dev, next);
+
+	TAILQ_REMOVE(&devargs_list, devargs, next);
+
+	free(devargs->args);
+	free(devargs);
+	free(dev);
+	return 0;
+}
+
+static int
+vdev_scan(void)
+{
+	struct rte_vdev_device *dev;
+	struct rte_devargs *devargs;
+
+	/* for virtual devices we scan the devargs_list populated via cmdline */
+	TAILQ_FOREACH(devargs, &devargs_list, next) {
+
+		if (devargs->bus != &rte_vdev_bus)
+			continue;
+
+		dev = find_vdev(devargs->name);
+		if (dev)
+			continue;
+
+		dev = calloc(1, sizeof(*dev));
+		if (!dev)
+			return -1;
+
+		dev->device.devargs = devargs;
+		dev->device.numa_node = SOCKET_ID_ANY;
+		dev->device.name = devargs->name;
+
+		TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+	}
+
+	return 0;
+}
+
+static int
+vdev_probe(void)
+{
+	struct rte_vdev_device *dev;
+
+	/* call the init function for each virtual device */
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+
+		if (dev->device.driver)
+			continue;
+
+		if (vdev_probe_all_drivers(dev)) {
+			RTE_LOG(ERR, EAL, "failed to initialize %s device\n",
+				rte_vdev_device_name(dev));
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+static struct rte_device *
+vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
+		 const void *data)
+{
+	struct rte_vdev_device *dev;
+
+	TAILQ_FOREACH(dev, &vdev_device_list, next) {
+		if (start && &dev->device == start) {
+			start = NULL;
+			continue;
+		}
+		if (cmp(&dev->device, data) == 0)
+			return &dev->device;
+	}
+	return NULL;
+}
+
+static int
+vdev_plug(struct rte_device *dev)
+{
+	return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev));
+}
+
+static int
+vdev_unplug(struct rte_device *dev)
+{
+	return rte_vdev_uninit(dev->name);
+}
+
+static struct rte_bus rte_vdev_bus = {
+	.scan = vdev_scan,
+	.probe = vdev_probe,
+	.find_device = vdev_find_device,
+	.plug = vdev_plug,
+	.unplug = vdev_unplug,
+	.parse = vdev_parse,
+};
+
+RTE_REGISTER_BUS(vdev, rte_vdev_bus);
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile
index d551541..1cb4cdb 100644
--- a/drivers/crypto/Makefile
+++ b/drivers/crypto/Makefile
@@ -32,6 +32,7 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_cryptodev
+core-libs += librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += aesni_gcm
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_MB) += aesni_mb
diff --git a/drivers/event/Makefile b/drivers/event/Makefile
index 05dec1b..9c9ae82 100644
--- a/drivers/event/Makefile
+++ b/drivers/event/Makefile
@@ -31,7 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
-core-libs := librte_eal librte_ether librte_eventdev
+core-libs := librte_eal librte_ether librte_eventdev librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += skeleton
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index cf33233..00be153 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -37,7 +37,7 @@ ifeq ($(CONFIG_RTE_LIBRTE_THUNDERX_NICVF_PMD),d)
 endif
 
 core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_ether
-core-libs += librte_net librte_kvargs
+core-libs += librte_net librte_kvargs librte_bus_vdev
 
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet
 DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 351fa57..25a48d1 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,7 +48,7 @@ LDLIBS += -lgcc_s
 
 EXPORT_MAP := ../../rte_eal_version.map
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 # specific to bsdapp exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c
@@ -68,7 +68,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_launch.c
-SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_pci.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_pci_uio.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memory.c
diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 6f5b3f3..2fb5635 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -39,7 +39,7 @@ INC += rte_per_lcore.h rte_random.h
 INC += rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_version.h
 INC += rte_eal_memconfig.h rte_malloc_heap.h
-INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h rte_vdev.h
+INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h
 INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
 INC += rte_malloc.h rte_keepalive.h rte_time.h
 INC += rte_service.h rte_service_component.h
diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c
deleted file mode 100644
index f7e547a..0000000
--- a/lib/librte_eal/common/eal_common_vdev.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 RehiveTech. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of RehiveTech nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <string.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <sys/queue.h>
-
-#include <rte_eal.h>
-#include <rte_dev.h>
-#include <rte_bus.h>
-#include <rte_vdev.h>
-#include <rte_common.h>
-#include <rte_devargs.h>
-#include <rte_memory.h>
-#include <rte_errno.h>
-
-/* Forward declare to access virtual bus name */
-static struct rte_bus rte_vdev_bus;
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(vdev_device_list, rte_vdev_device);
-
-static struct vdev_device_list vdev_device_list =
-	TAILQ_HEAD_INITIALIZER(vdev_device_list);
-struct vdev_driver_list vdev_driver_list =
-	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
-
-/* register a driver */
-void
-rte_vdev_register(struct rte_vdev_driver *driver)
-{
-	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
-}
-
-/* unregister a driver */
-void
-rte_vdev_unregister(struct rte_vdev_driver *driver)
-{
-	TAILQ_REMOVE(&vdev_driver_list, driver, next);
-}
-
-static int
-vdev_parse(const char *name, void *addr)
-{
-	struct rte_vdev_driver **out = addr;
-	struct rte_vdev_driver *driver = NULL;
-
-	TAILQ_FOREACH(driver, &vdev_driver_list, next) {
-		if (strncmp(driver->driver.name, name,
-			    strlen(driver->driver.name)) == 0)
-			break;
-		if (driver->driver.alias &&
-		    strncmp(driver->driver.alias, name,
-			    strlen(driver->driver.alias)) == 0)
-			break;
-	}
-	if (driver != NULL &&
-	    addr != NULL)
-		*out = driver;
-	return driver == NULL;
-}
-
-static int
-vdev_probe_all_drivers(struct rte_vdev_device *dev)
-{
-	const char *name;
-	struct rte_vdev_driver *driver;
-	int ret;
-
-	name = rte_vdev_device_name(dev);
-
-	RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name,
-		rte_vdev_device_name(dev));
-
-	if (vdev_parse(name, &driver))
-		return -1;
-	dev->device.driver = &driver->driver;
-	ret = driver->probe(dev);
-	if (ret)
-		dev->device.driver = NULL;
-	return ret;
-}
-
-static struct rte_vdev_device *
-find_vdev(const char *name)
-{
-	struct rte_vdev_device *dev;
-
-	if (!name)
-		return NULL;
-
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-		const char *devname = rte_vdev_device_name(dev);
-		if (!strncmp(devname, name, strlen(name)))
-			return dev;
-	}
-
-	return NULL;
-}
-
-static struct rte_devargs *
-alloc_devargs(const char *name, const char *args)
-{
-	struct rte_devargs *devargs;
-	int ret;
-
-	devargs = calloc(1, sizeof(*devargs));
-	if (!devargs)
-		return NULL;
-
-	devargs->bus = &rte_vdev_bus;
-	if (args)
-		devargs->args = strdup(args);
-	else
-		devargs->args = strdup("");
-
-	ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name);
-	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
-		free(devargs->args);
-		free(devargs);
-		return NULL;
-	}
-
-	return devargs;
-}
-
-int
-rte_vdev_init(const char *name, const char *args)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-	int ret;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	dev = find_vdev(name);
-	if (dev)
-		return -EEXIST;
-
-	devargs = alloc_devargs(name, args);
-	if (!devargs)
-		return -ENOMEM;
-
-	dev = calloc(1, sizeof(*dev));
-	if (!dev) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
-	dev->device.devargs = devargs;
-	dev->device.numa_node = SOCKET_ID_ANY;
-	dev->device.name = devargs->name;
-
-	ret = vdev_probe_all_drivers(dev);
-	if (ret) {
-		if (ret > 0)
-			RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
-		goto fail;
-	}
-
-	TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
-
-	TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
-	return 0;
-
-fail:
-	free(devargs->args);
-	free(devargs);
-	free(dev);
-	return ret;
-}
-
-static int
-vdev_remove_driver(struct rte_vdev_device *dev)
-{
-	const char *name = rte_vdev_device_name(dev);
-	const struct rte_vdev_driver *driver;
-
-	if (!dev->device.driver) {
-		RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name);
-		return 1;
-	}
-
-	driver = container_of(dev->device.driver, const struct rte_vdev_driver,
-		driver);
-	return driver->remove(dev);
-}
-
-int
-rte_vdev_uninit(const char *name)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-	int ret;
-
-	if (name == NULL)
-		return -EINVAL;
-
-	dev = find_vdev(name);
-	if (!dev)
-		return -ENOENT;
-
-	devargs = dev->device.devargs;
-
-	ret = vdev_remove_driver(dev);
-	if (ret)
-		return ret;
-
-	TAILQ_REMOVE(&vdev_device_list, dev, next);
-
-	TAILQ_REMOVE(&devargs_list, devargs, next);
-
-	free(devargs->args);
-	free(devargs);
-	free(dev);
-	return 0;
-}
-
-static int
-vdev_scan(void)
-{
-	struct rte_vdev_device *dev;
-	struct rte_devargs *devargs;
-
-	/* for virtual devices we scan the devargs_list populated via cmdline */
-	TAILQ_FOREACH(devargs, &devargs_list, next) {
-
-		if (devargs->bus != &rte_vdev_bus)
-			continue;
-
-		dev = find_vdev(devargs->name);
-		if (dev)
-			continue;
-
-		dev = calloc(1, sizeof(*dev));
-		if (!dev)
-			return -1;
-
-		dev->device.devargs = devargs;
-		dev->device.numa_node = SOCKET_ID_ANY;
-		dev->device.name = devargs->name;
-
-		TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
-	}
-
-	return 0;
-}
-
-static int
-vdev_probe(void)
-{
-	struct rte_vdev_device *dev;
-
-	/* call the init function for each virtual device */
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-
-		if (dev->device.driver)
-			continue;
-
-		if (vdev_probe_all_drivers(dev)) {
-			RTE_LOG(ERR, EAL, "failed to initialize %s device\n",
-				rte_vdev_device_name(dev));
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static struct rte_device *
-vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
-		 const void *data)
-{
-	struct rte_vdev_device *dev;
-
-	TAILQ_FOREACH(dev, &vdev_device_list, next) {
-		if (start && &dev->device == start) {
-			start = NULL;
-			continue;
-		}
-		if (cmp(&dev->device, data) == 0)
-			return &dev->device;
-	}
-	return NULL;
-}
-
-static int
-vdev_plug(struct rte_device *dev)
-{
-	return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev));
-}
-
-static int
-vdev_unplug(struct rte_device *dev)
-{
-	return rte_vdev_uninit(dev->name);
-}
-
-static struct rte_bus rte_vdev_bus = {
-	.scan = vdev_scan,
-	.probe = vdev_probe,
-	.find_device = vdev_find_device,
-	.plug = vdev_plug,
-	.unplug = vdev_unplug,
-	.parse = vdev_parse,
-};
-
-RTE_REGISTER_BUS(vdev, rte_vdev_bus);
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index 4c4ac7e..8088dcc 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -170,28 +170,6 @@ struct rte_device {
 };
 
 /**
- * Initialize a driver specified by name.
- *
- * @param name
- *   The pointer to a driver name to be initialized.
- * @param args
- *   The pointer to arguments used by driver initialization.
- * @return
- *  0 on success, negative on error
- */
-int rte_vdev_init(const char *name, const char *args);
-
-/**
- * Uninitalize a driver specified by name.
- *
- * @param name
- *   The pointer to a driver name to be initialized.
- * @return
- *  0 on success, negative on error
- */
-int rte_vdev_uninit(const char *name);
-
-/**
  * Attach a device to a registered driver.
  *
  * @param name
@@ -316,4 +294,4 @@ __attribute__((used)) = str
 }
 #endif
 
-#endif /* _RTE_VDEV_H_ */
+#endif /* _RTE_DEV_H_ */
diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h
deleted file mode 100644
index 29f5a52..0000000
--- a/lib/librte_eal/common/include/rte_vdev.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 RehiveTech. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of RehiveTech nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef RTE_VDEV_H
-#define RTE_VDEV_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/queue.h>
-#include <rte_dev.h>
-#include <rte_devargs.h>
-
-struct rte_vdev_device {
-	TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
-	struct rte_device device;               /**< Inherit core device */
-};
-
-/**
- * @internal
- * Helper macro for drivers that need to convert to struct rte_vdev_device.
- */
-#define RTE_DEV_TO_VDEV(ptr) \
-	container_of(ptr, struct rte_vdev_device, device)
-
-static inline const char *
-rte_vdev_device_name(const struct rte_vdev_device *dev)
-{
-	if (dev && dev->device.name)
-		return dev->device.name;
-	return NULL;
-}
-
-static inline const char *
-rte_vdev_device_args(const struct rte_vdev_device *dev)
-{
-	if (dev && dev->device.devargs)
-		return dev->device.devargs->args;
-	return "";
-}
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(vdev_driver_list, rte_vdev_driver);
-
-/**
- * Probe function called for each virtual device driver once.
- */
-typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
-
-/**
- * Remove function called for each virtual device driver once.
- */
-typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
-
-/**
- * A virtual device driver abstraction.
- */
-struct rte_vdev_driver {
-	TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
-	struct rte_driver driver;      /**< Inherited general driver. */
-	rte_vdev_probe_t *probe;       /**< Virtual device probe function. */
-	rte_vdev_remove_t *remove;     /**< Virtual device remove function. */
-};
-
-/**
- * Register a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev_driver structure describing the driver
- *   to be registered.
- */
-void rte_vdev_register(struct rte_vdev_driver *driver);
-
-/**
- * Unregister a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev_driver structure describing the driver
- *   to be unregistered.
- */
-void rte_vdev_unregister(struct rte_vdev_driver *driver);
-
-#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
-RTE_INIT(vdrvinitfn_ ##vdrv);\
-static const char *vdrvinit_ ## nm ## _alias;\
-static void vdrvinitfn_ ##vdrv(void)\
-{\
-	(vdrv).driver.name = RTE_STR(nm);\
-	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
-	rte_vdev_register(&vdrv);\
-} \
-RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
-
-#define RTE_PMD_REGISTER_ALIAS(nm, alias)\
-static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 965da6e..eef80eb 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -37,7 +37,7 @@ ARCH_DIR ?= $(RTE_ARCH)
 EXPORT_MAP := ../../rte_eal_version.map
 VPATH += $(RTE_SDK)/lib/librte_eal/common/arch/$(ARCH_DIR)
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
@@ -77,7 +77,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_timer.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memzone.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_launch.c
-SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_vdev.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci_uio.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memory.c
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index 8eb53ab..f9edb29 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -181,10 +181,6 @@ DPDK_17.05 {
 	rte_pci_unmap_device;
 	rte_pci_unregister;
 	rte_pci_write_config;
-	rte_vdev_init;
-	rte_vdev_register;
-	rte_vdev_uninit;
-	rte_vdev_unregister;
 	vfio_get_container_fd;
 	vfio_get_group_fd;
 	vfio_get_group_no;
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 482656c..6780f4f 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -99,6 +99,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_MEMPOOL)        += -lrte_mempool
 _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING)   += -lrte_mempool_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_RING)           += -lrte_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lrte_eal
+_LDLIBS-$(CONFIG_RTE_LIBRTE_VDEV_BUS)       += -lrte_bus_vdev
 _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE)        += -lrte_cmdline
 _LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER)        += -lrte_reorder
 _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED)          += -lrte_sched
diff --git a/test/test/test_cryptodev.c b/test/test/test_cryptodev.c
index a926779..2e80062 100644
--- a/test/test/test_cryptodev.c
+++ b/test/test/test_cryptodev.c
@@ -36,6 +36,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_pause.h>
+#include <rte_vdev.h>
 
 #include <rte_crypto.h>
 #include <rte_cryptodev.h>
diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
index 56ed1f8..c0b864b 100644
--- a/test/test/test_event_eth_rx_adapter.c
+++ b/test/test/test_event_eth_rx_adapter.c
@@ -35,6 +35,7 @@
 #include <rte_mbuf.h>
 #include <rte_ethdev.h>
 #include <rte_eventdev.h>
+#include <rte_vdev.h>
 
 #include <rte_event_eth_rx_adapter.h>
 
diff --git a/test/test/test_eventdev.c b/test/test/test_eventdev.c
index d6ade78..e3d36f3 100644
--- a/test/test/test_eventdev.c
+++ b/test/test/test_eventdev.c
@@ -37,6 +37,7 @@
 #include <rte_memcpy.h>
 #include <rte_eventdev.h>
 #include <rte_dev.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_eventdev_octeontx.c b/test/test/test_eventdev_octeontx.c
index b88b0d2..ecae3e9 100644
--- a/test/test/test_eventdev_octeontx.c
+++ b/test/test/test_eventdev_octeontx.c
@@ -45,6 +45,7 @@
 #include <rte_lcore.h>
 #include <rte_per_lcore.h>
 #include <rte_random.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_eventdev_sw.c b/test/test/test_eventdev_sw.c
index 7219886..385e743 100644
--- a/test/test/test_eventdev_sw.c
+++ b/test/test/test_eventdev_sw.c
@@ -49,6 +49,7 @@
 #include <rte_cycles.h>
 #include <rte_eventdev.h>
 #include <rte_pause.h>
+#include <rte_vdev.h>
 
 #include "test.h"
 
diff --git a/test/test/test_link_bonding_rssconf.c b/test/test/test_link_bonding_rssconf.c
index 7dccc6e..6199188 100644
--- a/test/test/test_link_bonding_rssconf.c
+++ b/test/test/test_link_bonding_rssconf.c
@@ -48,6 +48,7 @@
 #include <rte_log.h>
 #include <rte_lcore.h>
 #include <rte_memory.h>
+#include <rte_vdev.h>
 
 #include <rte_string_fns.h>
 #include <rte_errno.h>
-- 
2.7.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v2] mbuf: rename deprecated VLAN flags
  2017-10-23 12:16  2% [dpdk-dev] [PATCH] mbuf: rename deprecated VLAN flags Olivier Matz
@ 2017-10-25 15:12  2% ` Olivier Matz
  0 siblings, 0 replies; 200+ results
From: Olivier Matz @ 2017-10-25 15:12 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, thomas

PKT_RX_VLAN_PKT and PKT_RX_QINQ_PKT are deprecated for a while.
As explained in [1], these flags were kept to let the applications and
PMDs move to the new flag. There is also a need to support Rx vlan
offload without vlan strip (at least for the ixgbe driver).

This patch renames the old flags for this feature, knowing that some
PMDs were using PKT_RX_VLAN_PKT and PKT_RX_QINQ_PKT to indicate that
the vlan tci has been saved in the mbuf structure.

It is likely that some PMDs do not set the proper flags when doing vlan
offload, and it would be worth making a pass on all of them.

Link: [1] http://dpdk.org/ml/archives/dev/2017-June/067712.html
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---

v1->v2
- rebase on latest net-next
- clarify api documentation to highlight that when using the
  flag PKT_RX_xyz_STRIPPED, then PKT_RX_xyz must be set too.

 doc/guides/rel_notes/deprecation.rst      |  5 -----
 doc/guides/rel_notes/release_17_11.rst    | 13 ++++++++++++
 drivers/net/af_packet/rte_eth_af_packet.c |  2 +-
 drivers/net/avp/avp_ethdev.c              |  4 ++--
 drivers/net/bnx2x/bnx2x_rxtx.c            |  2 +-
 drivers/net/bnxt/bnxt_rxr.c               |  4 ++--
 drivers/net/bonding/rte_eth_bond_pmd.c    |  2 +-
 drivers/net/cxgbe/sge.c                   |  4 ++--
 drivers/net/dpaa/dpaa_rxtx.c              |  2 +-
 drivers/net/dpaa2/dpaa2_rxtx.c            |  2 +-
 drivers/net/e1000/em_rxtx.c               |  6 +++---
 drivers/net/e1000/igb_rxtx.c              |  6 +++---
 drivers/net/enic/enic_rxtx.c              |  2 +-
 drivers/net/fm10k/fm10k_rxtx.c            |  8 ++++----
 drivers/net/fm10k/fm10k_rxtx_vec.c        |  4 ++--
 drivers/net/i40e/i40e_rxtx.c              |  2 +-
 drivers/net/i40e/i40e_rxtx_vec_altivec.c  |  2 +-
 drivers/net/i40e/i40e_rxtx_vec_neon.c     |  2 +-
 drivers/net/i40e/i40e_rxtx_vec_sse.c      |  2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c          |  4 ++--
 drivers/net/ixgbe/ixgbe_rxtx.c            |  4 ++--
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c   |  4 ++--
 drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c    |  2 +-
 drivers/net/mlx5/mlx5_rxtx.c              |  2 +-
 drivers/net/mlx5/mlx5_rxtx_vec_neon.h     |  4 ++--
 drivers/net/mlx5/mlx5_rxtx_vec_sse.h      | 10 +++++-----
 drivers/net/nfp/nfp_net.c                 |  2 +-
 drivers/net/qede/qede_rxtx.c              |  2 +-
 drivers/net/vmxnet3/vmxnet3_rxtx.c        |  3 ++-
 lib/librte_mbuf/rte_mbuf.c                |  5 +++--
 lib/librte_mbuf/rte_mbuf.h                | 33 ++++++++++++++++++-------------
 lib/librte_net/rte_ether.h                |  2 +-
 32 files changed, 83 insertions(+), 68 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 3a5d09366..d14fd021c 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -28,11 +28,6 @@ Deprecation Notices
   The change will be only for the name.
   Functional aspects of the API or data-structure will remain same.
 
-* The mbuf flags PKT_RX_VLAN_PKT and PKT_RX_QINQ_PKT are deprecated and
-  are respectively replaced by PKT_RX_VLAN_STRIPPED and
-  PKT_RX_QINQ_STRIPPED, that are better described. The old flags and
-  their behavior will be kept until 17.08 and will be removed in 17.11.
-
 * ethdev: Tx offloads will no longer be enabled by default in 17.11.
   Instead, the ``rte_eth_txmode`` structure will be extended with
   bit field to enable each Tx offload.
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index e505a4dcd..ffe74030b 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -322,6 +322,19 @@ API Changes
   ``rte_log_get_global_level()``, ``rte_log_set_level()`` and
   ``rte_log_get_level()``.
 
+* **Removed ``mbuf`` flags ``PKT_RX_VLAN_PKT`` and ``PKT_RX_QINQ_PKT``.**
+
+  The ``mbuf`` flags ``PKT_RX_VLAN_PKT`` and ``PKT_RX_QINQ_PKT`` have
+  been removed since their behavior were not properly described.
+
+* **Added ``mbuf`` flags ``PKT_RX_VLAN`` and ``PKT_RX_QINQ``.**
+
+  Two ``mbuf`` flags have been added to indicate that the VLAN
+  identifier has been saved in in the ``mbuf`` structure. For instance:
+
+  - if VLAN is not stripped and TCI is saved: ``PKT_RX_VLAN``
+  - if VLAN is stripped and TCI is saved: ``PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED``
+
 
 ABI Changes
 -----------
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index 46b8250d0..dc1867057 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -167,7 +167,7 @@ eth_af_packet_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 		/* check for vlan info */
 		if (ppd->tp_status & TP_STATUS_VLAN_VALID) {
 			mbuf->vlan_tci = ppd->tp_vlan_tci;
-			mbuf->ol_flags |= (PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED);
+			mbuf->ol_flags |= (PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED);
 		}
 
 		/* release incoming frame and advance ring buffer */
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index b97a90cea..43b33dbf2 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -1361,7 +1361,7 @@ avp_dev_copy_from_buffers(struct avp_dev *avp,
 	src_offset = 0;
 
 	if (pkt_buf->ol_flags & RTE_AVP_RX_VLAN_PKT) {
-		ol_flags = PKT_RX_VLAN_PKT;
+		ol_flags = PKT_RX_VLAN;
 		vlan_tci = pkt_buf->vlan_tci;
 	} else {
 		ol_flags = 0;
@@ -1619,7 +1619,7 @@ avp_recv_pkts(void *rx_queue,
 		m->port = avp->port_id;
 
 		if (pkt_buf->ol_flags & RTE_AVP_RX_VLAN_PKT) {
-			m->ol_flags = PKT_RX_VLAN_PKT;
+			m->ol_flags = PKT_RX_VLAN;
 			m->vlan_tci = pkt_buf->vlan_tci;
 		}
 
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.c b/drivers/net/bnx2x/bnx2x_rxtx.c
index 5dd4aee7f..c72067f6f 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.c
+++ b/drivers/net/bnx2x/bnx2x_rxtx.c
@@ -422,7 +422,7 @@ bnx2x_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		 */
 		if (cqe_fp->pars_flags.flags & PARSING_FLAGS_VLAN) {
 			rx_mb->vlan_tci = cqe_fp->vlan_tag;
-			rx_mb->ol_flags |= PKT_RX_VLAN_PKT;
+			rx_mb->ol_flags |= PKT_RX_VLAN;
 		}
 
 		rx_pkts[nb_rx] = rx_mb;
diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index d68d26f17..30891b74f 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -199,7 +199,7 @@ static void bnxt_tpa_start(struct bnxt_rx_queue *rxq,
 	if (tpa_start1->flags2 &
 	    rte_cpu_to_le_32(RX_TPA_START_CMPL_FLAGS2_META_FORMAT_VLAN)) {
 		mbuf->vlan_tci = rte_le_to_cpu_32(tpa_start1->metadata);
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 	}
 	if (likely(tpa_start1->flags2 &
 		   rte_cpu_to_le_32(RX_TPA_START_CMPL_FLAGS2_L4_CS_CALC)))
@@ -464,7 +464,7 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
 			(RX_PKT_CMPL_METADATA_VID_MASK |
 			RX_PKT_CMPL_METADATA_DE |
 			RX_PKT_CMPL_METADATA_PRI_MASK);
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 	}
 
 	if (likely(RX_CMP_IP_CS_OK(rxcmp1)))
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 3fbc1b123..c48993940 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -129,7 +129,7 @@ is_lacp_packets(uint16_t ethertype, uint8_t subtype, struct rte_mbuf *mbuf)
 {
 	const uint16_t ether_type_slow_be = rte_be_to_cpu_16(ETHER_TYPE_SLOW);
 
-	return !((mbuf->ol_flags & PKT_RX_VLAN_PKT) ? mbuf->vlan_tci : 0) &&
+	return !((mbuf->ol_flags & PKT_RX_VLAN) ? mbuf->vlan_tci : 0) &&
 		(ethertype == ether_type_slow_be &&
 		(subtype == SLOW_SUBTYPE_MARKER || subtype == SLOW_SUBTYPE_LACP));
 }
diff --git a/drivers/net/cxgbe/sge.c b/drivers/net/cxgbe/sge.c
index 5376fc500..33f7f0bc2 100644
--- a/drivers/net/cxgbe/sge.c
+++ b/drivers/net/cxgbe/sge.c
@@ -1405,7 +1405,7 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
 	}
 
 	if (pkt->vlan_ex) {
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 		mbuf->vlan_tci = ntohs(pkt->vlan);
 	}
 	rxq->stats.pkts++;
@@ -1550,7 +1550,7 @@ static int process_responses(struct sge_rspq *q, int budget,
 				}
 
 				if (cpl->vlan_ex) {
-					pkt->ol_flags |= PKT_RX_VLAN_PKT;
+					pkt->ol_flags |= PKT_RX_VLAN;
 					pkt->vlan_tci = ntohs(cpl->vlan);
 				}
 
diff --git a/drivers/net/dpaa/dpaa_rxtx.c b/drivers/net/dpaa/dpaa_rxtx.c
index 0433f3bb1..f7cfff798 100644
--- a/drivers/net/dpaa/dpaa_rxtx.c
+++ b/drivers/net/dpaa/dpaa_rxtx.c
@@ -219,7 +219,7 @@ static inline void dpaa_eth_packet_info(struct rte_mbuf *m,
 
 	/* Check if Vlan is present */
 	if (prs & DPAA_PARSE_VLAN_MASK)
-		m->ol_flags |= PKT_RX_VLAN_PKT;
+		m->ol_flags |= PKT_RX_VLAN;
 	/* Packet received without stripping the vlan */
 }
 
diff --git a/drivers/net/dpaa2/dpaa2_rxtx.c b/drivers/net/dpaa2/dpaa2_rxtx.c
index 7cfa73a8c..3f57dc227 100644
--- a/drivers/net/dpaa2/dpaa2_rxtx.c
+++ b/drivers/net/dpaa2/dpaa2_rxtx.c
@@ -122,7 +122,7 @@ dpaa2_dev_rx_offload(uint64_t hw_annot_addr, struct rte_mbuf *mbuf)
 
 	if (BIT_ISSET_AT_POS(annotation->word3,
 			     L2_VLAN_1_PRESENT | L2_VLAN_N_PRESENT))
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 
 	if (BIT_ISSET_AT_POS(annotation->word8, DPAA2_ETH_FAS_L3CE))
 		mbuf->ol_flags |= PKT_RX_IP_CKSUM_BAD;
diff --git a/drivers/net/e1000/em_rxtx.c b/drivers/net/e1000/em_rxtx.c
index 92b66b0ea..d4d5fe6e1 100644
--- a/drivers/net/e1000/em_rxtx.c
+++ b/drivers/net/e1000/em_rxtx.c
@@ -675,7 +675,7 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status)
 
 	/* Check if VLAN present */
 	pkt_flags = ((rx_status & E1000_RXD_STAT_VP) ?
-		PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED : 0);
+		PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED : 0);
 
 	return pkt_flags;
 }
@@ -830,7 +830,7 @@ eth_em_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		rxm->ol_flags = rxm->ol_flags |
 				rx_desc_error_to_pkt_flags(rxd.errors);
 
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
+		/* Only valid if PKT_RX_VLAN set in pkt_flags */
 		rxm->vlan_tci = rte_le_to_cpu_16(rxd.special);
 
 		/*
@@ -1056,7 +1056,7 @@ eth_em_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		first_seg->ol_flags = first_seg->ol_flags |
 					rx_desc_error_to_pkt_flags(rxd.errors);
 
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
+		/* Only valid if PKT_RX_VLAN set in pkt_flags */
 		rxm->vlan_tci = rte_le_to_cpu_16(rxd.special);
 
 		/* Prefetch data of first segment, if configured to do so. */
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index 8a1e5b18e..d25ea048d 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -785,7 +785,7 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status)
 
 	/* Check if VLAN present */
 	pkt_flags = ((rx_status & E1000_RXD_STAT_VP) ?
-		PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED : 0);
+		PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED : 0);
 
 #if defined(RTE_LIBRTE_IEEE1588)
 	if (rx_status & E1000_RXD_STAT_TMST)
@@ -946,7 +946,7 @@ eth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 
 		rxm->hash.rss = rxd.wb.lower.hi_dword.rss;
 		hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
+		/* Only valid if PKT_RX_VLAN set in pkt_flags */
 		rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);
 
 		pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(rxq, hlen_type_rss);
@@ -1180,7 +1180,7 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		first_seg->hash.rss = rxd.wb.lower.hi_dword.rss;
 
 		/*
-		 * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is
+		 * The vlan_tci field is only valid when PKT_RX_VLAN is
 		 * set in the pkt_flags field.
 		 */
 		first_seg->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);
diff --git a/drivers/net/enic/enic_rxtx.c b/drivers/net/enic/enic_rxtx.c
index a39172f14..1d43bde9a 100644
--- a/drivers/net/enic/enic_rxtx.c
+++ b/drivers/net/enic/enic_rxtx.c
@@ -243,7 +243,7 @@ enic_cq_rx_to_pkt_flags(struct cq_desc *cqd, struct rte_mbuf *mbuf)
 
 	/* VLAN STRIPPED flag. The L2 packet type updated here also */
 	if (bwflags & CQ_ENET_RQ_DESC_FLAGS_VLAN_STRIPPED) {
-		pkt_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+		pkt_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 		mbuf->packet_type |= RTE_PTYPE_L2_ETHER;
 	} else {
 		if (vlan_tci != 0)
diff --git a/drivers/net/fm10k/fm10k_rxtx.c b/drivers/net/fm10k/fm10k_rxtx.c
index 4e84926f8..d6081e485 100644
--- a/drivers/net/fm10k/fm10k_rxtx.c
+++ b/drivers/net/fm10k/fm10k_rxtx.c
@@ -158,10 +158,10 @@ fm10k_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		 * Packets in fm10k device always carry at least one VLAN tag.
 		 * For those packets coming in without VLAN tag,
 		 * the port default VLAN tag will be used.
-		 * So, always PKT_RX_VLAN_PKT flag is set and vlan_tci
+		 * So, always PKT_RX_VLAN flag is set and vlan_tci
 		 * is valid for each RX packet's mbuf.
 		 */
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 		mbuf->vlan_tci = desc.w.vlan;
 		/**
 		 * mbuf->vlan_tci_outer is an idle field in fm10k driver,
@@ -319,10 +319,10 @@ fm10k_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		 * Packets in fm10k device always carry at least one VLAN tag.
 		 * For those packets coming in without VLAN tag,
 		 * the port default VLAN tag will be used.
-		 * So, always PKT_RX_VLAN_PKT flag is set and vlan_tci
+		 * So, always PKT_RX_VLAN flag is set and vlan_tci
 		 * is valid for each RX packet's mbuf.
 		 */
-		first_seg->ol_flags |= PKT_RX_VLAN_PKT;
+		first_seg->ol_flags |= PKT_RX_VLAN;
 		first_seg->vlan_tci = desc.w.vlan;
 		/**
 		 * mbuf->vlan_tci_outer is an idle field in fm10k driver,
diff --git a/drivers/net/fm10k/fm10k_rxtx_vec.c b/drivers/net/fm10k/fm10k_rxtx_vec.c
index d23bfe9b7..edc4ae16e 100644
--- a/drivers/net/fm10k/fm10k_rxtx_vec.c
+++ b/drivers/net/fm10k/fm10k_rxtx_vec.c
@@ -81,8 +81,8 @@ fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
 
 	const __m128i pkttype_msk = _mm_set_epi16(
 			0x0000, 0x0000, 0x0000, 0x0000,
-			PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT,
-			PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT);
+			PKT_RX_VLAN, PKT_RX_VLAN,
+			PKT_RX_VLAN, PKT_RX_VLAN);
 
 	/* mask everything except rss type */
 	const __m128i rsstype_msk = _mm_set_epi16(
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index f21c1c5d2..904d37f08 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -108,7 +108,7 @@ i40e_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union i40e_rx_desc *rxdp)
 {
 	if (rte_le_to_cpu_64(rxdp->wb.qword1.status_error_len) &
 		(1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) {
-		mb->ol_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+		mb->ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 		mb->vlan_tci =
 			rte_le_to_cpu_16(rxdp->wb.qword0.lo_dword.l2tag1);
 		PMD_RX_LOG(DEBUG, "Descriptor l2tag1: %u",
diff --git a/drivers/net/i40e/i40e_rxtx_vec_altivec.c b/drivers/net/i40e/i40e_rxtx_vec_altivec.c
index f4036ea28..5ab9445ed 100644
--- a/drivers/net/i40e/i40e_rxtx_vec_altivec.c
+++ b/drivers/net/i40e/i40e_rxtx_vec_altivec.c
@@ -146,7 +146,7 @@ desc_to_olflags_v(vector unsigned long descs[4], struct rte_mbuf **rx_pkts)
 	/* map rss and vlan type to rss hash and vlan flag */
 	const vector unsigned char vlan_flags = (vector unsigned char){
 			0, 0, 0, 0,
-			PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED, 0, 0, 0,
+			PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED, 0, 0, 0,
 			0, 0, 0, 0,
 			0, 0, 0, 0};
 
diff --git a/drivers/net/i40e/i40e_rxtx_vec_neon.c b/drivers/net/i40e/i40e_rxtx_vec_neon.c
index 694e91f33..d0e604068 100644
--- a/drivers/net/i40e/i40e_rxtx_vec_neon.c
+++ b/drivers/net/i40e/i40e_rxtx_vec_neon.c
@@ -137,7 +137,7 @@ desc_to_olflags_v(struct i40e_rx_queue *rxq, uint64x2_t descs[4],
 	/* map rss and vlan type to rss hash and vlan flag */
 	const uint8x16_t vlan_flags = {
 			0, 0, 0, 0,
-			PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED, 0, 0, 0,
+			PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED, 0, 0, 0,
 			0, 0, 0, 0,
 			0, 0, 0, 0};
 
diff --git a/drivers/net/i40e/i40e_rxtx_vec_sse.c b/drivers/net/i40e/i40e_rxtx_vec_sse.c
index 779f14e53..86e16ddf9 100644
--- a/drivers/net/i40e/i40e_rxtx_vec_sse.c
+++ b/drivers/net/i40e/i40e_rxtx_vec_sse.c
@@ -151,7 +151,7 @@ desc_to_olflags_v(struct i40e_rx_queue *rxq, __m128i descs[4],
 	/* map rss and vlan type to rss hash and vlan flag */
 	const __m128i vlan_flags = _mm_set_epi8(0, 0, 0, 0,
 			0, 0, 0, 0,
-			0, 0, 0, PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED,
+			0, 0, 0, PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED,
 			0, 0, 0, 0);
 
 	const __m128i rss_flags = _mm_set_epi8(0, 0, 0, 0,
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 2ff904119..3c6e29594 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -1960,9 +1960,9 @@ ixgbe_vlan_hw_strip_bitmap_set(struct rte_eth_dev *dev, uint16_t queue, bool on)
 	rxq = dev->data->rx_queues[queue];
 
 	if (on)
-		rxq->vlan_flags = PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+		rxq->vlan_flags = PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 	else
-		rxq->vlan_flags = PKT_RX_VLAN_PKT;
+		rxq->vlan_flags = PKT_RX_VLAN;
 }
 
 static void
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 0038dfbb4..ea2813a43 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -1849,7 +1849,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		rxm->port = rxq->port_id;
 
 		pkt_info = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
+		/* Only valid if PKT_RX_VLAN set in pkt_flags */
 		rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);
 
 		pkt_flags = rx_desc_status_to_pkt_flags(staterr, vlan_flags);
@@ -1940,7 +1940,7 @@ ixgbe_fill_cluster_head_buf(
 
 	head->port = rxq->port_id;
 
-	/* The vlan_tci field is only valid when PKT_RX_VLAN_PKT is
+	/* The vlan_tci field is only valid when PKT_RX_VLAN is
 	 * set in the pkt_flags field.
 	 */
 	head->vlan_tci = rte_le_to_cpu_16(desc->wb.upper.vlan);
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 44de1caac..18e3d199f 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -126,8 +126,8 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 	} vol;
 
 	const uint8x16_t pkttype_msk = {
-			PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT,
-			PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT,
+			PKT_RX_VLAN, PKT_RX_VLAN,
+			PKT_RX_VLAN, PKT_RX_VLAN,
 			0x00, 0x00, 0x00, 0x00,
 			0x00, 0x00, 0x00, 0x00,
 			0x00, 0x00, 0x00, 0x00};
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
index e704a7f35..fe6937bf3 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
@@ -397,7 +397,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	sw_ring = &rxq->sw_ring[rxq->rx_tail];
 
 	/* ensure these 2 flags are in the lower 8 bits */
-	RTE_BUILD_BUG_ON((PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED) > UINT8_MAX);
+	RTE_BUILD_BUG_ON((PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED) > UINT8_MAX);
 	vlan_flags = rxq->vlan_flags & UINT8_MAX;
 
 	/* A. load 4 packet in one loop
diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index 67e7e0639..af0a75546 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -1884,7 +1884,7 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 			if (rxq->vlan_strip &&
 			    (cqe->hdr_type_etc &
 			     rte_cpu_to_be_16(MLX5_CQE_VLAN_STRIPPED))) {
-				pkt->ol_flags |= PKT_RX_VLAN_PKT |
+				pkt->ol_flags |= PKT_RX_VLAN |
 					PKT_RX_VLAN_STRIPPED;
 				pkt->vlan_tci =
 					rte_be_to_cpu_16(cqe->vlan_info);
diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
index 4cb7f2889..da3c96f4a 100644
--- a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
+++ b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
@@ -572,7 +572,7 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq,
 	const uint32x4_t ptype_ol_mask = { 0x106, 0x106, 0x106, 0x106 };
 	const uint8x16_t cv_flag_sel = {
 		0,
-		(uint8_t)(PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED),
+		(uint8_t)(PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED),
 		(uint8_t)(PKT_RX_IP_CKSUM_GOOD >> 1),
 		0,
 		(uint8_t)(PKT_RX_L4_CKSUM_GOOD >> 1),
@@ -582,7 +582,7 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq,
 	};
 	const uint32x4_t cv_mask =
 		vdupq_n_u32(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			    PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED);
+			    PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED);
 	const uint64x1_t mbuf_init = vld1_u64(&rxq->mbuf_initializer);
 	const uint64x1_t r32_mask = vcreate_u64(0xffffffff);
 	uint64x2_t rearm0, rearm1, rearm2, rearm3;
diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
index e9819b762..95e41d51a 100644
--- a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
+++ b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
@@ -563,17 +563,17 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq, __m128i cqes[4],
 			     (uint8_t)(PKT_RX_L4_CKSUM_GOOD >> 1),
 			     0,
 			     (uint8_t)(PKT_RX_IP_CKSUM_GOOD >> 1),
-			     (uint8_t)(PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED),
+			     (uint8_t)(PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED),
 			     0);
 	const __m128i cv_mask =
 		_mm_set_epi32(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			      PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED,
+			      PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED,
 			      PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			      PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED,
+			      PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED,
 			      PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			      PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED,
+			      PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED,
 			      PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			      PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED);
+			      PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED);
 	const __m128i mbuf_init =
 		_mm_loadl_epi64((__m128i *)&rxq->mbuf_initializer);
 	__m128i rearm0, rearm1, rearm2, rearm3;
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 0917b9c49..098dbcb62 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -2067,7 +2067,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		if ((rxds->rxd.flags & PCIE_DESC_RX_VLAN) &&
 		    (hw->ctrl & NFP_NET_CFG_CTRL_RXVLAN)) {
 			mb->vlan_tci = rte_cpu_to_le_32(rxds->rxd.vlan);
-			mb->ol_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+			mb->ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 		}
 
 		/* Adding the mbuff to the mbuff array passed by the app */
diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c
index aba51aba6..49de13b48 100644
--- a/drivers/net/qede/qede_rxtx.c
+++ b/drivers/net/qede/qede_rxtx.c
@@ -1450,7 +1450,7 @@ qede_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		if (CQE_HAS_VLAN(parse_flag) ||
 		    CQE_HAS_OUTER_VLAN(parse_flag)) {
 			/* Note: FW doesn't indicate Q-in-Q packet */
-			ol_flags |= PKT_RX_VLAN_PKT;
+			ol_flags |= PKT_RX_VLAN;
 			if (qdev->vlan_strip_flg) {
 				ol_flags |= PKT_RX_VLAN_STRIPPED;
 				rx_mb->vlan_tci = vlan_tci;
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index c9a2df3f4..01c85f138 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -847,7 +847,8 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 
 			/* Check for hardware stripped VLAN tag */
 			if (rcd->ts) {
-				start->ol_flags |= (PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED);
+				start->ol_flags |= (PKT_RX_VLAN |
+						PKT_RX_VLAN_STRIPPED);
 				start->vlan_tci = rte_le_to_cpu_16((uint16_t)rcd->tci);
 			}
 
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 0e18709d9..92fc704ee 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -308,7 +308,7 @@ const void *__rte_pktmbuf_read(const struct rte_mbuf *m, uint32_t off,
 const char *rte_get_rx_ol_flag_name(uint64_t mask)
 {
 	switch (mask) {
-	case PKT_RX_VLAN_PKT: return "PKT_RX_VLAN_PKT";
+	case PKT_RX_VLAN: return "PKT_RX_VLAN";
 	case PKT_RX_RSS_HASH: return "PKT_RX_RSS_HASH";
 	case PKT_RX_FDIR: return "PKT_RX_FDIR";
 	case PKT_RX_L4_CKSUM_BAD: return "PKT_RX_L4_CKSUM_BAD";
@@ -339,7 +339,7 @@ int
 rte_get_rx_ol_flag_list(uint64_t mask, char *buf, size_t buflen)
 {
 	const struct flag_mask rx_flags[] = {
-		{ PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT, NULL },
+		{ PKT_RX_VLAN, PKT_RX_VLAN, NULL },
 		{ PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, NULL },
 		{ PKT_RX_FDIR, PKT_RX_FDIR, NULL },
 		{ PKT_RX_L4_CKSUM_BAD, PKT_RX_L4_CKSUM_MASK, NULL },
@@ -359,6 +359,7 @@ rte_get_rx_ol_flag_list(uint64_t mask, char *buf, size_t buflen)
 		{ PKT_RX_QINQ_STRIPPED, PKT_RX_QINQ_STRIPPED, NULL },
 		{ PKT_RX_LRO, PKT_RX_LRO, NULL },
 		{ PKT_RX_TIMESTAMP, PKT_RX_TIMESTAMP, NULL },
+		{ PKT_RX_QINQ, PKT_RX_QINQ, NULL },
 	};
 	const char *name;
 	unsigned int i;
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index cc380400d..9094095fd 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -89,12 +89,13 @@ extern "C" {
  */
 
 /**
- * RX packet is a 802.1q VLAN packet. This flag was set by PMDs when
- * the packet is recognized as a VLAN, but the behavior between PMDs
- * was not the same. This flag is kept for some time to avoid breaking
- * applications and should be replaced by PKT_RX_VLAN_STRIPPED.
+ * The RX packet is a 802.1q VLAN packet, and the tci has been
+ * saved in in mbuf->vlan_tci.
+ * If the flag PKT_RX_VLAN_STRIPPED is also present, the VLAN
+ * header has been stripped from mbuf data, else it is still
+ * present.
  */
-#define PKT_RX_VLAN_PKT      (1ULL << 0)
+#define PKT_RX_VLAN          (1ULL << 0)
 
 #define PKT_RX_RSS_HASH      (1ULL << 1)  /**< RX packet with RSS hash result. */
 #define PKT_RX_FDIR          (1ULL << 2)  /**< RX packet with FDIR match indicate. */
@@ -123,6 +124,7 @@ extern "C" {
  * A vlan has been stripped by the hardware and its tci is saved in
  * mbuf->vlan_tci. This can only happen if vlan stripping is enabled
  * in the RX configuration of the PMD.
+ * When PKT_RX_VLAN_STRIPPED is set, PKT_RX_VLAN must also be set.
  */
 #define PKT_RX_VLAN_STRIPPED (1ULL << 6)
 
@@ -165,19 +167,13 @@ extern "C" {
  * The 2 vlans have been stripped by the hardware and their tci are
  * saved in mbuf->vlan_tci (inner) and mbuf->vlan_tci_outer (outer).
  * This can only happen if vlan stripping is enabled in the RX
- * configuration of the PMD. If this flag is set, PKT_RX_VLAN_STRIPPED
- * must also be set.
+ * configuration of the PMD. If this flag is set,
+ * When PKT_RX_QINQ_STRIPPED is set, the flags (PKT_RX_VLAN |
+ * PKT_RX_VLAN_STRIPPED | PKT_RX_QINQ) must also be set.
  */
 #define PKT_RX_QINQ_STRIPPED (1ULL << 15)
 
 /**
- * Deprecated.
- * RX packet with double VLAN stripped.
- * This flag is replaced by PKT_RX_QINQ_STRIPPED.
- */
-#define PKT_RX_QINQ_PKT      PKT_RX_QINQ_STRIPPED
-
-/**
  * When packets are coalesced by a hardware or virtual driver, this flag
  * can be set in the RX mbuf, meaning that the m->tso_segsz field is
  * valid and is set to the segment size of original packets.
@@ -189,6 +185,15 @@ extern "C" {
  */
 #define PKT_RX_TIMESTAMP     (1ULL << 17)
 
+/**
+ * The RX packet is a double VLAN, and the outer tci has been
+ * saved in in mbuf->vlan_tci_outer.
+ * If the flag PKT_RX_QINQ_STRIPPED is also present, both VLANs
+ * headers have been stripped from mbuf data, else they are still
+ * present.
+ */
+#define PKT_RX_QINQ          (1ULL << 18)
+
 /* add new RX flags here */
 
 /* add new TX flags here */
diff --git a/lib/librte_net/rte_ether.h b/lib/librte_net/rte_ether.h
index 917d42a1a..06d7b486c 100644
--- a/lib/librte_net/rte_ether.h
+++ b/lib/librte_net/rte_ether.h
@@ -358,7 +358,7 @@ static inline int rte_vlan_strip(struct rte_mbuf *m)
 		return -1;
 
 	struct vlan_hdr *vh = (struct vlan_hdr *)(eh + 1);
-	m->ol_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+	m->ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 	m->vlan_tci = rte_be_to_cpu_16(vh->vlan_tci);
 
 	/* Copy ether header over rather than moving whole packet */
-- 
2.11.0

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH] eal: fix version map experimental export section
@ 2017-10-25 12:29  4% Harry van Haaren
  0 siblings, 0 replies; 200+ results
From: Harry van Haaren @ 2017-10-25 12:29 UTC (permalink / raw)
  To: dev; +Cc: thomas, Harry van Haaren, santosh.shukla

Before this commit, the EXPERIMENTAL version of ABI
derived from the DPDK_17.08 tag. In parallel there
was a DPDK_17.11 tag.

Experimental map should always derive from the latest ABI,
so this patch moves the 17.11 section above EXPERIMENTAL,
and updates EXPERIMENTAL to derive from the 17.11 map.

Fixes: aadc3eb002d3 ("pci: export match function")
Cc: santosh.shukla@caviumnetworks.com

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
---
 lib/librte_eal/rte_eal_version.map | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index 8802b28..c0df978 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -201,6 +201,19 @@ DPDK_17.08 {
 
 } DPDK_17.05;
 
+DPDK_17.11 {
+	global:
+
+	rte_bus_get_iommu_class;
+	rte_eal_iova_mode;
+	rte_eal_mbuf_default_mempool_ops;
+	rte_lcore_has_role;
+	rte_memcpy_ptr;
+	rte_pci_get_iommu_class;
+	rte_pci_match;
+
+} DPDK_17.08;
+
 EXPERIMENTAL {
 	global:
 
@@ -234,17 +247,4 @@ EXPERIMENTAL {
 	rte_service_set_stats_enable;
 	rte_service_start_with_defaults;
 
-} DPDK_17.08;
-
-DPDK_17.11 {
-	global:
-
-	rte_bus_get_iommu_class;
-	rte_eal_iova_mode;
-	rte_eal_mbuf_default_mempool_ops;
-	rte_lcore_has_role;
-	rte_memcpy_ptr;
-	rte_pci_get_iommu_class;
-	rte_pci_match;
-
-} DPDK_17.08;
+} DPDK_17.11;
-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2 3/3] cryptodev: break dependency on PCI device bus
    2017-10-25 12:00  3%   ` [dpdk-dev] [PATCH v2 1/3] cryptodev: add new APIs to assist PMD initialisation Declan Doherty
  2017-10-25 12:00  1%   ` [dpdk-dev] [PATCH v2 2/3] cryptodev: break dependency on virtual device bus Declan Doherty
@ 2017-10-25 12:00  3%   ` Declan Doherty
  2 siblings, 0 replies; 200+ results
From: Declan Doherty @ 2017-10-25 12:00 UTC (permalink / raw)
  To: dev; +Cc: Declan Doherty

Removes any dependency of librte_cryptodev on the PCI device
infrastructure code and removes the functions which were virtual
device specific.

Updates QAT crypto PMD to remove dependencies on rte_cryptodev_pci.h
and replaces those calls with the new bus independent functions.

Signed-off-by: Declan Doherty <declan.doherty@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst         |  7 ++
 drivers/crypto/qat/qat_crypto.c                |  3 +-
 drivers/crypto/qat/rte_qat_cryptodev.c         | 55 +++++++++++----
 lib/librte_cryptodev/Makefile                  |  1 -
 lib/librte_cryptodev/rte_cryptodev_pci.h       | 92 -------------------------
 lib/librte_cryptodev/rte_cryptodev_pmd.c       | 95 --------------------------
 lib/librte_cryptodev/rte_cryptodev_version.map |  2 -
 7 files changed, 52 insertions(+), 203 deletions(-)
 delete mode 100644 lib/librte_cryptodev/rte_cryptodev_pci.h

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 7755768..78170e1 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -305,6 +305,13 @@ API Changes
   and have been replaced by non bus specific functions
   ``rte_cryptodev_pmd_parse_input_args()`` and ``rte_cryptodev_pmd_create()``.
 
+* **Removed PCI device bus specific functions from librte_cryptodev.**
+
+  The functions ``rte_cryptodev_pci_generic_probe()`` and
+  ``rte_cryptodev_pci_generic_remove()`` have been removed from librte_cryptodev
+  and have been replaced by non bus specific functions
+  ``rte_cryptodev_pmd_create()`` and ``rte_cryptodev_pmd_destroy()``.
+
 ABI Changes
 -----------
 
diff --git a/drivers/crypto/qat/qat_crypto.c b/drivers/crypto/qat/qat_crypto.c
index ae73c78..87f232e 100644
--- a/drivers/crypto/qat/qat_crypto.c
+++ b/drivers/crypto/qat/qat_crypto.c
@@ -58,8 +58,9 @@
 #include <rte_spinlock.h>
 #include <rte_hexdump.h>
 #include <rte_crypto_sym.h>
-#include <rte_cryptodev_pci.h>
 #include <rte_byteorder.h>
+#include <rte_pci.h>
+
 #include <openssl/evp.h>
 
 #include "qat_logs.h"
diff --git a/drivers/crypto/qat/rte_qat_cryptodev.c b/drivers/crypto/qat/rte_qat_cryptodev.c
index 3d9f3c8..701c5a6 100644
--- a/drivers/crypto/qat/rte_qat_cryptodev.c
+++ b/drivers/crypto/qat/rte_qat_cryptodev.c
@@ -34,8 +34,8 @@
 #include <rte_common.h>
 #include <rte_dev.h>
 #include <rte_malloc.h>
+#include <rte_pci.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_pci.h>
 
 #include "qat_crypto.h"
 #include "qat_logs.h"
@@ -97,15 +97,18 @@ static const struct rte_pci_id pci_id_qat_map[] = {
 };
 
 static int
-crypto_qat_dev_init(struct rte_cryptodev *cryptodev)
+crypto_qat_create(const char *name, struct rte_pci_device *pci_dev,
+		struct rte_cryptodev_pmd_init_params *init_params)
 {
+	struct rte_cryptodev *cryptodev;
 	struct qat_pmd_private *internals;
 
 	PMD_INIT_FUNC_TRACE();
-	PMD_DRV_LOG(DEBUG, "Found crypto device at %02x:%02x.%x",
-		RTE_DEV_TO_PCI(cryptodev->device)->addr.bus,
-		RTE_DEV_TO_PCI(cryptodev->device)->addr.devid,
-		RTE_DEV_TO_PCI(cryptodev->device)->addr.function);
+
+	cryptodev = rte_cryptodev_pmd_create(name, &pci_dev->device,
+			init_params);
+	if (cryptodev == NULL)
+		return -ENODEV;
 
 	cryptodev->driver_id = cryptodev_qat_driver_id;
 	cryptodev->dev_ops = &crypto_qat_ops;
@@ -119,8 +122,8 @@ crypto_qat_dev_init(struct rte_cryptodev *cryptodev)
 			RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER;
 
 	internals = cryptodev->data->dev_private;
-	internals->max_nb_sessions = RTE_QAT_PMD_MAX_NB_SESSIONS;
-	switch (RTE_DEV_TO_PCI(cryptodev->device)->id.device_id) {
+	internals->max_nb_sessions = init_params->max_nb_sessions;
+	switch (pci_dev->id.device_id) {
 	case 0x0443:
 		internals->qat_dev_gen = QAT_GEN1;
 		internals->qat_dev_capabilities = qat_gen1_capabilities;
@@ -151,15 +154,43 @@ crypto_qat_dev_init(struct rte_cryptodev *cryptodev)
 }
 
 static int crypto_qat_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
-	struct rte_pci_device *pci_dev)
+		struct rte_pci_device *pci_dev)
 {
-	return rte_cryptodev_pci_generic_probe(pci_dev,
-		sizeof(struct qat_pmd_private), crypto_qat_dev_init);
+	struct rte_cryptodev_pmd_init_params init_params = {
+		.name = "",
+		.socket_id = rte_socket_id(),
+		.private_data_size = sizeof(struct qat_pmd_private),
+		.max_nb_sessions = RTE_QAT_PMD_MAX_NB_SESSIONS
+	};
+	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
+
+	PMD_DRV_LOG(DEBUG, "Found QAT device at %02x:%02x.%x",
+			pci_dev->addr.bus,
+			pci_dev->addr.devid,
+			pci_dev->addr.function);
+
+	rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
+
+	return crypto_qat_create(name, pci_dev, &init_params);
 }
 
 static int crypto_qat_pci_remove(struct rte_pci_device *pci_dev)
 {
-	return rte_cryptodev_pci_generic_remove(pci_dev, NULL);
+	struct rte_cryptodev *cryptodev;
+	char cryptodev_name[RTE_CRYPTODEV_NAME_MAX_LEN];
+
+	if (pci_dev == NULL)
+		return -EINVAL;
+
+	rte_pci_device_name(&pci_dev->addr, cryptodev_name,
+			sizeof(cryptodev_name));
+
+	cryptodev = rte_cryptodev_pmd_get_named_dev(cryptodev_name);
+	if (cryptodev == NULL)
+		return -ENODEV;
+
+	/* free crypto device */
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_pci_driver rte_qat_pmd = {
diff --git a/lib/librte_cryptodev/Makefile b/lib/librte_cryptodev/Makefile
index 0e019ed..ee00e8c 100644
--- a/lib/librte_cryptodev/Makefile
+++ b/lib/librte_cryptodev/Makefile
@@ -50,7 +50,6 @@ SYMLINK-y-include += rte_crypto.h
 SYMLINK-y-include += rte_crypto_sym.h
 SYMLINK-y-include += rte_cryptodev.h
 SYMLINK-y-include += rte_cryptodev_pmd.h
-SYMLINK-y-include += rte_cryptodev_pci.h
 
 # versioning export map
 EXPORT_MAP := rte_cryptodev_version.map
diff --git a/lib/librte_cryptodev/rte_cryptodev_pci.h b/lib/librte_cryptodev/rte_cryptodev_pci.h
deleted file mode 100644
index 67eda96..0000000
--- a/lib/librte_cryptodev/rte_cryptodev_pci.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2017 Intel Corporation. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of the copyright holder nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _RTE_CRYPTODEV_PCI_H_
-#define _RTE_CRYPTODEV_PCI_H_
-
-#include <rte_pci.h>
-#include "rte_cryptodev.h"
-
-/**
- * Initialisation function of a crypto driver invoked for each matching
- * crypto PCI device detected during the PCI probing phase.
- *
- * @param	dev	The dev pointer is the address of the *rte_cryptodev*
- *			structure associated with the matching device and which
- *			has been [automatically] allocated in the
- *			*rte_crypto_devices* array.
- *
- * @return
- *   - 0: Success, the device is properly initialised by the driver.
- *        In particular, the driver MUST have set up the *dev_ops* pointer
- *        of the *dev* structure.
- *   - <0: Error code of the device initialisation failure.
- */
-typedef int (*cryptodev_pci_init_t)(struct rte_cryptodev *dev);
-
-/**
- * Finalisation function of a driver invoked for each matching
- * PCI device detected during the PCI closing phase.
- *
- * @param	dev	The dev pointer is the address of the *rte_cryptodev*
- *			structure associated with the matching device and which
- *			has been [automatically] allocated in the
- *			*rte_crypto_devices* array.
- *
- *  * @return
- *   - 0: Success, the device is properly finalised by the driver.
- *        In particular, the driver MUST free the *dev_ops* pointer
- *        of the *dev* structure.
- *   - <0: Error code of the device initialisation failure.
- */
-typedef int (*cryptodev_pci_uninit_t)(struct rte_cryptodev *dev);
-
-/**
- * @internal
- * Wrapper for use by pci drivers as a .probe function to attach to a crypto
- * interface.
- */
-int
-rte_cryptodev_pci_generic_probe(struct rte_pci_device *pci_dev,
-			size_t private_data_size,
-			cryptodev_pci_init_t dev_init);
-
-/**
- * @internal
- * Wrapper for use by pci drivers as a .remove function to detach a crypto
- * interface.
- */
-int
-rte_cryptodev_pci_generic_remove(struct rte_pci_device *pci_dev,
-		cryptodev_pci_uninit_t dev_uninit);
-
-#endif /* _RTE_CRYPTODEV_PCI_H_ */
diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.c b/lib/librte_cryptodev/rte_cryptodev_pmd.c
index 0b5741a..8d4b78a 100644
--- a/lib/librte_cryptodev/rte_cryptodev_pmd.c
+++ b/lib/librte_cryptodev/rte_cryptodev_pmd.c
@@ -32,7 +32,6 @@
 
 #include <rte_malloc.h>
 
-#include "rte_cryptodev_pci.h"
 #include "rte_cryptodev_pmd.h"
 
 /**
@@ -177,8 +176,6 @@ rte_cryptodev_pmd_create(const char *name,
 	return cryptodev;
 }
 
-
-
 int
 rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev)
 {
@@ -203,95 +200,3 @@ rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev)
 	return 0;
 }
 
-int
-rte_cryptodev_pci_generic_probe(struct rte_pci_device *pci_dev,
-			size_t private_data_size,
-			cryptodev_pci_init_t dev_init)
-{
-	struct rte_cryptodev *cryptodev;
-
-	char cryptodev_name[RTE_CRYPTODEV_NAME_MAX_LEN];
-
-	int retval;
-
-	rte_pci_device_name(&pci_dev->addr, cryptodev_name,
-			sizeof(cryptodev_name));
-
-	cryptodev = rte_cryptodev_pmd_allocate(cryptodev_name, rte_socket_id());
-	if (cryptodev == NULL)
-		return -ENOMEM;
-
-	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
-		cryptodev->data->dev_private =
-				rte_zmalloc_socket(
-						"cryptodev private structure",
-						private_data_size,
-						RTE_CACHE_LINE_SIZE,
-						rte_socket_id());
-
-		if (cryptodev->data->dev_private == NULL)
-			rte_panic("Cannot allocate memzone for private "
-					"device data");
-	}
-
-	cryptodev->device = &pci_dev->device;
-
-	/* init user callbacks */
-	TAILQ_INIT(&(cryptodev->link_intr_cbs));
-
-	/* Invoke PMD device initialization function */
-	RTE_FUNC_PTR_OR_ERR_RET(*dev_init, -EINVAL);
-	retval = dev_init(cryptodev);
-	if (retval == 0)
-		return 0;
-
-	CDEV_LOG_ERR("driver %s: crypto_dev_init(vendor_id=0x%x device_id=0x%x)"
-			" failed", pci_dev->device.driver->name,
-			(unsigned int) pci_dev->id.vendor_id,
-			(unsigned int) pci_dev->id.device_id);
-
-	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-		rte_free(cryptodev->data->dev_private);
-
-	/* free crypto device */
-	rte_cryptodev_pmd_release_device(cryptodev);
-
-	return -ENXIO;
-}
-
-int
-rte_cryptodev_pci_generic_remove(struct rte_pci_device *pci_dev,
-		cryptodev_pci_uninit_t dev_uninit)
-{
-	struct rte_cryptodev *cryptodev;
-	char cryptodev_name[RTE_CRYPTODEV_NAME_MAX_LEN];
-	int ret;
-
-	if (pci_dev == NULL)
-		return -EINVAL;
-
-	rte_pci_device_name(&pci_dev->addr, cryptodev_name,
-			sizeof(cryptodev_name));
-
-	cryptodev = rte_cryptodev_pmd_get_named_dev(cryptodev_name);
-	if (cryptodev == NULL)
-		return -ENODEV;
-
-	/* Invoke PMD device uninit function */
-	if (dev_uninit) {
-		ret = dev_uninit(cryptodev);
-		if (ret)
-			return ret;
-	}
-
-	/* free crypto device */
-	rte_cryptodev_pmd_release_device(cryptodev);
-
-	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-		rte_free(cryptodev->data->dev_private);
-
-	cryptodev->device = NULL;
-	cryptodev->data = NULL;
-
-	return 0;
-}
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index d3e4515..4355166 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -68,8 +68,6 @@ DPDK_17.08 {
 	rte_cryptodev_get_aead_algo_enum;
 	rte_cryptodev_get_header_session_size;
 	rte_cryptodev_get_private_session_size;
-	rte_cryptodev_pci_generic_probe;
-	rte_cryptodev_pci_generic_remove;
 	rte_cryptodev_sym_capability_check_aead;
 	rte_cryptodev_sym_session_init;
 	rte_cryptodev_sym_session_clear;
-- 
2.9.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2 2/3] cryptodev: break dependency on virtual device bus
    2017-10-25 12:00  3%   ` [dpdk-dev] [PATCH v2 1/3] cryptodev: add new APIs to assist PMD initialisation Declan Doherty
@ 2017-10-25 12:00  1%   ` Declan Doherty
  2017-10-25 12:00  3%   ` [dpdk-dev] [PATCH v2 3/3] cryptodev: break dependency on PCI " Declan Doherty
  2 siblings, 0 replies; 200+ results
From: Declan Doherty @ 2017-10-25 12:00 UTC (permalink / raw)
  To: dev; +Cc: Declan Doherty

Removes any dependency of librte_cryptodev on the virtual device
infrastructure code and removes the functions which were virtual
device specific.

Updates all virtual PMDs to remove dependencies on rte_cryptodev_vdev.h
and replaces those calls with the new bus independent functions.

Signed-off-by: Declan Doherty <declan.doherty@intel.com>
---
 doc/guides/rel_notes/deprecation.rst           |   5 --
 doc/guides/rel_notes/release_17_11.rst         |   7 ++
 drivers/crypto/aesni_gcm/aesni_gcm_pmd.c       |  56 ++++--------
 drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c     |  73 +++++++--------
 drivers/crypto/armv8/rte_armv8_pmd.c           |  41 +++------
 drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c    |  11 +--
 drivers/crypto/dpaa_sec/dpaa_sec.c             |  14 +--
 drivers/crypto/kasumi/rte_kasumi_pmd.c         |  49 ++++------
 drivers/crypto/mrvl/rte_mrvl_pmd.c             |  56 ++++--------
 drivers/crypto/null/null_crypto_pmd.c          |  72 ++++++---------
 drivers/crypto/openssl/rte_openssl_pmd.c       |  42 +++------
 drivers/crypto/scheduler/scheduler_pmd.c       |  45 +++-------
 drivers/crypto/scheduler/scheduler_pmd_ops.c   |   3 +-
 drivers/crypto/snow3g/rte_snow3g_pmd.c         |  41 +++------
 drivers/crypto/zuc/rte_zuc_pmd.c               |  41 +++------
 lib/librte_cryptodev/Makefile                  |   1 -
 lib/librte_cryptodev/rte_cryptodev_pmd.c       | 120 -------------------------
 lib/librte_cryptodev/rte_cryptodev_vdev.h      | 100 ---------------------
 lib/librte_cryptodev/rte_cryptodev_version.map |   2 -
 19 files changed, 190 insertions(+), 589 deletions(-)
 delete mode 100644 lib/librte_cryptodev/rte_cryptodev_vdev.h

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 0d99251..ffd5e24 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -71,11 +71,6 @@ Deprecation Notices
 
   - ``rte_cryptodev_create_vdev``
 
-* cryptodev: the following function will be static in 17.11 and included
-  by all crypto drivers, therefore, will not be public:
-
-  - ``rte_cryptodev_vdev_pmd_init``
-
 * librte_meter: The API will change to accommodate configuration profiles.
   Most of the API functions will have an additional opaque parameter.
 
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 0a90db4..7755768 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -298,6 +298,13 @@ API Changes
   are bus independent for driver to manage creation and destruction of new
   device instances.
 
+* **Removed virtual device bus specific functions from librte_cryptodev.**
+
+  The functions ``rte_cryptodev_vdev_parse_init_params()`` and
+  ``rte_cryptodev_vdev_pmd_init()`` have been removed from librte_cryptodev
+  and have been replaced by non bus specific functions
+  ``rte_cryptodev_pmd_parse_input_args()`` and ``rte_cryptodev_pmd_create()``.
+
 ABI Changes
 -----------
 
diff --git a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
index 29c14e5..1d18217 100644
--- a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
+++ b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
@@ -35,7 +35,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -486,22 +485,24 @@ static int aesni_gcm_remove(struct rte_vdev_device *vdev);
 static int
 aesni_gcm_create(const char *name,
 		struct rte_vdev_device *vdev,
-		struct rte_crypto_vdev_init_params *init_params)
+		struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct aesni_gcm_private *internals;
 	enum aesni_gcm_vector_mode vector_mode;
 
-	if (init_params->name[0] == '\0')
-		snprintf(init_params->name, sizeof(init_params->name),
-				"%s", name);
-
 	/* Check CPU for support for AES instruction set */
 	if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_AES)) {
 		GCM_LOG_ERR("AES instructions not supported by CPU");
 		return -EFAULT;
 	}
 
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
+	if (dev == NULL) {
+		GCM_LOG_ERR("driver %s: create failed", init_params->name);
+		return -ENODEV;
+	}
+
 	/* Check CPU for supported vector instruction set */
 	if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2))
 		vector_mode = RTE_AESNI_GCM_AVX2;
@@ -510,14 +511,6 @@ aesni_gcm_create(const char *name,
 	else
 		vector_mode = RTE_AESNI_GCM_SSE;
 
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-			sizeof(struct aesni_gcm_private), init_params->socket_id,
-			vdev);
-	if (dev == NULL) {
-		GCM_LOG_ERR("failed to create cryptodev vdev");
-		goto init_error;
-	}
-
 	dev->driver_id = cryptodev_driver_id;
 	dev->dev_ops = rte_aesni_gcm_pmd_ops;
 
@@ -552,22 +545,17 @@ aesni_gcm_create(const char *name,
 	internals->max_nb_sessions = init_params->max_nb_sessions;
 
 	return 0;
-
-init_error:
-	GCM_LOG_ERR("driver %s: create failed", init_params->name);
-
-	aesni_gcm_remove(vdev);
-	return -EFAULT;
 }
 
 static int
 aesni_gcm_probe(struct rte_vdev_device *vdev)
 {
-	struct rte_crypto_vdev_init_params init_params = {
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+	struct rte_cryptodev_pmd_init_params init_params = {
+		"",
+		sizeof(struct aesni_gcm_private),
 		rte_socket_id(),
-		{0}
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 	};
 	const char *name;
 	const char *input_args;
@@ -576,17 +564,7 @@ aesni_gcm_probe(struct rte_vdev_device *vdev)
 	if (name == NULL)
 		return -EINVAL;
 	input_args = rte_vdev_device_args(vdev);
-	rte_cryptodev_vdev_parse_init_params(&init_params, input_args);
-
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name,
-			init_params.socket_id);
-	if (init_params.name[0] != '\0')
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
+	rte_cryptodev_pmd_parse_input_args(&init_params, input_args);
 
 	return aesni_gcm_create(name, vdev, &init_params);
 }
@@ -594,16 +572,18 @@ aesni_gcm_probe(struct rte_vdev_device *vdev)
 static int
 aesni_gcm_remove(struct rte_vdev_device *vdev)
 {
+	struct rte_cryptodev *cryptodev;
 	const char *name;
 
 	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
 
-	GCM_LOG_INFO("Closing AESNI crypto device %s on numa socket %u\n",
-			name, rte_socket_id());
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
 
-	return 0;
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_vdev_driver aesni_gcm_pmd_drv = {
diff --git a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
index 49242fc..a589557 100644
--- a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
+++ b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
@@ -36,7 +36,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -715,15 +714,23 @@ static int cryptodev_aesni_mb_remove(struct rte_vdev_device *vdev);
 static int
 cryptodev_aesni_mb_create(const char *name,
 			struct rte_vdev_device *vdev,
-			struct rte_crypto_vdev_init_params *init_params)
+			struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct aesni_mb_private *internals;
 	enum aesni_mb_vector_mode vector_mode;
 
-	if (init_params->name[0] == '\0')
-		snprintf(init_params->name, sizeof(init_params->name),
-				"%s", name);
+	/* Check CPU for support for AES instruction set */
+	if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_AES)) {
+		MB_LOG_ERR("AES instructions not supported by CPU");
+		return -EFAULT;
+	}
+
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
+	if (dev == NULL) {
+		MB_LOG_ERR("failed to create cryptodev vdev");
+		return -ENODEV;
+	}
 
 	/* Check CPU for supported vector instruction set */
 	if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F))
@@ -735,14 +742,6 @@ cryptodev_aesni_mb_create(const char *name,
 	else
 		vector_mode = RTE_AESNI_MB_SSE;
 
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-			sizeof(struct aesni_mb_private), init_params->socket_id,
-			vdev);
-	if (dev == NULL) {
-		MB_LOG_ERR("failed to create cryptodev vdev");
-		goto init_error;
-	}
-
 	dev->driver_id = cryptodev_driver_id;
 	dev->dev_ops = rte_aesni_mb_pmd_ops;
 
@@ -779,41 +778,33 @@ cryptodev_aesni_mb_create(const char *name,
 	internals->max_nb_sessions = init_params->max_nb_sessions;
 
 	return 0;
-init_error:
-	MB_LOG_ERR("driver %s: cryptodev_aesni_create failed",
-			init_params->name);
-
-	cryptodev_aesni_mb_remove(vdev);
-	return -EFAULT;
 }
 
 static int
 cryptodev_aesni_mb_probe(struct rte_vdev_device *vdev)
 {
-	struct rte_crypto_vdev_init_params init_params = {
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+	struct rte_cryptodev_pmd_init_params init_params = {
+		"",
+		sizeof(struct aesni_mb_private),
 		rte_socket_id(),
-		""
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 	};
-	const char *name;
-	const char *input_args;
+	const char *name, *args;
+	int retval;
 
 	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
-	input_args = rte_vdev_device_args(vdev);
-	rte_cryptodev_vdev_parse_init_params(&init_params, input_args);
-
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name,
-			init_params.socket_id);
-	if (init_params.name[0] != '\0')
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
+
+	args = rte_vdev_device_args(vdev);
+
+	retval = rte_cryptodev_pmd_parse_input_args(&init_params, args);
+	if (retval) {
+		MB_LOG_ERR("Failed to parse initialisation arguments[%s]\n",
+				args);
+		return -EINVAL;
+	}
 
 	return cryptodev_aesni_mb_create(name, vdev, &init_params);
 }
@@ -821,16 +812,18 @@ cryptodev_aesni_mb_probe(struct rte_vdev_device *vdev)
 static int
 cryptodev_aesni_mb_remove(struct rte_vdev_device *vdev)
 {
+	struct rte_cryptodev *cryptodev;
 	const char *name;
 
 	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
 
-	RTE_LOG(INFO, PMD, "Closing AESNI crypto device %s on numa socket %u\n",
-			name, rte_socket_id());
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
 
-	return 0;
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_vdev_driver cryptodev_aesni_mb_pmd_drv = {
diff --git a/drivers/crypto/armv8/rte_armv8_pmd.c b/drivers/crypto/armv8/rte_armv8_pmd.c
index dbe6bee..2d2f3ff 100644
--- a/drivers/crypto/armv8/rte_armv8_pmd.c
+++ b/drivers/crypto/armv8/rte_armv8_pmd.c
@@ -36,7 +36,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -759,7 +758,7 @@ armv8_crypto_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops,
 static int
 cryptodev_armv8_crypto_create(const char *name,
 			struct rte_vdev_device *vdev,
-			struct rte_crypto_vdev_init_params *init_params)
+			struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct armv8_crypto_private *internals;
@@ -786,14 +785,7 @@ cryptodev_armv8_crypto_create(const char *name,
 		return -EFAULT;
 	}
 
-	if (init_params->name[0] == '\0')
-		snprintf(init_params->name, sizeof(init_params->name),
-				"%s", name);
-
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-				sizeof(struct armv8_crypto_private),
-				init_params->socket_id,
-				vdev);
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
 	if (dev == NULL) {
 		ARMV8_CRYPTO_LOG_ERR("failed to create cryptodev vdev");
 		goto init_error;
@@ -832,11 +824,12 @@ cryptodev_armv8_crypto_create(const char *name,
 static int
 cryptodev_armv8_crypto_init(struct rte_vdev_device *vdev)
 {
-	struct rte_crypto_vdev_init_params init_params = {
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+	struct rte_cryptodev_pmd_init_params init_params = {
+		"",
+		sizeof(struct armv8_crypto_private),
 		rte_socket_id(),
-		{0}
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 	};
 	const char *name;
 	const char *input_args;
@@ -845,18 +838,7 @@ cryptodev_armv8_crypto_init(struct rte_vdev_device *vdev)
 	if (name == NULL)
 		return -EINVAL;
 	input_args = rte_vdev_device_args(vdev);
-	rte_cryptodev_vdev_parse_init_params(&init_params, input_args);
-
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name,
-			init_params.socket_id);
-	if (init_params.name[0] != '\0') {
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
-	}
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
+	rte_cryptodev_pmd_parse_input_args(&init_params, input_args);
 
 	return cryptodev_armv8_crypto_create(name, vdev, &init_params);
 }
@@ -865,6 +847,7 @@ cryptodev_armv8_crypto_init(struct rte_vdev_device *vdev)
 static int
 cryptodev_armv8_crypto_uninit(struct rte_vdev_device *vdev)
 {
+	struct rte_cryptodev *cryptodev;
 	const char *name;
 
 	name = rte_vdev_device_name(vdev);
@@ -875,7 +858,11 @@ cryptodev_armv8_crypto_uninit(struct rte_vdev_device *vdev)
 		"Closing ARMv8 crypto device %s on numa socket %u\n",
 		name, rte_socket_id());
 
-	return 0;
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
+
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_vdev_driver armv8_crypto_pmd_drv = {
diff --git a/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c b/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
index c67548e..dd19b9b 100644
--- a/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
+++ b/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
@@ -2016,16 +2016,7 @@ cryptodev_dpaa2_sec_remove(struct rte_dpaa2_device *dpaa2_dev)
 	if (ret)
 		return ret;
 
-	/* free crypto device */
-	rte_cryptodev_pmd_release_device(cryptodev);
-
-	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-		rte_free(cryptodev->data->dev_private);
-
-	cryptodev->device = NULL;
-	cryptodev->data = NULL;
-
-	return 0;
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_dpaa2_driver rte_dpaa2_sec_driver = {
diff --git a/drivers/crypto/dpaa_sec/dpaa_sec.c b/drivers/crypto/dpaa_sec/dpaa_sec.c
index 26a29a4..30a2a38 100644
--- a/drivers/crypto/dpaa_sec/dpaa_sec.c
+++ b/drivers/crypto/dpaa_sec/dpaa_sec.c
@@ -1529,19 +1529,7 @@ cryptodev_dpaa_sec_remove(struct rte_dpaa_device *dpaa_dev)
 	if (ret)
 		return ret;
 
-	/* free crypto device */
-	rte_cryptodev_pmd_release_device(cryptodev);
-
-	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-		rte_free(cryptodev->data->dev_private);
-
-	PMD_INIT_LOG(INFO, "Closing dpaa crypto device %s",
-		     cryptodev->data->name);
-
-	cryptodev->device = NULL;
-	cryptodev->data = NULL;
-
-	return 0;
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_dpaa_driver rte_dpaa_sec_driver = {
diff --git a/drivers/crypto/kasumi/rte_kasumi_pmd.c b/drivers/crypto/kasumi/rte_kasumi_pmd.c
index 7a00bd3..7c1b56b 100644
--- a/drivers/crypto/kasumi/rte_kasumi_pmd.c
+++ b/drivers/crypto/kasumi/rte_kasumi_pmd.c
@@ -35,7 +35,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -553,15 +552,17 @@ static int cryptodev_kasumi_remove(struct rte_vdev_device *vdev);
 static int
 cryptodev_kasumi_create(const char *name,
 			struct rte_vdev_device *vdev,
-			struct rte_crypto_vdev_init_params *init_params)
+			struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct kasumi_private *internals;
 	uint64_t cpu_flags = 0;
 
-	if (init_params->name[0] == '\0')
-		snprintf(init_params->name, sizeof(init_params->name),
-				"%s", name);
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
+	if (dev == NULL) {
+		KASUMI_LOG_ERR("failed to create cryptodev vdev");
+		goto init_error;
+	}
 
 	/* Check CPU for supported vector instruction set */
 	if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX))
@@ -569,14 +570,6 @@ cryptodev_kasumi_create(const char *name,
 	else
 		cpu_flags |= RTE_CRYPTODEV_FF_CPU_SSE;
 
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-			sizeof(struct kasumi_private), init_params->socket_id,
-			vdev);
-	if (dev == NULL) {
-		KASUMI_LOG_ERR("failed to create cryptodev vdev");
-		goto init_error;
-	}
-
 	dev->driver_id = cryptodev_driver_id;
 	dev->dev_ops = rte_kasumi_pmd_ops;
 
@@ -605,11 +598,12 @@ cryptodev_kasumi_create(const char *name,
 static int
 cryptodev_kasumi_probe(struct rte_vdev_device *vdev)
 {
-	struct rte_crypto_vdev_init_params init_params = {
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+	struct rte_cryptodev_pmd_init_params init_params = {
+		"",
+		sizeof(struct kasumi_private),
 		rte_socket_id(),
-		{0}
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 	};
 	const char *name;
 	const char *input_args;
@@ -619,17 +613,7 @@ cryptodev_kasumi_probe(struct rte_vdev_device *vdev)
 		return -EINVAL;
 	input_args = rte_vdev_device_args(vdev);
 
-	rte_cryptodev_vdev_parse_init_params(&init_params, input_args);
-
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name,
-			init_params.socket_id);
-	if (init_params.name[0] != '\0')
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
+	rte_cryptodev_pmd_parse_input_args(&init_params, input_args);
 
 	return cryptodev_kasumi_create(name, vdev, &init_params);
 }
@@ -637,17 +621,18 @@ cryptodev_kasumi_probe(struct rte_vdev_device *vdev)
 static int
 cryptodev_kasumi_remove(struct rte_vdev_device *vdev)
 {
+	struct rte_cryptodev *cryptodev;
 	const char *name;
 
 	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
 
-	RTE_LOG(INFO, PMD, "Closing KASUMI crypto device %s"
-			" on numa socket %u\n",
-			name, rte_socket_id());
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
 
-	return 0;
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_vdev_driver cryptodev_kasumi_pmd_drv = {
diff --git a/drivers/crypto/mrvl/rte_mrvl_pmd.c b/drivers/crypto/mrvl/rte_mrvl_pmd.c
index 6a9c8da..63895c5 100644
--- a/drivers/crypto/mrvl/rte_mrvl_pmd.c
+++ b/drivers/crypto/mrvl/rte_mrvl_pmd.c
@@ -36,7 +36,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -720,26 +719,14 @@ mrvl_crypto_pmd_dequeue_burst(void *queue_pair,
 static int
 cryptodev_mrvl_crypto_create(const char *name,
 		struct rte_vdev_device *vdev,
-		struct rte_crypto_vdev_init_params *init_params)
+		struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct mrvl_crypto_private *internals;
 	struct sam_init_params	sam_params;
 	int ret;
 
-	if (init_params->name[0] == '\0') {
-		ret = rte_cryptodev_pmd_create_dev_name(
-				init_params->name, name);
-
-		if (ret < 0) {
-			MRVL_CRYPTO_LOG_ERR("failed to create unique name");
-			return ret;
-		}
-	}
-
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-				sizeof(struct mrvl_crypto_private),
-				init_params->socket_id, vdev);
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
 	if (dev == NULL) {
 		MRVL_CRYPTO_LOG_ERR("failed to create cryptodev vdev");
 		goto init_error;
@@ -796,40 +783,28 @@ cryptodev_mrvl_crypto_create(const char *name,
 static int
 cryptodev_mrvl_crypto_init(struct rte_vdev_device *vdev)
 {
-	struct rte_crypto_vdev_init_params init_params = { };
-	const char *name;
-	const char *input_args;
+	struct rte_cryptodev_pmd_init_params init_params = { };
+	const char *name, *args;
 	int ret;
 
 	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
-	input_args = rte_vdev_device_args(vdev);
-
-	if (!input_args)
-		return -EINVAL;
+	args = rte_vdev_device_args(vdev);
 
+	init_params.private_data_size = sizeof(struct mrvl_crypto_private);
 	init_params.max_nb_queue_pairs = sam_get_num_inst() * SAM_HW_RING_NUM;
 	init_params.max_nb_sessions =
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS;
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS;
 	init_params.socket_id = rte_socket_id();
 
-	ret = rte_cryptodev_vdev_parse_init_params(&init_params, input_args);
+	ret = rte_cryptodev_pmd_parse_input_args(&init_params, args);
 	if (ret) {
-		RTE_LOG(ERR, PMD, "Failed to parse input arguments\n");
-		return ret;
-	}
-
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name,
-			init_params.socket_id);
-	if (init_params.name[0] != '\0') {
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
+		RTE_LOG(ERR, PMD,
+			"Failed to parse initialisation arguments[%s]\n",
+			args);
+		return -EINVAL;
 	}
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
 
 	return cryptodev_mrvl_crypto_create(name, vdev, &init_params);
 }
@@ -843,6 +818,7 @@ cryptodev_mrvl_crypto_init(struct rte_vdev_device *vdev)
 static int
 cryptodev_mrvl_crypto_uninit(struct rte_vdev_device *vdev)
 {
+	struct rte_cryptodev *cryptodev;
 	const char *name = rte_vdev_device_name(vdev);
 
 	if (name == NULL)
@@ -854,7 +830,11 @@ cryptodev_mrvl_crypto_uninit(struct rte_vdev_device *vdev)
 
 	sam_deinit();
 
-	return 0;
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
+
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 /**
diff --git a/drivers/crypto/null/null_crypto_pmd.c b/drivers/crypto/null/null_crypto_pmd.c
index d5d2bb3..4b9a58a 100644
--- a/drivers/crypto/null/null_crypto_pmd.c
+++ b/drivers/crypto/null/null_crypto_pmd.c
@@ -33,7 +33,6 @@
 #include <rte_common.h>
 #include <rte_config.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 
@@ -183,28 +182,19 @@ null_crypto_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops,
 	return nb_dequeued;
 }
 
-static int cryptodev_null_remove(const char *name);
-
 /** Create crypto device */
 static int
 cryptodev_null_create(const char *name,
 		struct rte_vdev_device *vdev,
-		struct rte_crypto_vdev_init_params *init_params)
+		struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct null_crypto_private *internals;
 
-	if (init_params->name[0] == '\0')
-		snprintf(init_params->name, sizeof(init_params->name),
-				"%s", name);
-
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-			sizeof(struct null_crypto_private),
-			init_params->socket_id,
-			vdev);
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
 	if (dev == NULL) {
 		NULL_CRYPTO_LOG_ERR("failed to create cryptodev vdev");
-		goto init_error;
+		return -EFAULT;
 	}
 
 	dev->driver_id = cryptodev_driver_id;
@@ -224,61 +214,53 @@ cryptodev_null_create(const char *name,
 	internals->max_nb_sessions = init_params->max_nb_sessions;
 
 	return 0;
-
-init_error:
-	NULL_CRYPTO_LOG_ERR("driver %s: cryptodev_null_create failed",
-			init_params->name);
-	cryptodev_null_remove(init_params->name);
-
-	return -EFAULT;
 }
 
 /** Initialise null crypto device */
 static int
 cryptodev_null_probe(struct rte_vdev_device *dev)
 {
-	struct rte_crypto_vdev_init_params init_params = {
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+	struct rte_cryptodev_pmd_init_params init_params = {
+		"",
+		sizeof(struct null_crypto_private),
 		rte_socket_id(),
-		{0}
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 	};
-	const char *name;
+	const char *name, *args;
+	int retval;
 
 	name = rte_vdev_device_name(dev);
 	if (name == NULL)
 		return -EINVAL;
 
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n",
-		name, init_params.socket_id);
-	if (init_params.name[0] != '\0')
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
+	args = rte_vdev_device_args(dev);
+
+	retval = rte_cryptodev_pmd_parse_input_args(&init_params, args);
+	if (retval) {
+		RTE_LOG(ERR, PMD,
+			"Failed to parse initialisation arguments[%s]\n", args);
+		return -EINVAL;
+	}
 
 	return cryptodev_null_create(name, dev, &init_params);
 }
 
-/** Uninitialise null crypto device */
 static int
-cryptodev_null_remove(const char *name)
+cryptodev_null_remove_dev(struct rte_vdev_device *vdev)
 {
+	struct rte_cryptodev *cryptodev;
+	const char *name;
+
+	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
 
-	RTE_LOG(INFO, PMD, "Closing null crypto device %s on numa socket %u\n",
-			name, rte_socket_id());
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
 
-	return 0;
-}
-
-static int
-cryptodev_null_remove_dev(struct rte_vdev_device *dev)
-{
-	return cryptodev_null_remove(rte_vdev_device_name(dev));
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_vdev_driver cryptodev_null_pmd_drv = {
diff --git a/drivers/crypto/openssl/rte_openssl_pmd.c b/drivers/crypto/openssl/rte_openssl_pmd.c
index 95c0236..25c1154 100644
--- a/drivers/crypto/openssl/rte_openssl_pmd.c
+++ b/drivers/crypto/openssl/rte_openssl_pmd.c
@@ -34,7 +34,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -1668,19 +1667,12 @@ openssl_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops,
 static int
 cryptodev_openssl_create(const char *name,
 			struct rte_vdev_device *vdev,
-			struct rte_crypto_vdev_init_params *init_params)
+			struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct openssl_private *internals;
 
-	if (init_params->name[0] == '\0')
-		snprintf(init_params->name, sizeof(init_params->name),
-				"%s", name);
-
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-			sizeof(struct openssl_private),
-			init_params->socket_id,
-			vdev);
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
 	if (dev == NULL) {
 		OPENSSL_LOG_ERR("failed to create cryptodev vdev");
 		goto init_error;
@@ -1718,11 +1710,12 @@ cryptodev_openssl_create(const char *name,
 static int
 cryptodev_openssl_probe(struct rte_vdev_device *vdev)
 {
-	struct rte_crypto_vdev_init_params init_params = {
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+	struct rte_cryptodev_pmd_init_params init_params = {
+		"",
+		sizeof(struct openssl_private),
 		rte_socket_id(),
-		{0}
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 	};
 	const char *name;
 	const char *input_args;
@@ -1732,17 +1725,7 @@ cryptodev_openssl_probe(struct rte_vdev_device *vdev)
 		return -EINVAL;
 	input_args = rte_vdev_device_args(vdev);
 
-	rte_cryptodev_vdev_parse_init_params(&init_params, input_args);
-
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name,
-			init_params.socket_id);
-	if (init_params.name[0] != '\0')
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
+	rte_cryptodev_pmd_parse_input_args(&init_params, input_args);
 
 	return cryptodev_openssl_create(name, vdev, &init_params);
 }
@@ -1751,17 +1734,18 @@ cryptodev_openssl_probe(struct rte_vdev_device *vdev)
 static int
 cryptodev_openssl_remove(struct rte_vdev_device *vdev)
 {
+	struct rte_cryptodev *cryptodev;
 	const char *name;
 
 	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
 
-	RTE_LOG(INFO, PMD,
-		"Closing OPENSSL crypto device %s on numa socket %u\n",
-		name, rte_socket_id());
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
 
-	return 0;
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_vdev_driver cryptodev_openssl_pmd_drv = {
diff --git a/drivers/crypto/scheduler/scheduler_pmd.c b/drivers/crypto/scheduler/scheduler_pmd.c
index 3170f7f..40ab304 100644
--- a/drivers/crypto/scheduler/scheduler_pmd.c
+++ b/drivers/crypto/scheduler/scheduler_pmd.c
@@ -33,7 +33,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -45,7 +44,7 @@
 uint8_t cryptodev_driver_id;
 
 struct scheduler_init_params {
-	struct rte_crypto_vdev_init_params def_p;
+	struct rte_cryptodev_pmd_init_params def_p;
 	uint32_t nb_slaves;
 	enum rte_cryptodev_scheduler_mode mode;
 	uint32_t enable_ordering;
@@ -107,21 +106,18 @@ cryptodev_scheduler_create(const char *name,
 	uint32_t i;
 	int ret;
 
-	if (init_params->def_p.name[0] == '\0')
-		snprintf(init_params->def_p.name,
-				sizeof(init_params->def_p.name),
-				"%s", name);
-
-	dev = rte_cryptodev_vdev_pmd_init(init_params->def_p.name,
-			sizeof(struct scheduler_ctx),
-			init_params->def_p.socket_id,
-			vdev);
+	dev = rte_cryptodev_pmd_create(name, &vdev->device,
+			&init_params->def_p);
 	if (dev == NULL) {
 		CS_LOG_ERR("driver %s: failed to create cryptodev vdev",
 			name);
 		return -EFAULT;
 	}
 
+	if (init_params->wcmask != 0)
+		RTE_LOG(INFO, PMD, "  workers core mask = %"PRIx64"\n",
+			init_params->wcmask);
+
 	dev->driver_id = cryptodev_driver_id;
 	dev->dev_ops = rte_crypto_scheduler_pmd_ops;
 
@@ -240,10 +236,7 @@ cryptodev_scheduler_remove(struct rte_vdev_device *vdev)
 					sched_ctx->slaves[i].dev_id);
 	}
 
-	RTE_LOG(INFO, PMD, "Closing Crypto Scheduler device %s on numa "
-		"socket %u\n", name, rte_socket_id());
-
-	return 0;
+	return rte_cryptodev_pmd_destroy(dev);
 }
 
 /** Parse integer from integer argument */
@@ -304,7 +297,7 @@ static int
 parse_name_arg(const char *key __rte_unused,
 		const char *value, void *extra_args)
 {
-	struct rte_crypto_vdev_init_params *params = extra_args;
+	struct rte_cryptodev_pmd_init_params *params = extra_args;
 
 	if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) {
 		CS_LOG_ERR("Invalid name %s, should be less than "
@@ -462,10 +455,11 @@ cryptodev_scheduler_probe(struct rte_vdev_device *vdev)
 {
 	struct scheduler_init_params init_params = {
 		.def_p = {
-			RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-			RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+			"",
+			sizeof(struct scheduler_ctx),
 			rte_socket_id(),
-			""
+			RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+			RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 		},
 		.nb_slaves = 0,
 		.mode = CDEV_SCHED_MODE_NOT_SET,
@@ -481,19 +475,6 @@ cryptodev_scheduler_probe(struct rte_vdev_device *vdev)
 	scheduler_parse_init_params(&init_params,
 				    rte_vdev_device_args(vdev));
 
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n",
-			name,
-			init_params.def_p.socket_id);
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.def_p.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.def_p.max_nb_sessions);
-	if (init_params.def_p.name[0] != '\0')
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.def_p.name);
-	if (init_params.wcmask != 0)
-		RTE_LOG(INFO, PMD, "  workers core mask = %"PRIx64"\n",
-			init_params.wcmask);
 
 	return cryptodev_scheduler_create(name,
 					vdev,
diff --git a/drivers/crypto/scheduler/scheduler_pmd_ops.c b/drivers/crypto/scheduler/scheduler_pmd_ops.c
index d379534..fef686f 100644
--- a/drivers/crypto/scheduler/scheduler_pmd_ops.c
+++ b/drivers/crypto/scheduler/scheduler_pmd_ops.c
@@ -37,7 +37,6 @@
 #include <rte_dev.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_reorder.h>
 
 #include "scheduler_pmd_private.h"
@@ -347,7 +346,7 @@ scheduler_pmd_info_get(struct rte_cryptodev *dev,
 {
 	struct scheduler_ctx *sched_ctx = dev->data->dev_private;
 	uint32_t max_nb_sessions = sched_ctx->nb_slaves ?
-			UINT32_MAX : RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS;
+			UINT32_MAX : RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS;
 	uint32_t i;
 
 	if (!dev_info)
diff --git a/drivers/crypto/snow3g/rte_snow3g_pmd.c b/drivers/crypto/snow3g/rte_snow3g_pmd.c
index 8e1d1ec..fe7bb86 100644
--- a/drivers/crypto/snow3g/rte_snow3g_pmd.c
+++ b/drivers/crypto/snow3g/rte_snow3g_pmd.c
@@ -35,7 +35,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -559,19 +558,13 @@ static int cryptodev_snow3g_remove(struct rte_vdev_device *vdev);
 static int
 cryptodev_snow3g_create(const char *name,
 			struct rte_vdev_device *vdev,
-			struct rte_crypto_vdev_init_params *init_params)
+			struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct snow3g_private *internals;
 	uint64_t cpu_flags = RTE_CRYPTODEV_FF_CPU_SSE;
 
-	if (init_params->name[0] == '\0')
-		snprintf(init_params->name, sizeof(init_params->name),
-				"%s", name);
-
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-			sizeof(struct snow3g_private), init_params->socket_id,
-			vdev);
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
 	if (dev == NULL) {
 		SNOW3G_LOG_ERR("failed to create cryptodev vdev");
 		goto init_error;
@@ -605,11 +598,12 @@ cryptodev_snow3g_create(const char *name,
 static int
 cryptodev_snow3g_probe(struct rte_vdev_device *vdev)
 {
-	struct rte_crypto_vdev_init_params init_params = {
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+	struct rte_cryptodev_pmd_init_params init_params = {
+		"",
+		sizeof(struct snow3g_private),
 		rte_socket_id(),
-		{0}
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 	};
 	const char *name;
 	const char *input_args;
@@ -619,17 +613,7 @@ cryptodev_snow3g_probe(struct rte_vdev_device *vdev)
 		return -EINVAL;
 	input_args = rte_vdev_device_args(vdev);
 
-	rte_cryptodev_vdev_parse_init_params(&init_params, input_args);
-
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name,
-			init_params.socket_id);
-	if (init_params.name[0] != '\0')
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
+	rte_cryptodev_pmd_parse_input_args(&init_params, input_args);
 
 	return cryptodev_snow3g_create(name, vdev, &init_params);
 }
@@ -637,17 +621,18 @@ cryptodev_snow3g_probe(struct rte_vdev_device *vdev)
 static int
 cryptodev_snow3g_remove(struct rte_vdev_device *vdev)
 {
+	struct rte_cryptodev *cryptodev;
 	const char *name;
 
 	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
 
-	RTE_LOG(INFO, PMD, "Closing SNOW 3G crypto device %s"
-			" on numa socket %u\n",
-			name, rte_socket_id());
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
 
-	return 0;
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_vdev_driver cryptodev_snow3g_pmd_drv = {
diff --git a/drivers/crypto/zuc/rte_zuc_pmd.c b/drivers/crypto/zuc/rte_zuc_pmd.c
index f1f9291..b99f6ec 100644
--- a/drivers/crypto/zuc/rte_zuc_pmd.c
+++ b/drivers/crypto/zuc/rte_zuc_pmd.c
@@ -35,7 +35,6 @@
 #include <rte_hexdump.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
-#include <rte_cryptodev_vdev.h>
 #include <rte_vdev.h>
 #include <rte_malloc.h>
 #include <rte_cpuflags.h>
@@ -463,19 +462,14 @@ static int cryptodev_zuc_remove(struct rte_vdev_device *vdev);
 static int
 cryptodev_zuc_create(const char *name,
 		struct rte_vdev_device *vdev,
-		struct rte_crypto_vdev_init_params *init_params)
+		struct rte_cryptodev_pmd_init_params *init_params)
 {
 	struct rte_cryptodev *dev;
 	struct zuc_private *internals;
 	uint64_t cpu_flags = RTE_CRYPTODEV_FF_CPU_SSE;
 
-	if (init_params->name[0] == '\0')
-		snprintf(init_params->name, sizeof(init_params->name),
-				"%s", name);
 
-	dev = rte_cryptodev_vdev_pmd_init(init_params->name,
-			sizeof(struct zuc_private), init_params->socket_id,
-			vdev);
+	dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
 	if (dev == NULL) {
 		ZUC_LOG_ERR("failed to create cryptodev vdev");
 		goto init_error;
@@ -509,11 +503,12 @@ cryptodev_zuc_create(const char *name,
 static int
 cryptodev_zuc_probe(struct rte_vdev_device *vdev)
 {
-	struct rte_crypto_vdev_init_params init_params = {
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS,
-		RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS,
+	struct rte_cryptodev_pmd_init_params init_params = {
+		"",
+		sizeof(struct zuc_private),
 		rte_socket_id(),
-		{0}
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
+		RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS
 	};
 	const char *name;
 	const char *input_args;
@@ -523,17 +518,7 @@ cryptodev_zuc_probe(struct rte_vdev_device *vdev)
 		return -EINVAL;
 	input_args = rte_vdev_device_args(vdev);
 
-	rte_cryptodev_vdev_parse_init_params(&init_params, input_args);
-
-	RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name,
-			init_params.socket_id);
-	if (init_params.name[0] != '\0')
-		RTE_LOG(INFO, PMD, "  User defined name = %s\n",
-			init_params.name);
-	RTE_LOG(INFO, PMD, "  Max number of queue pairs = %d\n",
-			init_params.max_nb_queue_pairs);
-	RTE_LOG(INFO, PMD, "  Max number of sessions = %d\n",
-			init_params.max_nb_sessions);
+	rte_cryptodev_pmd_parse_input_args(&init_params, input_args);
 
 	return cryptodev_zuc_create(name, vdev, &init_params);
 }
@@ -541,17 +526,19 @@ cryptodev_zuc_probe(struct rte_vdev_device *vdev)
 static int
 cryptodev_zuc_remove(struct rte_vdev_device *vdev)
 {
+
+	struct rte_cryptodev *cryptodev;
 	const char *name;
 
 	name = rte_vdev_device_name(vdev);
 	if (name == NULL)
 		return -EINVAL;
 
-	RTE_LOG(INFO, PMD, "Closing ZUC crypto device %s"
-			" on numa socket %u\n",
-			name, rte_socket_id());
+	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
+	if (cryptodev == NULL)
+		return -ENODEV;
 
-	return 0;
+	return rte_cryptodev_pmd_destroy(cryptodev);
 }
 
 static struct rte_vdev_driver cryptodev_zuc_pmd_drv = {
diff --git a/lib/librte_cryptodev/Makefile b/lib/librte_cryptodev/Makefile
index bb58ea1..0e019ed 100644
--- a/lib/librte_cryptodev/Makefile
+++ b/lib/librte_cryptodev/Makefile
@@ -50,7 +50,6 @@ SYMLINK-y-include += rte_crypto.h
 SYMLINK-y-include += rte_crypto_sym.h
 SYMLINK-y-include += rte_cryptodev.h
 SYMLINK-y-include += rte_cryptodev_pmd.h
-SYMLINK-y-include += rte_cryptodev_vdev.h
 SYMLINK-y-include += rte_cryptodev_pci.h
 
 # versioning export map
diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.c b/lib/librte_cryptodev/rte_cryptodev_pmd.c
index ca6d459..0b5741a 100644
--- a/lib/librte_cryptodev/rte_cryptodev_pmd.c
+++ b/lib/librte_cryptodev/rte_cryptodev_pmd.c
@@ -32,7 +32,6 @@
 
 #include <rte_malloc.h>
 
-#include "rte_cryptodev_vdev.h"
 #include "rte_cryptodev_pci.h"
 #include "rte_cryptodev_pmd.h"
 
@@ -204,125 +203,6 @@ rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev)
 	return 0;
 }
 
-/**
- * Parse name from argument
- */
-static int
-rte_cryptodev_vdev_parse_name_arg(const char *key __rte_unused,
-		const char *value, void *extra_args)
-{
-	struct rte_crypto_vdev_init_params *params = extra_args;
-
-	if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) {
-		CDEV_LOG_ERR("Invalid name %s, should be less than "
-				"%u bytes", value,
-				RTE_CRYPTODEV_NAME_MAX_LEN - 1);
-		return -1;
-	}
-
-	strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN);
-
-	return 0;
-}
-
-/**
- * Parse integer from argument
- */
-static int
-rte_cryptodev_vdev_parse_integer_arg(const char *key __rte_unused,
-		const char *value, void *extra_args)
-{
-	int *i = extra_args;
-
-	*i = atoi(value);
-	if (*i < 0) {
-		CDEV_LOG_ERR("Argument has to be positive.");
-		return -1;
-	}
-
-	return 0;
-}
-
-struct rte_cryptodev *
-rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
-		int socket_id, struct rte_vdev_device *vdev)
-{
-	struct rte_cryptodev *cryptodev;
-
-	/* allocate device structure */
-	cryptodev = rte_cryptodev_pmd_allocate(name, socket_id);
-	if (cryptodev == NULL)
-		return NULL;
-
-	/* allocate private device structure */
-	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
-		cryptodev->data->dev_private =
-				rte_zmalloc_socket("cryptodev device private",
-						dev_private_size,
-						RTE_CACHE_LINE_SIZE,
-						socket_id);
-
-		if (cryptodev->data->dev_private == NULL)
-			rte_panic("Cannot allocate memzone for private device"
-					" data");
-	}
-
-	cryptodev->device = &vdev->device;
-
-	/* initialise user call-back tail queue */
-	TAILQ_INIT(&(cryptodev->link_intr_cbs));
-
-	return cryptodev;
-}
-
-int
-rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params,
-		const char *input_args)
-{
-	struct rte_kvargs *kvlist = NULL;
-	int ret = 0;
-
-	if (params == NULL)
-		return -EINVAL;
-
-	if (input_args) {
-		kvlist = rte_kvargs_parse(input_args,
-				cryptodev_vdev_valid_params);
-		if (kvlist == NULL)
-			return -1;
-
-		ret = rte_kvargs_process(kvlist,
-					RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG,
-					&rte_cryptodev_vdev_parse_integer_arg,
-					&params->max_nb_queue_pairs);
-		if (ret < 0)
-			goto free_kvlist;
-
-		ret = rte_kvargs_process(kvlist,
-					RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG,
-					&rte_cryptodev_vdev_parse_integer_arg,
-					&params->max_nb_sessions);
-		if (ret < 0)
-			goto free_kvlist;
-
-		ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_SOCKET_ID,
-					&rte_cryptodev_vdev_parse_integer_arg,
-					&params->socket_id);
-		if (ret < 0)
-			goto free_kvlist;
-
-		ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_NAME,
-					&rte_cryptodev_vdev_parse_name_arg,
-					params);
-		if (ret < 0)
-			goto free_kvlist;
-	}
-
-free_kvlist:
-	rte_kvargs_free(kvlist);
-	return ret;
-}
-
 int
 rte_cryptodev_pci_generic_probe(struct rte_pci_device *pci_dev,
 			size_t private_data_size,
diff --git a/lib/librte_cryptodev/rte_cryptodev_vdev.h b/lib/librte_cryptodev/rte_cryptodev_vdev.h
deleted file mode 100644
index 94ab9d3..0000000
--- a/lib/librte_cryptodev/rte_cryptodev_vdev.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2017 Intel Corporation. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of the copyright holder nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _RTE_CRYPTODEV_VDEV_H_
-#define _RTE_CRYPTODEV_VDEV_H_
-
-#include <rte_vdev.h>
-#include <inttypes.h>
-
-#include "rte_cryptodev.h"
-
-#define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS	8
-#define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS	2048
-
-#define RTE_CRYPTODEV_VDEV_NAME				("name")
-#define RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG		("max_nb_queue_pairs")
-#define RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG		("max_nb_sessions")
-#define RTE_CRYPTODEV_VDEV_SOCKET_ID			("socket_id")
-
-static const char * const cryptodev_vdev_valid_params[] = {
-	RTE_CRYPTODEV_VDEV_NAME,
-	RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG,
-	RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG,
-	RTE_CRYPTODEV_VDEV_SOCKET_ID
-};
-
-/**
- * @internal
- * Initialisation parameters for virtual crypto devices
- */
-struct rte_crypto_vdev_init_params {
-	unsigned int max_nb_queue_pairs;
-	unsigned int max_nb_sessions;
-	uint8_t socket_id;
-	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
-};
-
-/**
- * @internal
- * Creates a new virtual crypto device and returns the pointer
- * to that device.
- *
- * @param	name			PMD type name
- * @param	dev_private_size	Size of crypto PMDs private data
- * @param	socket_id		Socket to allocate resources on.
- * @param	vdev			Pointer to virtual device structure.
- *
- * @return
- *   - Cryptodev pointer if device is successfully created.
- *   - NULL if device cannot be created.
- */
-struct rte_cryptodev *
-rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
-		int socket_id, struct rte_vdev_device *vdev);
-
-/**
- * @internal
- * Parse virtual device initialisation parameters input arguments
- *
- * @params	params		Initialisation parameters with defaults set.
- * @params	input_args	Command line arguments
- *
- * @return
- * 0 on successful parse
- * <0 on failure to parse
- */
-int
-rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params,
-		const char *input_args);
-
-#endif /* _RTE_CRYPTODEV_VDEV_H_ */
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index a0ea7bf..d3e4515 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -73,8 +73,6 @@ DPDK_17.08 {
 	rte_cryptodev_sym_capability_check_aead;
 	rte_cryptodev_sym_session_init;
 	rte_cryptodev_sym_session_clear;
-	rte_cryptodev_vdev_parse_init_params;
-	rte_cryptodev_vdev_pmd_init;
 	rte_crypto_aead_algorithm_strings;
 	rte_crypto_aead_operation_strings;
 
-- 
2.9.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v2 1/3] cryptodev: add new APIs to assist PMD initialisation
  @ 2017-10-25 12:00  3%   ` Declan Doherty
  2017-10-25 12:00  1%   ` [dpdk-dev] [PATCH v2 2/3] cryptodev: break dependency on virtual device bus Declan Doherty
  2017-10-25 12:00  3%   ` [dpdk-dev] [PATCH v2 3/3] cryptodev: break dependency on PCI " Declan Doherty
  2 siblings, 0 replies; 200+ results
From: Declan Doherty @ 2017-10-25 12:00 UTC (permalink / raw)
  To: dev; +Cc: Declan Doherty

Adds new PMD assist functions which are bus independent for driver to
create and destroy new device instances.

Also includes function to parse parameters which can be passed to
driver on device initialisation.

Signed-off-by: Declan Doherty <declan.doherty@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst         |   6 +
 lib/librte_cryptodev/rte_cryptodev.h           |   8 +-
 lib/librte_cryptodev/rte_cryptodev_pmd.c       | 168 +++++++++++++++++++++++++
 lib/librte_cryptodev/rte_cryptodev_pmd.h       |  86 +++++++++++++
 lib/librte_cryptodev/rte_cryptodev_version.map |   3 +
 5 files changed, 267 insertions(+), 4 deletions(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index e4e98f7..0a90db4 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -291,6 +291,12 @@ API Changes
   ``rte_log_get_global_level()``, ``rte_log_set_level()`` and
   ``rte_log_get_level()``.
 
+* **Add bus agnostic functions to crytpodev for PMD initialisation**
+
+  Adds new PMD assist functions ``rte_cryptodev_pmd_parse_input_args()``,
+  ``rte_cryptodev_pmd_create()`` and ``rte_cryptodev_pmd_destroy()`` which
+  are bus independent for driver to manage creation and destruction of new
+  device instances.
 
 ABI Changes
 -----------
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index fd0e3f1..e054c50 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -60,10 +60,10 @@ extern const char **rte_cyptodev_names;
 		RTE_FMT("%s() line %u: " RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
 			__func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__,)))
 
-#define CDEV_PMD_LOG_ERR(dev, ...) \
-	RTE_LOG(ERR, CRYPTODEV, \
-		RTE_FMT("[%s] %s() line %u: " RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
-			dev, __func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__,)))
+#define CDEV_LOG_INFO(...) \
+	RTE_LOG(INFO, CRYPTODEV, \
+		RTE_FMT(RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
+			RTE_FMT_TAIL(__VA_ARGS__,)))
 
 #ifdef RTE_LIBRTE_CRYPTODEV_DEBUG
 #define CDEV_LOG_DEBUG(...) \
diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.c b/lib/librte_cryptodev/rte_cryptodev_pmd.c
index a57faad..ca6d459 100644
--- a/lib/librte_cryptodev/rte_cryptodev_pmd.c
+++ b/lib/librte_cryptodev/rte_cryptodev_pmd.c
@@ -40,6 +40,174 @@
  * Parse name from argument
  */
 static int
+rte_cryptodev_pmd_parse_name_arg(const char *key __rte_unused,
+		const char *value, void *extra_args)
+{
+	struct rte_cryptodev_pmd_init_params *params = extra_args;
+	int n;
+
+	n = snprintf(params->name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s",value);
+	if (n >= RTE_CRYPTODEV_NAME_MAX_LEN)
+		return -EINVAL;
+
+	return 0;
+}
+
+/**
+ * Parse unsigned integer from argument
+ */
+static int
+rte_cryptodev_pmd_parse_uint_arg(const char *key __rte_unused,
+		const char *value, void *extra_args)
+{
+	int i;
+	char *end;
+	errno = 0;
+
+	i = strtol(value, &end, 10);
+	if (*end != 0 || errno != 0 || i < 0)
+		return -EINVAL;
+
+	*((uint32_t *)extra_args) = i;
+	return 0;
+}
+
+int
+rte_cryptodev_pmd_parse_input_args(
+		struct rte_cryptodev_pmd_init_params *params,
+		const char *args)
+{
+	struct rte_kvargs *kvlist = NULL;
+	int ret = 0;
+
+	if (params == NULL)
+		return -EINVAL;
+
+	if (args) {
+		kvlist = rte_kvargs_parse(args,	cryptodev_pmd_valid_params);
+		if (kvlist == NULL)
+			return -EINVAL;
+
+		ret = rte_kvargs_process(kvlist,
+				RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG,
+				&rte_cryptodev_pmd_parse_uint_arg,
+				&params->max_nb_queue_pairs);
+		if (ret < 0)
+			goto free_kvlist;
+
+		ret = rte_kvargs_process(kvlist,
+				RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG,
+				&rte_cryptodev_pmd_parse_uint_arg,
+				&params->max_nb_sessions);
+		if (ret < 0)
+			goto free_kvlist;
+
+		ret = rte_kvargs_process(kvlist,
+				RTE_CRYPTODEV_PMD_SOCKET_ID_ARG,
+				&rte_cryptodev_pmd_parse_uint_arg,
+				&params->socket_id);
+		if (ret < 0)
+			goto free_kvlist;
+
+		ret = rte_kvargs_process(kvlist,
+				RTE_CRYPTODEV_PMD_NAME_ARG,
+				&rte_cryptodev_pmd_parse_name_arg,
+				params);
+		if (ret < 0)
+			goto free_kvlist;
+	}
+
+free_kvlist:
+	rte_kvargs_free(kvlist);
+	return ret;
+}
+
+struct rte_cryptodev *
+rte_cryptodev_pmd_create(const char *name,
+		struct rte_device *device,
+		struct rte_cryptodev_pmd_init_params *params)
+{
+	struct rte_cryptodev *cryptodev;
+
+	if (params->name[0] != '\0') {
+		CDEV_LOG_INFO("[%s] User specified device name = %s\n",
+				device->driver->name, params->name);
+		name = params->name;
+	}
+
+	CDEV_LOG_INFO("[%s] - Creating cryptodev %s\n",
+			device->driver->name, name);
+
+	CDEV_LOG_INFO("[%s] - Initialisation parameters - name: %s,"
+			"socket id: %d, max queue pairs: %u, max sessions: %u",
+			device->driver->name, name,
+			params->socket_id, params->max_nb_queue_pairs,
+			params->max_nb_sessions);
+
+	/* allocate device structure */
+	cryptodev = rte_cryptodev_pmd_allocate(name, params->socket_id);
+	if (cryptodev == NULL) {
+		CDEV_LOG_ERR("[%s] Failed to allocate crypto device for %s",
+				device->driver->name, name);
+		return NULL;
+	}
+
+	/* allocate private device structure */
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		cryptodev->data->dev_private =
+				rte_zmalloc_socket("cryptodev device private",
+						params->private_data_size,
+						RTE_CACHE_LINE_SIZE,
+						params->socket_id);
+
+		if (cryptodev->data->dev_private == NULL) {
+			CDEV_LOG_ERR("[%s] Cannot allocate memory for "
+					"cryptodev %s private data",
+					device->driver->name, name);
+
+			rte_cryptodev_pmd_release_device(cryptodev);
+			return NULL;
+		}
+	}
+
+	cryptodev->device = device;
+
+	/* initialise user call-back tail queue */
+	TAILQ_INIT(&(cryptodev->link_intr_cbs));
+
+	return cryptodev;
+}
+
+
+
+int
+rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev)
+{
+	int retval;
+
+	CDEV_LOG_INFO("[%s] Closing crypto device %s",
+			cryptodev->device->driver->name,
+			cryptodev->device->name);
+
+	/* free crypto device */
+	retval = rte_cryptodev_pmd_release_device(cryptodev);
+	if (retval)
+		return retval;
+
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+		rte_free(cryptodev->data->dev_private);
+
+
+	cryptodev->device = NULL;
+	cryptodev->data = NULL;
+
+	return 0;
+}
+
+/**
+ * Parse name from argument
+ */
+static int
 rte_cryptodev_vdev_parse_name_arg(const char *key __rte_unused,
 		const char *value, void *extra_args)
 {
diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.h b/lib/librte_cryptodev/rte_cryptodev_pmd.h
index ba074e1..744405e 100644
--- a/lib/librte_cryptodev/rte_cryptodev_pmd.h
+++ b/lib/librte_cryptodev/rte_cryptodev_pmd.h
@@ -56,6 +56,35 @@ extern "C" {
 #include "rte_crypto.h"
 #include "rte_cryptodev.h"
 
+
+#define RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS	8
+#define RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS	2048
+
+#define RTE_CRYPTODEV_PMD_NAME_ARG			("name")
+#define RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG			("max_nb_queue_pairs")
+#define RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG		("max_nb_sessions")
+#define RTE_CRYPTODEV_PMD_SOCKET_ID_ARG			("socket_id")
+
+
+static const char * const cryptodev_pmd_valid_params[] = {
+	RTE_CRYPTODEV_PMD_NAME_ARG,
+	RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG,
+	RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG,
+	RTE_CRYPTODEV_PMD_SOCKET_ID_ARG
+};
+
+/**
+ * @internal
+ * Initialisation parameters for crypto devices
+ */
+struct rte_cryptodev_pmd_init_params {
+	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
+	size_t private_data_size;
+	int socket_id;
+	unsigned int max_nb_queue_pairs;
+	unsigned int max_nb_sessions;
+};
+
 /** Global structure used for maintaining state of allocated crypto devices */
 struct rte_cryptodev_global {
 	struct rte_cryptodev *devs;	/**< Device information array */
@@ -392,6 +421,63 @@ rte_cryptodev_pmd_allocate(const char *name, int socket_id);
 extern int
 rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev);
 
+
+/**
+ * @internal
+ *
+ * PMD assist function to parse initialisation arguments for crypto driver
+ * when creating a new crypto PMD device instance.
+ *
+ * PMD driver should set default values for that PMD before calling function,
+ * these default values will be over-written with successfully parsed values
+ * from args string.
+ *
+ * @param	params	parsed PMD initialisation parameters
+ * @param	args	input argument string to parse
+ *
+ * @return
+ *  - 0 on success
+ *  - errno on failure
+ */
+int
+rte_cryptodev_pmd_parse_input_args(
+		struct rte_cryptodev_pmd_init_params *params,
+		const char *args);
+
+/**
+ * @internal
+ *
+ * PMD assist function to provide boiler plate code for crypto driver to create
+ * and allocate resources for a new crypto PMD device instance.
+ *
+ * @param	name	crypto device name.
+ * @param	device	base device instance
+ * @param	params	PMD initialisation parameters
+ *
+ * @return
+ *  - crypto device instance on success
+ *  - NULL on creation failure
+ */
+struct rte_cryptodev *
+rte_cryptodev_pmd_create(const char *name,
+		struct rte_device *device,
+		struct rte_cryptodev_pmd_init_params *params);
+
+/**
+ * @internal
+ *
+ * PMD assist function to provide boiler plate code for crypto driver to
+ * destroy and free resources associated with a crypto PMD device instance.
+ *
+ * @param	cryptodev	crypto device handle.
+ *
+ * @return
+ *  - 0 on success
+ *  - errno on failure
+ */
+int
+rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev);
+
 /**
  * Executes all the user application registered callbacks for the specific
  * device.
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index 919b6cc..a0ea7bf 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -84,5 +84,8 @@ DPDK_17.11 {
 	global:
 
 	rte_cryptodev_name_get;
+	rte_cryptodev_pmd_create;
+	rte_cryptodev_pmd_destroy;
+	rte_cryptodev_pmd_parse_input_args;
 
 } DPDK_17.08;
-- 
2.9.4

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
  2017-10-25 10:12  0%                   ` Thomas Monjalon
@ 2017-10-25 10:32  0%                     ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2017-10-25 10:32 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: santosh, dev, olivier.matz, jerin.jacob, hemant.agrawal, Burakov,
	Anatoly

On Wed, Oct 25, 2017 at 12:12:57PM +0200, Thomas Monjalon wrote:
> 25/10/2017 12:05, Bruce Richardson:
> > On Wed, Oct 25, 2017 at 12:01:26PM +0200, Thomas Monjalon wrote:
> > > 25/10/2017 11:50, Richardson, Bruce:
> > > > From: Thomas Monjalon
> > > > > > On Tuesday 24 October 2017 01:59 AM, Thomas Monjalon wrote:
> > > > > > > 20/10/2017 14:31, Santosh Shukla:
> > > > > > >> Removed dpdk iova aware ABI deprecation notice, and updated ABI
> > > > > > >> change details in release_17.11.rst.
> > > > > > >>
> > > > > > >> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> > > > > > >> Acked-by: John McNamara <john.mcnamara@intel.com>
> > > > > > >> ---
> > > > > > >> --- a/doc/guides/rel_notes/deprecation.rst
> > > > > > >> +++ b/doc/guides/rel_notes/deprecation.rst
> > > > > > >> -* eal: An ABI change is planned for 17.11 to make DPDK aware of
> > > > > > >> IOVA address
> > > > > > >> -  translation scheme.
> > > > > > >> -  Reference to phys address in EAL data-structure or functions may
> > > > > > >> change to
> > > > > > >> -  IOVA address or more appropriate name.
> > > > > > >> -  The change will be only for the name.
> > > > > > >> -  Functional aspects of the API or data-structure will remain same.
> > > > > > > Sorry, this series cannot be applied as is because it is breaking
> > > > > > > more than EAL API. The API of mbuf and mempool are also changed.
> > > > > > > We need to choose one of these three options:
> > > > > > > 	1/ accept to break all API in 17.11
> > > > > > > 	2/ postpone the whole series to 18.02
> > > > > >
> > > > > > Theme of series is to make dpdk iova aware so I would prefer option 1)
> > > > > or 2).
> > > > > > However I have no strong opinion on this topic.
> > > > > > Lets get more opinion from others about option 1/2/3.
> > > > > >
> > > > > > > 	3/ rename only EAL API in 17.11 and postpone mbuf/mempool
> > > > > 
> > > > > After discussing with Olivier it appeared there is a fourth solution.
> > > > > We should not break any API (EAL, mbuf, mempool).
> > > > > 
> > > > > I would like to merge these changes in RC2, but keeping compatibility with
> > > > > old names:
> > > > > - When you rename a function or a type, you can define a macro for the old
> > > > > name, alias the new name.
> > > > 
> > > > Note: using a macro doesn't prevent the ABI being broken if you rename a public function. You'll need to use function versioning too.
> > > 
> > > True
> > > We can use an inline function to avoid ABI breakage.
> > 
> > Nope, inline function won't work either, since that ends up the same as
> > the macro and compiled into the end app, not the library ABI. You
> > need a public non-inline wrapper function to keep ABI, or else function
> > renaming via symbol versioning/mapping.
> 
> Ah ah ah, I'm writing before thinking :)
> Yes, the function must not be inlined.
> 
> And generally speaking it is not an issue,
> even for performance critical functions.
> Adding one more function call in the path is not a bad thing
> for deprecated functions.
> I've seen another project (don't remember which one) adding a
> sleep() in deprecated functions and increasing the sleep time
> at each new release :)

Genius!!

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
  2017-10-25 10:05  4%                 ` Bruce Richardson
@ 2017-10-25 10:12  0%                   ` Thomas Monjalon
  2017-10-25 10:32  0%                     ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-25 10:12 UTC (permalink / raw)
  To: Bruce Richardson
  Cc: santosh, dev, olivier.matz, jerin.jacob, hemant.agrawal, Burakov,
	Anatoly

25/10/2017 12:05, Bruce Richardson:
> On Wed, Oct 25, 2017 at 12:01:26PM +0200, Thomas Monjalon wrote:
> > 25/10/2017 11:50, Richardson, Bruce:
> > > From: Thomas Monjalon
> > > > > On Tuesday 24 October 2017 01:59 AM, Thomas Monjalon wrote:
> > > > > > 20/10/2017 14:31, Santosh Shukla:
> > > > > >> Removed dpdk iova aware ABI deprecation notice, and updated ABI
> > > > > >> change details in release_17.11.rst.
> > > > > >>
> > > > > >> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> > > > > >> Acked-by: John McNamara <john.mcnamara@intel.com>
> > > > > >> ---
> > > > > >> --- a/doc/guides/rel_notes/deprecation.rst
> > > > > >> +++ b/doc/guides/rel_notes/deprecation.rst
> > > > > >> -* eal: An ABI change is planned for 17.11 to make DPDK aware of
> > > > > >> IOVA address
> > > > > >> -  translation scheme.
> > > > > >> -  Reference to phys address in EAL data-structure or functions may
> > > > > >> change to
> > > > > >> -  IOVA address or more appropriate name.
> > > > > >> -  The change will be only for the name.
> > > > > >> -  Functional aspects of the API or data-structure will remain same.
> > > > > > Sorry, this series cannot be applied as is because it is breaking
> > > > > > more than EAL API. The API of mbuf and mempool are also changed.
> > > > > > We need to choose one of these three options:
> > > > > > 	1/ accept to break all API in 17.11
> > > > > > 	2/ postpone the whole series to 18.02
> > > > >
> > > > > Theme of series is to make dpdk iova aware so I would prefer option 1)
> > > > or 2).
> > > > > However I have no strong opinion on this topic.
> > > > > Lets get more opinion from others about option 1/2/3.
> > > > >
> > > > > > 	3/ rename only EAL API in 17.11 and postpone mbuf/mempool
> > > > 
> > > > After discussing with Olivier it appeared there is a fourth solution.
> > > > We should not break any API (EAL, mbuf, mempool).
> > > > 
> > > > I would like to merge these changes in RC2, but keeping compatibility with
> > > > old names:
> > > > - When you rename a function or a type, you can define a macro for the old
> > > > name, alias the new name.
> > > 
> > > Note: using a macro doesn't prevent the ABI being broken if you rename a public function. You'll need to use function versioning too.
> > 
> > True
> > We can use an inline function to avoid ABI breakage.
> 
> Nope, inline function won't work either, since that ends up the same as
> the macro and compiled into the end app, not the library ABI. You
> need a public non-inline wrapper function to keep ABI, or else function
> renaming via symbol versioning/mapping.

Ah ah ah, I'm writing before thinking :)
Yes, the function must not be inlined.

And generally speaking it is not an issue,
even for performance critical functions.
Adding one more function call in the path is not a bad thing
for deprecated functions.
I've seen another project (don't remember which one) adding a
sleep() in deprecated functions and increasing the sleep time
at each new release :)

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
  2017-10-25 10:01  3%               ` Thomas Monjalon
@ 2017-10-25 10:05  4%                 ` Bruce Richardson
  2017-10-25 10:12  0%                   ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2017-10-25 10:05 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: santosh, dev, olivier.matz, jerin.jacob, hemant.agrawal, Burakov,
	Anatoly

On Wed, Oct 25, 2017 at 12:01:26PM +0200, Thomas Monjalon wrote:
> 25/10/2017 11:50, Richardson, Bruce:
> > 
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > > Sent: Wednesday, October 25, 2017 10:46 AM
> > > To: santosh <santosh.shukla@caviumnetworks.com>
> > > Cc: dev@dpdk.org; olivier.matz@6wind.com; jerin.jacob@caviumnetworks.com;
> > > hemant.agrawal@nxp.com; Burakov, Anatoly <anatoly.burakov@intel.com>
> > > Subject: Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
> > > 
> > > Hi Santosh,
> > > 
> > > 24/10/2017 07:06, santosh:
> > > > Hi Thomas,
> > > >
> > > >
> > > > On Tuesday 24 October 2017 01:59 AM, Thomas Monjalon wrote:
> > > > > 20/10/2017 14:31, Santosh Shukla:
> > > > >> Removed dpdk iova aware ABI deprecation notice, and updated ABI
> > > > >> change details in release_17.11.rst.
> > > > >>
> > > > >> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> > > > >> Acked-by: John McNamara <john.mcnamara@intel.com>
> > > > >> ---
> > > > >> --- a/doc/guides/rel_notes/deprecation.rst
> > > > >> +++ b/doc/guides/rel_notes/deprecation.rst
> > > > >> -* eal: An ABI change is planned for 17.11 to make DPDK aware of
> > > > >> IOVA address
> > > > >> -  translation scheme.
> > > > >> -  Reference to phys address in EAL data-structure or functions may
> > > > >> change to
> > > > >> -  IOVA address or more appropriate name.
> > > > >> -  The change will be only for the name.
> > > > >> -  Functional aspects of the API or data-structure will remain same.
> > > > > Sorry, this series cannot be applied as is because it is breaking
> > > > > more than EAL API. The API of mbuf and mempool are also changed.
> > > > > We need to choose one of these three options:
> > > > > 	1/ accept to break all API in 17.11
> > > > > 	2/ postpone the whole series to 18.02
> > > >
> > > > Theme of series is to make dpdk iova aware so I would prefer option 1)
> > > or 2).
> > > > However I have no strong opinion on this topic.
> > > > Lets get more opinion from others about option 1/2/3.
> > > >
> > > > > 	3/ rename only EAL API in 17.11 and postpone mbuf/mempool
> > > 
> > > After discussing with Olivier it appeared there is a fourth solution.
> > > We should not break any API (EAL, mbuf, mempool).
> > > 
> > > I would like to merge these changes in RC2, but keeping compatibility with
> > > old names:
> > > - When you rename a function or a type, you can define a macro for the old
> > > name, alias the new name.
> > 
> > Note: using a macro doesn't prevent the ABI being broken if you rename a public function. You'll need to use function versioning too.
> 
> True
> We can use an inline function to avoid ABI breakage.

Nope, inline function won't work either, since that ends up the same as
the macro and compiled into the end app, not the library ABI. You
need a public non-inline wrapper function to keep ABI, or else function
renaming via symbol versioning/mapping.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
  2017-10-25  9:50  3%             ` Richardson, Bruce
@ 2017-10-25 10:01  3%               ` Thomas Monjalon
  2017-10-25 10:05  4%                 ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-25 10:01 UTC (permalink / raw)
  To: Richardson, Bruce
  Cc: santosh, dev, olivier.matz, jerin.jacob, hemant.agrawal, Burakov,
	Anatoly

25/10/2017 11:50, Richardson, Bruce:
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > Sent: Wednesday, October 25, 2017 10:46 AM
> > To: santosh <santosh.shukla@caviumnetworks.com>
> > Cc: dev@dpdk.org; olivier.matz@6wind.com; jerin.jacob@caviumnetworks.com;
> > hemant.agrawal@nxp.com; Burakov, Anatoly <anatoly.burakov@intel.com>
> > Subject: Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
> > 
> > Hi Santosh,
> > 
> > 24/10/2017 07:06, santosh:
> > > Hi Thomas,
> > >
> > >
> > > On Tuesday 24 October 2017 01:59 AM, Thomas Monjalon wrote:
> > > > 20/10/2017 14:31, Santosh Shukla:
> > > >> Removed dpdk iova aware ABI deprecation notice, and updated ABI
> > > >> change details in release_17.11.rst.
> > > >>
> > > >> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> > > >> Acked-by: John McNamara <john.mcnamara@intel.com>
> > > >> ---
> > > >> --- a/doc/guides/rel_notes/deprecation.rst
> > > >> +++ b/doc/guides/rel_notes/deprecation.rst
> > > >> -* eal: An ABI change is planned for 17.11 to make DPDK aware of
> > > >> IOVA address
> > > >> -  translation scheme.
> > > >> -  Reference to phys address in EAL data-structure or functions may
> > > >> change to
> > > >> -  IOVA address or more appropriate name.
> > > >> -  The change will be only for the name.
> > > >> -  Functional aspects of the API or data-structure will remain same.
> > > > Sorry, this series cannot be applied as is because it is breaking
> > > > more than EAL API. The API of mbuf and mempool are also changed.
> > > > We need to choose one of these three options:
> > > > 	1/ accept to break all API in 17.11
> > > > 	2/ postpone the whole series to 18.02
> > >
> > > Theme of series is to make dpdk iova aware so I would prefer option 1)
> > or 2).
> > > However I have no strong opinion on this topic.
> > > Lets get more opinion from others about option 1/2/3.
> > >
> > > > 	3/ rename only EAL API in 17.11 and postpone mbuf/mempool
> > 
> > After discussing with Olivier it appeared there is a fourth solution.
> > We should not break any API (EAL, mbuf, mempool).
> > 
> > I would like to merge these changes in RC2, but keeping compatibility with
> > old names:
> > - When you rename a function or a type, you can define a macro for the old
> > name, alias the new name.
> 
> Note: using a macro doesn't prevent the ABI being broken if you rename a public function. You'll need to use function versioning too.

True
We can use an inline function to avoid ABI breakage.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
  2017-10-25  9:45  0%           ` Thomas Monjalon
@ 2017-10-25  9:50  3%             ` Richardson, Bruce
  2017-10-25 10:01  3%               ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Richardson, Bruce @ 2017-10-25  9:50 UTC (permalink / raw)
  To: Thomas Monjalon, santosh
  Cc: dev, olivier.matz, jerin.jacob, hemant.agrawal, Burakov, Anatoly



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> Sent: Wednesday, October 25, 2017 10:46 AM
> To: santosh <santosh.shukla@caviumnetworks.com>
> Cc: dev@dpdk.org; olivier.matz@6wind.com; jerin.jacob@caviumnetworks.com;
> hemant.agrawal@nxp.com; Burakov, Anatoly <anatoly.burakov@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
> 
> Hi Santosh,
> 
> 24/10/2017 07:06, santosh:
> > Hi Thomas,
> >
> >
> > On Tuesday 24 October 2017 01:59 AM, Thomas Monjalon wrote:
> > > 20/10/2017 14:31, Santosh Shukla:
> > >> Removed dpdk iova aware ABI deprecation notice, and updated ABI
> > >> change details in release_17.11.rst.
> > >>
> > >> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> > >> Acked-by: John McNamara <john.mcnamara@intel.com>
> > >> ---
> > >> --- a/doc/guides/rel_notes/deprecation.rst
> > >> +++ b/doc/guides/rel_notes/deprecation.rst
> > >> -* eal: An ABI change is planned for 17.11 to make DPDK aware of
> > >> IOVA address
> > >> -  translation scheme.
> > >> -  Reference to phys address in EAL data-structure or functions may
> > >> change to
> > >> -  IOVA address or more appropriate name.
> > >> -  The change will be only for the name.
> > >> -  Functional aspects of the API or data-structure will remain same.
> > > Sorry, this series cannot be applied as is because it is breaking
> > > more than EAL API. The API of mbuf and mempool are also changed.
> > > We need to choose one of these three options:
> > > 	1/ accept to break all API in 17.11
> > > 	2/ postpone the whole series to 18.02
> >
> > Theme of series is to make dpdk iova aware so I would prefer option 1)
> or 2).
> > However I have no strong opinion on this topic.
> > Lets get more opinion from others about option 1/2/3.
> >
> > > 	3/ rename only EAL API in 17.11 and postpone mbuf/mempool
> 
> After discussing with Olivier it appeared there is a fourth solution.
> We should not break any API (EAL, mbuf, mempool).
> 
> I would like to merge these changes in RC2, but keeping compatibility with
> old names:
> - When you rename a function or a type, you can define a macro for the old
> name, alias the new name.

Note: using a macro doesn't prevent the ABI being broken if you rename a public function. You'll need to use function versioning too.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
  2017-10-24  5:06  0%         ` santosh
@ 2017-10-25  9:45  0%           ` Thomas Monjalon
  2017-10-25  9:50  3%             ` Richardson, Bruce
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-25  9:45 UTC (permalink / raw)
  To: santosh; +Cc: dev, olivier.matz, jerin.jacob, hemant.agrawal, anatoly.burakov

Hi Santosh,

24/10/2017 07:06, santosh:
> Hi Thomas,
> 
> 
> On Tuesday 24 October 2017 01:59 AM, Thomas Monjalon wrote:
> > 20/10/2017 14:31, Santosh Shukla:
> >> Removed dpdk iova aware ABI deprecation notice,
> >> and updated ABI change details in release_17.11.rst.
> >>
> >> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> >> Acked-by: John McNamara <john.mcnamara@intel.com>
> >> ---
> >> --- a/doc/guides/rel_notes/deprecation.rst
> >> +++ b/doc/guides/rel_notes/deprecation.rst
> >> -* eal: An ABI change is planned for 17.11 to make DPDK aware of IOVA address
> >> -  translation scheme.
> >> -  Reference to phys address in EAL data-structure or functions may change to
> >> -  IOVA address or more appropriate name.
> >> -  The change will be only for the name.
> >> -  Functional aspects of the API or data-structure will remain same.
> > Sorry, this series cannot be applied as is because it is breaking
> > more than EAL API. The API of mbuf and mempool are also changed.
> > We need to choose one of these three options:
> > 	1/ accept to break all API in 17.11
> > 	2/ postpone the whole series to 18.02
> 
> Theme of series is to make dpdk iova aware so I would prefer option 1) or 2).
> However I have no strong opinion on this topic. 
> Lets get more opinion from others about option 1/2/3.
> 
> > 	3/ rename only EAL API in 17.11 and postpone mbuf/mempool

After discussing with Olivier it appeared there is a fourth solution.
We should not break any API (EAL, mbuf, mempool).

I would like to merge these changes in RC2, but keeping compatibility
with old names:
- When you rename a function or a type, you can define a macro for the
old name, alias the new name.
- When you rename a struct field, you can make an anonymous union
to allow both names.

Then we can deprecate the old names and remove them later.

Are you able to do these small changes today please?

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5] ethdev: allow returning error on VLAN offload ops
  @ 2017-10-25  3:01  4% ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-10-25  3:01 UTC (permalink / raw)
  To: John McNamara, Allain Legacy, Matt Peters, Stephen Hurd,
	Ajit Khaparde, Hemant Agrawal, Shreyansh Jain, Wenzhuo Lu,
	John Daley, Nelson Escobar, Jing Chen, Jingjing Wu, Beilei Xing,
	Konstantin Ananyev, Adrien Mazarguil, Nelio Laranjeiro,
	Yongseok Koh, Alejandro Lucero, Rasesh Mody, Harish Patil,
	Shahed Shaikh, Yuanhan Liu, Maxime Coquelin, Shrikrishna Khare,
	Thomas Monjalon
  Cc: dev, Ferruh Yigit, David Harton

From: David Harton <dharton@cisco.com>

Some devices may not support or fail setting VLAN offload
configuration based on dynamic circumstances so the
vlan_offload_set_t vector is modified to return an int so
the caller can determine success or not.

rte_eth_dev_set_vlan_offload is updated to return the
value provided by the vector when called along with restoring
the original offload configs on failure.

Existing vlan_offload_set_t vectors are modified to return
an int.  Majority of cases return 0 but a few that actually
can fail now return their failure codes.

Finally, a vlan_offload_set_t vector is added to virtio
to facilitate dynamically turning VLAN strip on or off.

Signed-off-by: David Harton <dharton@cisco.com>
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---

v5
* rebase on latest next-net
* add ETH_VLAN_FILTER_MASK mask check to virtio

v4
* Modified commit message heading
* Moved rel_note comments from ABI to API section
* Renamed locals of rte_eth_dev_set_vlan_offload from 'org*' to 'orig*'

v3
* Fixed a format error.
* Apologies...need to figure out why checkpatches.pl keeps saying
  valid patch when I've got soft tabs.

v2
* Fixed a missed format error.
* Removed vlan offload vector call casts and replaced with checks
  for return values.

v1
* This is an ABI breakage that has been previously negotiated
  with Thomas and the proposed rel note change is included as well.
---
 doc/guides/rel_notes/release_17_11.rst |  7 +++++++
 drivers/net/avp/avp_ethdev.c           | 13 ++++++++++---
 drivers/net/bnxt/bnxt_ethdev.c         | 10 +++++++---
 drivers/net/dpaa2/dpaa2_ethdev.c       | 15 ++++++++++++---
 drivers/net/e1000/em_ethdev.c          | 13 ++++++++++---
 drivers/net/e1000/igb_ethdev.c         | 13 ++++++++++---
 drivers/net/enic/enic_ethdev.c         |  9 ++++++---
 drivers/net/fm10k/fm10k_ethdev.c       |  4 +++-
 drivers/net/i40e/i40e_ethdev.c         | 12 +++++++++---
 drivers/net/i40e/i40e_ethdev_vf.c      | 10 +++++-----
 drivers/net/ixgbe/ixgbe_ethdev.c       | 27 ++++++++++++++++++++-------
 drivers/net/mlx5/mlx5.h                |  2 +-
 drivers/net/mlx5/mlx5_vlan.c           |  6 ++++--
 drivers/net/nfp/nfp_net.c              | 12 +++++++-----
 drivers/net/qede/qede_ethdev.c         |  9 +++++++--
 drivers/net/virtio/virtio_ethdev.c     | 25 +++++++++++++++++++++++++
 drivers/net/vmxnet3/vmxnet3_ethdev.c   | 12 ++++++++----
 lib/librte_ether/rte_ethdev.c          | 12 +++++++++++-
 lib/librte_ether/rte_ethdev.h          |  2 +-
 19 files changed, 163 insertions(+), 50 deletions(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index e505a4dcd..65ab4b767 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -322,6 +322,13 @@ API Changes
   ``rte_log_get_global_level()``, ``rte_log_set_level()`` and
   ``rte_log_get_level()``.
 
+* **Modified the vlan_offload_set_t function prototype in the ethdev library.**
+
+  Changed the function prototype of ``vlan_offload_set_t``.  The return value
+  has been changed from ``void`` to ``int`` so the caller to knows whether
+  the backing device supports the operation or if the operation was
+  successfully performed.
+
 
 ABI Changes
 -----------
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index b97a90cea..7853fbf15 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -70,7 +70,7 @@ static void avp_dev_stop(struct rte_eth_dev *dev);
 static void avp_dev_close(struct rte_eth_dev *dev);
 static void avp_dev_info_get(struct rte_eth_dev *dev,
 			     struct rte_eth_dev_info *dev_info);
-static void avp_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int avp_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static int avp_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete);
 static void avp_dev_promiscuous_enable(struct rte_eth_dev *dev);
 static void avp_dev_promiscuous_disable(struct rte_eth_dev *dev);
@@ -2031,7 +2031,12 @@ avp_dev_configure(struct rte_eth_dev *eth_dev)
 	mask = (ETH_VLAN_STRIP_MASK |
 		ETH_VLAN_FILTER_MASK |
 		ETH_VLAN_EXTEND_MASK);
-	avp_vlan_offload_set(eth_dev, mask);
+	ret = avp_vlan_offload_set(eth_dev, mask);
+	if (ret < 0) {
+		PMD_DRV_LOG(ERR, "VLAN offload set failed by host, ret=%d\n",
+			    ret);
+		goto unlock;
+	}
 
 	/* update device config */
 	memset(&config, 0, sizeof(config));
@@ -2214,7 +2219,7 @@ avp_dev_info_get(struct rte_eth_dev *eth_dev,
 	}
 }
 
-static void
+static int
 avp_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
 {
 	struct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
@@ -2239,6 +2244,8 @@ avp_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
 		if (eth_dev->data->dev_conf.rxmode.hw_vlan_extend)
 			PMD_DRV_LOG(ERR, "VLAN extend offload not supported\n");
 	}
+
+	return 0;
 }
 
 static int
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index c2d54efd8..ad50045ac 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -145,7 +145,7 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
 	ETH_RSS_NONFRAG_IPV6_TCP |	\
 	ETH_RSS_NONFRAG_IPV6_UDP)
 
-static void bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
+static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
 
 /***********************/
 
@@ -591,7 +591,9 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
 		vlan_mask |= ETH_VLAN_FILTER_MASK;
 	if (eth_dev->data->dev_conf.rxmode.hw_vlan_strip)
 		vlan_mask |= ETH_VLAN_STRIP_MASK;
-	bnxt_vlan_offload_set_op(eth_dev, vlan_mask);
+	rc = bnxt_vlan_offload_set_op(eth_dev, vlan_mask);
+	if (rc)
+		goto error;
 
 	return 0;
 
@@ -1350,7 +1352,7 @@ static int bnxt_vlan_filter_set_op(struct rte_eth_dev *eth_dev,
 		return bnxt_del_vlan_filter(bp, vlan_id);
 }
 
-static void
+static int
 bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)
 {
 	struct bnxt *bp = (struct bnxt *)dev->data->dev_private;
@@ -1382,6 +1384,8 @@ bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)
 
 	if (mask & ETH_VLAN_EXTEND_MASK)
 		RTE_LOG(ERR, PMD, "Extend VLAN Not supported\n");
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 1ac607cb0..881a209d8 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -162,7 +162,7 @@ dpaa2_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 	return ret;
 }
 
-static void
+static int
 dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
@@ -188,6 +188,8 @@ dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 			RTE_LOG(INFO, PMD,
 				"VLAN extend offload not supported\n");
 	}
+
+	return 0;
 }
 
 static int
@@ -754,8 +756,15 @@ dpaa2_dev_start(struct rte_eth_dev *dev)
 		return ret;
 	}
 	/* VLAN Offload Settings */
-	if (priv->max_vlan_filters)
-		dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);
+	if (priv->max_vlan_filters) {
+		ret = dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);
+		if (ret) {
+			PMD_INIT_LOG(ERR, "Error to dpaa2_vlan_offload_set:"
+				     "code = %d\n", ret);
+			return ret;
+		}
+	}
+
 
 	/* if the interrupts were configured on this devices*/
 	if (intr_handle && (intr_handle->fd) &&
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index 6ebfa6d4c..770ab8141 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -99,7 +99,7 @@ static int eth_em_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
 
 static int eth_em_vlan_filter_set(struct rte_eth_dev *dev,
 		uint16_t vlan_id, int on);
-static void eth_em_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int eth_em_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void em_vlan_hw_filter_enable(struct rte_eth_dev *dev);
 static void em_vlan_hw_filter_disable(struct rte_eth_dev *dev);
 static void em_vlan_hw_strip_enable(struct rte_eth_dev *dev);
@@ -669,7 +669,12 @@ eth_em_start(struct rte_eth_dev *dev)
 
 	mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK | \
 			ETH_VLAN_EXTEND_MASK;
-	eth_em_vlan_offload_set(dev, mask);
+	ret = eth_em_vlan_offload_set(dev, mask);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Unable to update vlan offload");
+		em_dev_clear_queues(dev);
+		return ret;
+	}
 
 	/* Set Interrupt Throttling Rate to maximum allowed value. */
 	E1000_WRITE_REG(hw, E1000_ITR, UINT16_MAX);
@@ -1449,7 +1454,7 @@ em_vlan_hw_strip_enable(struct rte_eth_dev *dev)
 	E1000_WRITE_REG(hw, E1000_CTRL, reg);
 }
 
-static void
+static int
 eth_em_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	if(mask & ETH_VLAN_STRIP_MASK){
@@ -1465,6 +1470,8 @@ eth_em_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		else
 			em_vlan_hw_filter_disable(dev);
 	}
+
+	return 0;
 }
 
 /*
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 003bdf0f6..53f160030 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -157,7 +157,7 @@ static int eth_igb_vlan_filter_set(struct rte_eth_dev *dev,
 static int eth_igb_vlan_tpid_set(struct rte_eth_dev *dev,
 				 enum rte_vlan_type vlan_type,
 				 uint16_t tpid_id);
-static void eth_igb_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int eth_igb_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 
 static void igb_vlan_hw_filter_enable(struct rte_eth_dev *dev);
 static void igb_vlan_hw_filter_disable(struct rte_eth_dev *dev);
@@ -1403,7 +1403,12 @@ eth_igb_start(struct rte_eth_dev *dev)
 	 */
 	mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK | \
 			ETH_VLAN_EXTEND_MASK;
-	eth_igb_vlan_offload_set(dev, mask);
+	ret = eth_igb_vlan_offload_set(dev, mask);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Unable to set vlan offload");
+		igb_dev_clear_queues(dev);
+		return ret;
+	}
 
 	if (dev->data->dev_conf.rxmode.mq_mode == ETH_MQ_RX_VMDQ_ONLY) {
 		/* Enable VLAN filter since VMDq always use VLAN filter */
@@ -2720,7 +2725,7 @@ igb_vlan_hw_extend_enable(struct rte_eth_dev *dev)
 						2 * VLAN_TAG_SIZE);
 }
 
-static void
+static int
 eth_igb_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	if(mask & ETH_VLAN_STRIP_MASK){
@@ -2743,6 +2748,8 @@ eth_igb_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		else
 			igb_vlan_hw_extend_disable(dev);
 	}
+
+	return 0;
 }
 
 
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index 5386b2ae3..c02f9b7b3 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -362,7 +362,7 @@ static int enicpmd_vlan_filter_set(struct rte_eth_dev *eth_dev,
 	return err;
 }
 
-static void enicpmd_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
+static int enicpmd_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
 {
 	struct enic *enic = pmd_priv(eth_dev);
 
@@ -386,6 +386,8 @@ static void enicpmd_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
 		dev_warning(enic,
 			"Configuration of extended VLAN is not supported\n");
 	}
+
+	return 0;
 }
 
 static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
@@ -410,9 +412,10 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
 			eth_dev->data->dev_conf.rxmode.split_hdr_size);
 	}
 
-	enicpmd_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK);
 	enic->hw_ip_checksum = eth_dev->data->dev_conf.rxmode.hw_ip_checksum;
-	return 0;
+	ret = enicpmd_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK);
+
+	return ret;
 }
 
 /* Start the device.
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index 7baa9279d..46a312fad 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -1594,7 +1594,7 @@ fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 	return 0;
 }
 
-static void
+static int
 fm10k_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	if (mask & ETH_VLAN_STRIP_MASK) {
@@ -1613,6 +1613,8 @@ fm10k_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		if (!dev->data->dev_conf.rxmode.hw_vlan_filter)
 			PMD_INIT_LOG(ERR, "VLAN filter is always on in fm10k");
 	}
+
+	return 0;
 }
 
 /* Add/Remove a MAC address, and update filters to main VSI */
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 48db2dde3..86c43881b 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -276,7 +276,7 @@ static int i40e_vlan_filter_set(struct rte_eth_dev *dev,
 static int i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 			      enum rte_vlan_type vlan_type,
 			      uint16_t tpid);
-static void i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void i40e_vlan_strip_queue_set(struct rte_eth_dev *dev,
 				      uint16_t queue,
 				      int on);
@@ -3221,7 +3221,7 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
 	return ret;
 }
 
-static void
+static int
 i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
@@ -3254,6 +3254,8 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		else
 			i40e_vsi_config_double_vlan(vsi, FALSE);
 	}
+
+	return 0;
 }
 
 static void
@@ -5314,7 +5316,11 @@ i40e_dev_init_vlan(struct rte_eth_dev *dev)
 
 	/* Apply vlan offload setting */
 	mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK;
-	i40e_vlan_offload_set(dev, mask);
+	ret = i40e_vlan_offload_set(dev, mask);
+	if (ret) {
+		PMD_DRV_LOG(INFO, "Failed to update vlan offload");
+		return ret;
+	}
 
 	/* Apply double-vlan setting, not implemented yet */
 
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 9f1487509..ca1d9f930 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -118,7 +118,7 @@ static int i40evf_dev_xstats_get_names(struct rte_eth_dev *dev,
 static void i40evf_dev_xstats_reset(struct rte_eth_dev *dev);
 static int i40evf_vlan_filter_set(struct rte_eth_dev *dev,
 				  uint16_t vlan_id, int on);
-static void i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void i40evf_dev_close(struct rte_eth_dev *dev);
 static int  i40evf_dev_reset(struct rte_eth_dev *dev);
 static void i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);
@@ -1588,12 +1588,10 @@ static int
 i40evf_init_vlan(struct rte_eth_dev *dev)
 {
 	/* Apply vlan offload setting */
-	i40evf_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK);
-
-	return I40E_SUCCESS;
+	return i40evf_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK);
 }
 
-static void
+static int
 i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
@@ -1606,6 +1604,8 @@ i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		else
 			i40evf_disable_vlan_strip(dev);
 	}
+
+	return 0;
 }
 
 static int
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 2ff904119..371998e42 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -219,7 +219,7 @@ static void ixgbe_vlan_hw_strip_bitmap_set(struct rte_eth_dev *dev,
 		uint16_t queue, bool on);
 static void ixgbe_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue,
 		int on);
-static void ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void ixgbe_vlan_hw_strip_enable(struct rte_eth_dev *dev, uint16_t queue);
 static void ixgbe_vlan_hw_strip_disable(struct rte_eth_dev *dev, uint16_t queue);
 static void ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev);
@@ -276,7 +276,7 @@ static int ixgbevf_vlan_filter_set(struct rte_eth_dev *dev,
 		uint16_t vlan_id, int on);
 static void ixgbevf_vlan_strip_queue_set(struct rte_eth_dev *dev,
 		uint16_t queue, int on);
-static void ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on);
 static int ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					    uint16_t queue_id);
@@ -2126,7 +2126,7 @@ ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev)
 	 */
 }
 
-static void
+static int
 ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	if (mask & ETH_VLAN_STRIP_MASK) {
@@ -2149,6 +2149,8 @@ ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		else
 			ixgbe_vlan_hw_extend_disable(dev);
 	}
+
+	return 0;
 }
 
 static void
@@ -2570,9 +2572,13 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 		goto error;
 	}
 
-    mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |
+	mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |
 		ETH_VLAN_EXTEND_MASK;
-	ixgbe_vlan_offload_set(dev, mask);
+	err = ixgbe_vlan_offload_set(dev, mask);
+	if (err) {
+		PMD_INIT_LOG(ERR, "Unable to set VLAN offload");
+		goto error;
+	}
 
 	if (dev->data->dev_conf.rxmode.mq_mode == ETH_MQ_RX_VMDQ_ONLY) {
 		/* Enable vlan filtering for VMDq */
@@ -5024,7 +5030,12 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 	/* Set HW strip */
 	mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |
 		ETH_VLAN_EXTEND_MASK;
-	ixgbevf_vlan_offload_set(dev, mask);
+	err = ixgbevf_vlan_offload_set(dev, mask);
+	if (err) {
+		PMD_INIT_LOG(ERR, "Unable to set VLAN offload (%d)", err);
+		ixgbe_dev_clear_queues(dev);
+		return err;
+	}
 
 	ixgbevf_dev_rxtx_start(dev);
 
@@ -5213,7 +5224,7 @@ ixgbevf_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue, int on)
 	ixgbe_vlan_hw_strip_bitmap_set(dev, queue, on);
 }
 
-static void
+static int
 ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	struct ixgbe_hw *hw =
@@ -5228,6 +5239,8 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		for (i = 0; i < hw->mac.max_rx_queues; i++)
 			ixgbevf_vlan_strip_queue_set(dev, i, on);
 	}
+
+	return 0;
 }
 
 int
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 3f452b2f0..e6a69b823 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -248,7 +248,7 @@ int mlx5_xstats_get_names(struct rte_eth_dev *,
 /* mlx5_vlan.c */
 
 int mlx5_vlan_filter_set(struct rte_eth_dev *, uint16_t, int);
-void mlx5_vlan_offload_set(struct rte_eth_dev *, int);
+int mlx5_vlan_offload_set(struct rte_eth_dev *, int);
 void mlx5_vlan_strip_queue_set(struct rte_eth_dev *, uint16_t, int);
 
 /* mlx5_trigger.c */
diff --git a/drivers/net/mlx5/mlx5_vlan.c b/drivers/net/mlx5/mlx5_vlan.c
index ed91d9b28..89874aabd 100644
--- a/drivers/net/mlx5/mlx5_vlan.c
+++ b/drivers/net/mlx5/mlx5_vlan.c
@@ -178,7 +178,7 @@ mlx5_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue, int on)
  * @param mask
  *   VLAN offload bit mask.
  */
-void
+int
 mlx5_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	struct priv *priv = dev->data->dev_private;
@@ -189,7 +189,7 @@ mlx5_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 
 		if (!priv->hw_vlan_strip) {
 			ERROR("VLAN stripping is not supported");
-			return;
+			return 0;
 		}
 
 		/* Run on every RX queue and set/reset VLAN stripping. */
@@ -198,4 +198,6 @@ mlx5_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 			priv_vlan_strip_queue_set(priv, i, hw_vlan_strip);
 		priv_unlock(priv);
 	}
+
+	return 0;
 }
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 0917b9c49..71d4a8629 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -2306,11 +2306,12 @@ nfp_net_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 	return i;
 }
 
-static void
+static int
 nfp_net_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	uint32_t new_ctrl, update;
 	struct nfp_net_hw *hw;
+	int ret;
 
 	hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	new_ctrl = 0;
@@ -2331,14 +2332,15 @@ nfp_net_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		new_ctrl = hw->ctrl & ~NFP_NET_CFG_CTRL_RXVLAN;
 
 	if (new_ctrl == 0)
-		return;
+		return 0;
 
 	update = NFP_NET_CFG_UPDATE_GEN;
 
-	if (nfp_net_reconfig(hw, new_ctrl, update) < 0)
-		return;
+	ret = nfp_net_reconfig(hw, new_ctrl, update);
+	if (!ret)
+		hw->ctrl = new_ctrl;
 
-	hw->ctrl = new_ctrl;
+	return ret;
 }
 
 /* Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device */
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 8b3f0ff7f..661d9381e 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1005,7 +1005,7 @@ static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,
 	return rc;
 }
 
-static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
+static int qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
 {
 	struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
 	struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
@@ -1043,6 +1043,8 @@ static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
 
 	DP_INFO(edev, "vlan offload mask %d vlan-strip %d vlan-filter %d\n",
 		mask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter);
+
+	return 0;
 }
 
 static void qede_prandom_bytes(uint32_t *buff)
@@ -1192,6 +1194,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 	struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
 	struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
 	struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
+	int ret;
 
 	PMD_INIT_FUNC_TRACE(edev);
 
@@ -1262,9 +1265,11 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 	qdev->new_mtu = qdev->mtu;
 
 	/* Enable VLAN offloads by default */
-	qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK  |
+	ret = qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK  |
 			ETH_VLAN_FILTER_MASK |
 			ETH_VLAN_EXTEND_MASK);
+	if (ret)
+		return ret;
 
 	DP_INFO(edev, "Device configured with RSS=%d TSS=%d\n",
 			QEDE_RSS_COUNT(qdev), QEDE_TSS_COUNT(qdev));
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index bfbd73770..2e4a49ea9 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -73,6 +73,7 @@ static void virtio_dev_info_get(struct rte_eth_dev *dev,
 				struct rte_eth_dev_info *dev_info);
 static int virtio_dev_link_update(struct rte_eth_dev *dev,
 	int wait_to_complete);
+static int virtio_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 
 static void virtio_set_hwaddr(struct virtio_hw *hw);
 static void virtio_get_hwaddr(struct virtio_hw *hw);
@@ -779,6 +780,7 @@ static const struct eth_dev_ops virtio_eth_dev_ops = {
 	.stats_reset             = virtio_dev_stats_reset,
 	.xstats_reset            = virtio_dev_stats_reset,
 	.link_update             = virtio_dev_link_update,
+	.vlan_offload_set        = virtio_dev_vlan_offload_set,
 	.rx_queue_setup          = virtio_dev_rx_queue_setup,
 	.rx_queue_intr_enable    = virtio_dev_rx_queue_intr_enable,
 	.rx_queue_intr_disable   = virtio_dev_rx_queue_intr_disable,
@@ -1953,6 +1955,29 @@ virtio_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complet
 	return (old.link_status == link.link_status) ? -1 : 0;
 }
 
+static int
+virtio_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
+{
+	const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
+	struct virtio_hw *hw = dev->data->dev_private;
+
+	if (mask & ETH_VLAN_FILTER_MASK) {
+		if (rxmode->hw_vlan_filter &&
+				!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) {
+
+			PMD_DRV_LOG(NOTICE,
+				"vlan filtering not available on this host");
+
+			return -ENOTSUP;
+		}
+	}
+
+	if (mask & ETH_VLAN_STRIP_MASK)
+		hw->vlan_strip = rxmode->hw_vlan_strip;
+
+	return 0;
+}
+
 static void
 virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 58bc4f2f2..cde112301 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -100,7 +100,7 @@ static const uint32_t *
 vmxnet3_dev_supported_ptypes_get(struct rte_eth_dev *dev);
 static int vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev,
 				       uint16_t vid, int on);
-static void vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void vmxnet3_mac_addr_set(struct rte_eth_dev *dev,
 				 struct ether_addr *mac_addr);
 static void vmxnet3_interrupt_handler(void *param);
@@ -730,8 +730,10 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
 		devRead->rssConfDesc.confPA  = hw->rss_confPA;
 	}
 
-	vmxnet3_dev_vlan_offload_set(dev,
-				     ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK);
+	ret = vmxnet3_dev_vlan_offload_set(dev,
+			ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK);
+	if (ret)
+		return ret;
 
 	vmxnet3_write_mac(hw, dev->data->mac_addrs->addr_bytes);
 
@@ -1279,7 +1281,7 @@ vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vid, int on)
 	return 0;
 }
 
-static void
+static int
 vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 {
 	struct vmxnet3_hw *hw = dev->data->dev_private;
@@ -1305,6 +1307,8 @@ vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 		VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,
 				       VMXNET3_CMD_UPDATE_VLAN_FILTERS);
 	}
+
+	return 0;
 }
 
 static void
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 0b13a58db..94c2fe2f1 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -2180,10 +2180,14 @@ rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 	int ret = 0;
 	int mask = 0;
 	int cur, org = 0;
+	uint64_t orig_offloads;
 
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
+	/* save original values in case of failure */
+	orig_offloads = dev->data->dev_conf.rxmode.offloads;
+
 	/*check which option changed by application*/
 	cur = !!(offload_mask & ETH_VLAN_STRIP_OFFLOAD);
 	org = !!(dev->data->dev_conf.rxmode.offloads &
@@ -2236,7 +2240,13 @@ rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 	 */
 	rte_eth_convert_rx_offloads(dev->data->dev_conf.rxmode.offloads,
 				    &dev->data->dev_conf.rxmode);
-	(*dev->dev_ops->vlan_offload_set)(dev, mask);
+	ret = (*dev->dev_ops->vlan_offload_set)(dev, mask);
+	if (ret) {
+		/* hit an error restore  original values */
+		dev->data->dev_conf.rxmode.offloads = orig_offloads;
+		rte_eth_convert_rx_offloads(dev->data->dev_conf.rxmode.offloads,
+					    &dev->data->dev_conf.rxmode);
+	}
 
 	return ret;
 }
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 2a0129a2a..be74b2af2 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1323,7 +1323,7 @@ typedef int (*vlan_tpid_set_t)(struct rte_eth_dev *dev,
 			       enum rte_vlan_type type, uint16_t tpid);
 /**< @internal set the outer/inner VLAN-TPID by an Ethernet device. */
 
-typedef void (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);
+typedef int (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);
 /**< @internal set VLAN offload function by an Ethernet device. */
 
 typedef int (*vlan_pvid_set_t)(struct rte_eth_dev *dev,
-- 
2.13.6

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v10 0/4] flow classification library
  2017-10-24  9:53  0%           ` Iremonger, Bernard
@ 2017-10-24 10:25  0%             ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-24 10:25 UTC (permalink / raw)
  To: Iremonger, Bernard
  Cc: Mcnamara, John, dev, Yigit, Ferruh, Ananyev, Konstantin,
	Dumitrescu, Cristian, adrien.mazarguil, Singh, Jasvinder

24/10/2017 11:53, Iremonger, Bernard:
> Hi Thomas,
> 
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > 24/10/2017 11:23, Mcnamara, John:
> > > From: Iremonger, Bernard
> > > >
> > > > Hi Thomas,
> > > >
> > > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > >
> > > > > I suppose you are OK to wait one more release and call for more
> > > > reviewers?
> > > >
> > > > This library was not ready for 17.11.RC1 having received some
> > > > comments just before the RC1 deadline.
> > > > It was then targeted for RC2 and we have pulled out all the stops to
> > > > get it ready for RC2.
> > > >
> > > > It is now at v10 of the patch set, there have been no review
> > > > comments from the community (apart from Intel), since RFC v3.
> > > >
> > > > I think that there has been ample time for the community to review
> > > > this patch set, calling for more reviewers at this point is not helpful.
> > 
> > I have to review some basic things in your series.
> > I did not take time to review it because I thought John told me it would not
> > make 17.11.
> > 
> > > > The API's of the library are marked as experimental, so there will
> > > > be no issues with ABI breakage, if there are requests for changes later.
> > 
> > It is not marked EXPERIMENTAL in the MAINTAINERS file.
> 
> My mistake, it is marked as experimental in rte_flow_classify_version.map
> I can send a v11 patch set if needed.
>  
> > > > I am not OK to wait one more release, I believe we have followed the
> > > > process correctly.
> > 
> > Yes, you followed the process.
> > 
> > > +1 for inclusion in RC2.
> > 
> > It is not common to add a new library in RC2.
> > 
> > When doing the RC1 announce, I did not mention this library as a possible
> > inclusion exception in RC2, and I had no feedback:
> > 	http://dpdk.org/ml/archives/announce/2017-October/000153.html
> 
> I probably should have replied to this email.
>  
> > I was really sure you were not targetting 17.11.
> 
> We have always been targeting 17.11
> 
> > So I did not do the last pass review. Probably my mistake.
> > 
> > We are having a hard time with 17.11 release, so I would prefer avoiding
> > adding one more new library at this stage.
> 
> This is a new library and should not impact anyone.
> 
> I believe we have followed the process, so I think it should not be deferred to 18.02.

OK, let's make a deal:
If you can address my comments in v11 and if there is no compilation issue,
then I will take it in RC2.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v10 0/4] flow classification library
  2017-10-24  9:38  0%         ` Thomas Monjalon
@ 2017-10-24  9:53  0%           ` Iremonger, Bernard
  2017-10-24 10:25  0%             ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Iremonger, Bernard @ 2017-10-24  9:53 UTC (permalink / raw)
  To: Thomas Monjalon, Mcnamara, John
  Cc: dev, Yigit, Ferruh, Ananyev, Konstantin, Dumitrescu, Cristian,
	adrien.mazarguil, Singh, Jasvinder, Iremonger, Bernard

Hi Thomas,

> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Tuesday, October 24, 2017 10:39 AM
> To: Mcnamara, John <john.mcnamara@intel.com>; Iremonger, Bernard
> <bernard.iremonger@intel.com>
> Cc: dev@dpdk.org; Yigit, Ferruh <ferruh.yigit@intel.com>; Ananyev,
> Konstantin <konstantin.ananyev@intel.com>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; adrien.mazarguil@6wind.com; Singh,
> Jasvinder <jasvinder.singh@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v10 0/4] flow classification library
> 
> 24/10/2017 11:23, Mcnamara, John:
> > From: Iremonger, Bernard
> > >
> > > Hi Thomas,
> > >
> > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > >
> > > > I suppose you are OK to wait one more release and call for more
> > > reviewers?
> > >
> > > This library was not ready for 17.11.RC1 having received some
> > > comments just before the RC1 deadline.
> > > It was then targeted for RC2 and we have pulled out all the stops to
> > > get it ready for RC2.
> > >
> > > It is now at v10 of the patch set, there have been no review
> > > comments from the community (apart from Intel), since RFC v3.
> > >
> > > I think that there has been ample time for the community to review
> > > this patch set, calling for more reviewers at this point is not helpful.
> 
> I have to review some basic things in your series.
> I did not take time to review it because I thought John told me it would not
> make 17.11.
> 
> > > The API's of the library are marked as experimental, so there will
> > > be no issues with ABI breakage, if there are requests for changes later.
> 
> It is not marked EXPERIMENTAL in the MAINTAINERS file.

My mistake, it is marked as experimental in rte_flow_classify_version.map
I can send a v11 patch set if needed.
 
> > > I am not OK to wait one more release, I believe we have followed the
> > > process correctly.
> 
> Yes, you followed the process.
> 
> > +1 for inclusion in RC2.
> 
> It is not common to add a new library in RC2.
> 
> When doing the RC1 announce, I did not mention this library as a possible
> inclusion exception in RC2, and I had no feedback:
> 	http://dpdk.org/ml/archives/announce/2017-October/000153.html

I probably should have replied to this email.
 
> I was really sure you were not targetting 17.11.

We have always been targeting 17.11

> So I did not do the last pass review. Probably my mistake.
> 
> We are having a hard time with 17.11 release, so I would prefer avoiding
> adding one more new library at this stage.

This is a new library and should not impact anyone.

I believe we have followed the process, so I think it should not be deferred to 18.02.

Regards,

Bernard.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v10 0/4] flow classification library
  2017-10-24  9:23  0%       ` Mcnamara, John
@ 2017-10-24  9:38  0%         ` Thomas Monjalon
  2017-10-24  9:53  0%           ` Iremonger, Bernard
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-24  9:38 UTC (permalink / raw)
  To: Mcnamara, John, Iremonger, Bernard
  Cc: dev, Yigit, Ferruh, Ananyev, Konstantin, Dumitrescu, Cristian,
	adrien.mazarguil, Singh, Jasvinder

24/10/2017 11:23, Mcnamara, John:
> From: Iremonger, Bernard
> > 
> > Hi Thomas,
> > 
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> >
> > > I suppose you are OK to wait one more release and call for more
> > reviewers?
> > 
> > This library was not ready for 17.11.RC1 having received some comments
> > just before the RC1 deadline.
> > It was then targeted for RC2 and we have pulled out all the stops to get
> > it ready for RC2.
> > 
> > It is now at v10 of the patch set, there have been no review comments from
> > the community (apart from Intel), since RFC v3.
> > 
> > I think that there has been ample time for the community to review this
> > patch set, calling for more reviewers at this point is not helpful.

I have to review some basic things in your series.
I did not take time to review it because I thought John told me it
would not make 17.11.

> > The API's of the library are marked as experimental, so there will be no
> > issues with ABI breakage, if there are requests for changes later.

It is not marked EXPERIMENTAL in the MAINTAINERS file.

> > I am not OK to wait one more release, I believe we have followed the
> > process correctly.

Yes, you followed the process.

> +1 for inclusion in RC2.

It is not common to add a new library in RC2.

When doing the RC1 announce, I did not mention this library
as a possible inclusion exception in RC2, and I had no feedback:
	http://dpdk.org/ml/archives/announce/2017-October/000153.html

I was really sure you were not targetting 17.11.
So I did not do the last pass review. Probably my mistake.

We are having a hard time with 17.11 release, so I would prefer avoiding
adding one more new library at this stage.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v10 0/4] flow classification library
  2017-10-24  8:40  3%     ` Iremonger, Bernard
@ 2017-10-24  9:23  0%       ` Mcnamara, John
  2017-10-24  9:38  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Mcnamara, John @ 2017-10-24  9:23 UTC (permalink / raw)
  To: Iremonger, Bernard, Thomas Monjalon
  Cc: dev, Yigit, Ferruh, Ananyev, Konstantin, Dumitrescu, Cristian,
	adrien.mazarguil, Singh, Jasvinder



> -----Original Message-----
> From: Iremonger, Bernard
> Sent: Tuesday, October 24, 2017 9:41 AM
> To: Thomas Monjalon <thomas@monjalon.net>
> Cc: dev@dpdk.org; Yigit, Ferruh <ferruh.yigit@intel.com>; Ananyev,
> Konstantin <konstantin.ananyev@intel.com>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; adrien.mazarguil@6wind.com; Singh,
> Jasvinder <jasvinder.singh@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Iremonger, Bernard
> <bernard.iremonger@intel.com>
> Subject: RE: [dpdk-dev] [PATCH v10 0/4] flow classification library
> 
> Hi Thomas,
> 
> > -----Original Message-----
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > Sent: Monday, October 23, 2017 9:59 PM
> > To: Iremonger, Bernard <bernard.iremonger@intel.com>
> > Cc: dev@dpdk.org; Yigit, Ferruh <ferruh.yigit@intel.com>; Ananyev,
> > Konstantin <konstantin.ananyev@intel.com>; Dumitrescu, Cristian
> > <cristian.dumitrescu@intel.com>; adrien.mazarguil@6wind.com; Singh,
> > Jasvinder <jasvinder.singh@intel.com>; Mcnamara, John
> > <john.mcnamara@intel.com>
> > Subject: Re: [dpdk-dev] [PATCH v10 0/4] flow classification library
>
> > I suppose you are OK to wait one more release and call for more
> reviewers?
> 
> This library was not ready for 17.11.RC1 having received some comments
> just before the RC1 deadline.
> It was then targeted for RC2 and we have pulled out all the stops to get
> it ready for RC2.
> 
> It is now at v10 of the patch set, there have been no review comments from
> the community (apart from Intel), since RFC v3.
> 
> I think that there has been ample time for the community to review this
> patch set, calling for more reviewers at this point is not helpful.
> 
> The API's of the library are marked as experimental, so there will be no
> issues with ABI breakage, if there are requests for changes later.
> 
> I am not OK to wait one more release, I believe we have followed the
> process correctly.

+1 for inclusion in RC2.

John
 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v10 0/4] flow classification library
  @ 2017-10-24  8:40  3%     ` Iremonger, Bernard
  2017-10-24  9:23  0%       ` Mcnamara, John
  0 siblings, 1 reply; 200+ results
From: Iremonger, Bernard @ 2017-10-24  8:40 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, Yigit, Ferruh, Ananyev, Konstantin, Dumitrescu, Cristian,
	adrien.mazarguil, Singh, Jasvinder, Mcnamara, John, Iremonger,
	Bernard

Hi Thomas,

> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Monday, October 23, 2017 9:59 PM
> To: Iremonger, Bernard <bernard.iremonger@intel.com>
> Cc: dev@dpdk.org; Yigit, Ferruh <ferruh.yigit@intel.com>; Ananyev,
> Konstantin <konstantin.ananyev@intel.com>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; adrien.mazarguil@6wind.com; Singh,
> Jasvinder <jasvinder.singh@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v10 0/4] flow classification library
> 
> 23/10/2017 17:16, Bernard Iremonger:
> > The initial implementation is to provide counting of IPv4 five tuple
> > packets for UDP, TCP and SCTP, but the library is planned to be as generic
> as possible.
> >
> > The flow information provided by this library is missing to implement
> > full IPFIX features, but this is planned to be the initial step.
> >
> > Flows are defined using rte_flow, also measurements (actions) are
> provided by rte_flow.
> > To support more IPFIX measurements, the implementation may require
> > extending rte_flow in addition to extending this library.
> >
> > The library uses both flows and actions defined by rte_flow.h so this
> > library has a dependency on rte_flow.h
> >
> > This patch set also contains a set of unit tests for the Flow Classify
> > library, patch(4) and a patch(3) containing additional functions added to the
> packet burst generator code.
> >
> > For further steps, this library may be expanded to benefit from hardware
> filters for better performance.
> >
> > It will be more beneficial to shape this library to cover more use
> > cases, please feel free to comment on possible other use cases and desired
> functionalities.
> 
> I had some feedbacks that this library won't be ready for 17.11.
> So I did not review it.
> 
> I suppose you are OK to wait one more release and call for more reviewers?

This library was not ready for 17.11.RC1 having received some comments just before the RC1 deadline.
It was then targeted for RC2 and we have pulled out all the stops to get it ready for RC2.

It is now at v10 of the patch set, there have been no review comments from the community (apart from Intel), since RFC v3.

I think that there has been ample time for the community to review this patch set, calling for more reviewers at this point is not helpful.

The API's of the library are marked as experimental, so there will be no issues with ABI breakage, if there are requests for changes later.

I am not OK to wait one more release, I believe we have followed the process correctly.

Regards,

Bernard.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
  2017-10-23 20:29  0%       ` Thomas Monjalon
@ 2017-10-24  5:06  0%         ` santosh
  2017-10-25  9:45  0%           ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: santosh @ 2017-10-24  5:06 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, olivier.matz, jerin.jacob, hemant.agrawal, anatoly.burakov

Hi Thomas,


On Tuesday 24 October 2017 01:59 AM, Thomas Monjalon wrote:
> 20/10/2017 14:31, Santosh Shukla:
>> Removed dpdk iova aware ABI deprecation notice,
>> and updated ABI change details in release_17.11.rst.
>>
>> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
>> Acked-by: John McNamara <john.mcnamara@intel.com>
>> ---
>> --- a/doc/guides/rel_notes/deprecation.rst
>> +++ b/doc/guides/rel_notes/deprecation.rst
>> -* eal: An ABI change is planned for 17.11 to make DPDK aware of IOVA address
>> -  translation scheme.
>> -  Reference to phys address in EAL data-structure or functions may change to
>> -  IOVA address or more appropriate name.
>> -  The change will be only for the name.
>> -  Functional aspects of the API or data-structure will remain same.
> Sorry, this series cannot be applied as is because it is breaking
> more than EAL API. The API of mbuf and mempool are also changed.
> We need to choose one of these three options:
> 	1/ accept to break all API in 17.11
> 	2/ postpone the whole series to 18.02

Theme of series is to make dpdk iova aware so I would prefer option 1) or 2).
However I have no strong opinion on this topic. 
Lets get more opinion from others about option 1/2/3.

> 	3/ rename only EAL API in 17.11 and postpone mbuf/mempool
>
> One more comment:
> For such a large change, we should provide a script in devtools
> to help porting the applications. I suggest a sed script.

+1.
Thanks.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2] doc: fix highlight of bumped libs in release notes
  2017-10-23 16:26  0%   ` Ferruh Yigit
@ 2017-10-23 20:39  0%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-23 20:39 UTC (permalink / raw)
  To: dev; +Cc: Ferruh Yigit

23/10/2017 18:26, Ferruh Yigit:
> On 10/23/2017 3:15 AM, Thomas Monjalon wrote:
> > The libraries which have their ABI version increased in this release
> > must be prepended with a + sign to make them appear clearly.
> > 
> > Fixes: f8244c6399d9 ("ethdev: increase port id range")
> > Fixes: ec51443cc99a ("gso: add Generic Segmentation Offload API framework")
> > 
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > Acked-by: Zhiyong Yang <zhiyong.yang@intel.com>
> 
> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

Applied

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
  2017-10-20 12:31 15%     ` [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice Santosh Shukla
@ 2017-10-23 20:29  0%       ` Thomas Monjalon
  2017-10-24  5:06  0%         ` santosh
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-23 20:29 UTC (permalink / raw)
  To: Santosh Shukla
  Cc: dev, olivier.matz, jerin.jacob, hemant.agrawal, anatoly.burakov

20/10/2017 14:31, Santosh Shukla:
> Removed dpdk iova aware ABI deprecation notice,
> and updated ABI change details in release_17.11.rst.
> 
> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> Acked-by: John McNamara <john.mcnamara@intel.com>
> ---
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> -* eal: An ABI change is planned for 17.11 to make DPDK aware of IOVA address
> -  translation scheme.
> -  Reference to phys address in EAL data-structure or functions may change to
> -  IOVA address or more appropriate name.
> -  The change will be only for the name.
> -  Functional aspects of the API or data-structure will remain same.

Sorry, this series cannot be applied as is because it is breaking
more than EAL API. The API of mbuf and mempool are also changed.
We need to choose one of these three options:
	1/ accept to break all API in 17.11
	2/ postpone the whole series to 18.02
	3/ rename only EAL API in 17.11 and postpone mbuf/mempool

One more comment:
For such a large change, we should provide a script in devtools
to help porting the applications. I suggest a sed script.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2] doc: fix highlight of bumped libs in release notes
  2017-10-23 10:15  3% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
@ 2017-10-23 16:26  0%   ` Ferruh Yigit
  2017-10-23 20:39  0%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2017-10-23 16:26 UTC (permalink / raw)
  To: Thomas Monjalon, dev

On 10/23/2017 3:15 AM, Thomas Monjalon wrote:
> The libraries which have their ABI version increased in this release
> must be prepended with a + sign to make them appear clearly.
> 
> Fixes: f8244c6399d9 ("ethdev: increase port id range")
> Fixes: ec51443cc99a ("gso: add Generic Segmentation Offload API framework")
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> Acked-by: Zhiyong Yang <zhiyong.yang@intel.com>

Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v1 2/2] event/octeontx: bump library version
  2017-10-16 13:42  3% ` [dpdk-dev] [PATCH v1 2/2] event/octeontx: bump library version Santosh Shukla
  2017-10-17  9:50  0%   ` Hemant Agrawal
@ 2017-10-23 14:38  3%   ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-23 14:38 UTC (permalink / raw)
  To: Santosh Shukla; +Cc: dev, olivier.matz, jerin.jacob, hemant.agrawal

This change is rejected because this PMD has no API/ABI.

16/10/2017 15:42, Santosh Shukla:
> This commit bumps the library version to reflect the ABI change
> caused by removing the below function from event/octeontx:
> * octeontx_ssovf_info
> * octeontx_ssovf_bar
> * octeontx_ssovf_mbox_send
> 
> And moved to mempool/octeontx area.
> 
> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> ---
>  doc/guides/rel_notes/release_17_11.rst | 1 +
>  drivers/event/octeontx/Makefile        | 2 +-
>  2 files changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
> index 8db35f5e4..eac2f677a 100644
> --- a/doc/guides/rel_notes/release_17_11.rst
> +++ b/doc/guides/rel_notes/release_17_11.rst
> @@ -377,6 +377,7 @@ The libraries prepended with a plus sign were incremented in this version.
>       librte_table.so.2
>       librte_timer.so.1
>       librte_vhost.so.3
> +     librte_pmd_octeontx_ssovf.so.2
>  
>  
>  Tested Platforms
> diff --git a/drivers/event/octeontx/Makefile b/drivers/event/octeontx/Makefile
> index 50434a384..08fc16775 100644
> --- a/drivers/event/octeontx/Makefile
> +++ b/drivers/event/octeontx/Makefile
> @@ -42,7 +42,7 @@ CFLAGS += -I$(RTE_SDK)/drivers/mempool/octeontx/
>  
>  EXPORT_MAP := rte_pmd_octeontx_ssovf_version.map
>  
> -LIBABIVER := 1
> +LIBABIVER := 2
>  
>  #
>  # all source are stored in SRCS-y
> 

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH] mbuf: rename deprecated VLAN flags
@ 2017-10-23 12:16  2% Olivier Matz
  2017-10-25 15:12  2% ` [dpdk-dev] [PATCH v2] " Olivier Matz
  0 siblings, 1 reply; 200+ results
From: Olivier Matz @ 2017-10-23 12:16 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, thomas

PKT_RX_VLAN_PKT and PKT_RX_QINQ_PKT are deprecated for a while.
As explained in [1], these flags were kept to let the applications and
PMDs move to the new flag. There is also a need to support Rx vlan
offload without vlan strip (at least for the ixgbe driver).

This patch renames the old flags for this feature, knowing that some
PMDs were using PKT_RX_VLAN_PKT and PKT_RX_QINQ_PKT to indicate that
the vlan tci has been saved in the mbuf structure.

It is likely that some PMDs do not set the proper flags when doing vlan
offload, and it would be worth making a pass on all of them.

Link: [1] http://dpdk.org/ml/archives/dev/2017-June/067712.html
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---

An alternative would have been to keep PKT_RX_VLAN_PKT and
PKT_RX_QINQ_PKT and recycle them for this new feature.

I choosed this way (rename the flags) because:
- changing the name is a good way to highlight that something
  changed
- the old name was not that good (PKT_blabla_PKT)
- there was no reaction to the proposition in [1]

I'm also open to recycle the old name if we find good reasons
for it. It would make the patch smaller since there would be no
modification in drivers.

In both cases, it is important that PMD maintainers check
that their use of VLAN flags is correct. Example:
- vlan is not stripped and tci is saved: PKT_RX_VLAN
- vlan is stripped and tci is saved: PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED
This can be completed by the packet type which describes the
packet data. I hope the API documentation is clear enough.

Ferruh, do you think you could check with PMD maintainers for next
version?

This patch has no impact on applications that do not
use the deprecated flags. For other applications, renaming
the flag would restore the same behavior. But, since we are
close to the release, applying it early after the release could
also be considered.


 doc/guides/rel_notes/deprecation.rst      |  5 -----
 doc/guides/rel_notes/release_17_11.rst    | 13 +++++++++++++
 drivers/net/af_packet/rte_eth_af_packet.c |  2 +-
 drivers/net/avp/avp_ethdev.c              |  4 ++--
 drivers/net/bnx2x/bnx2x_rxtx.c            |  2 +-
 drivers/net/bnxt/bnxt_rxr.c               |  4 ++--
 drivers/net/bonding/rte_eth_bond_pmd.c    |  2 +-
 drivers/net/cxgbe/sge.c                   |  4 ++--
 drivers/net/dpaa/dpaa_rxtx.c              |  2 +-
 drivers/net/dpaa2/dpaa2_rxtx.c            |  2 +-
 drivers/net/e1000/em_rxtx.c               |  6 +++---
 drivers/net/e1000/igb_rxtx.c              |  6 +++---
 drivers/net/enic/enic_rxtx.c              |  2 +-
 drivers/net/fm10k/fm10k_rxtx.c            |  8 ++++----
 drivers/net/fm10k/fm10k_rxtx_vec.c        |  4 ++--
 drivers/net/i40e/i40e_rxtx.c              |  2 +-
 drivers/net/i40e/i40e_rxtx_vec_altivec.c  |  2 +-
 drivers/net/i40e/i40e_rxtx_vec_neon.c     |  2 +-
 drivers/net/i40e/i40e_rxtx_vec_sse.c      |  2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c          |  4 ++--
 drivers/net/ixgbe/ixgbe_rxtx.c            |  4 ++--
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c   |  4 ++--
 drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c    |  2 +-
 drivers/net/mlx5/mlx5_rxtx.c              |  2 +-
 drivers/net/mlx5/mlx5_rxtx_vec_neon.h     |  4 ++--
 drivers/net/mlx5/mlx5_rxtx_vec_sse.h      | 10 +++++-----
 drivers/net/nfp/nfp_net.c                 |  2 +-
 drivers/net/qede/qede_rxtx.c              |  4 ++--
 drivers/net/vmxnet3/vmxnet3_rxtx.c        |  3 ++-
 lib/librte_mbuf/rte_mbuf.c                |  5 +++--
 lib/librte_mbuf/rte_mbuf.h                | 27 +++++++++++++++------------
 lib/librte_net/rte_ether.h                |  2 +-
 32 files changed, 80 insertions(+), 67 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 0d9925126..741c1e899 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -28,11 +28,6 @@ Deprecation Notices
   The change will be only for the name.
   Functional aspects of the API or data-structure will remain same.
 
-* The mbuf flags PKT_RX_VLAN_PKT and PKT_RX_QINQ_PKT are deprecated and
-  are respectively replaced by PKT_RX_VLAN_STRIPPED and
-  PKT_RX_QINQ_STRIPPED, that are better described. The old flags and
-  their behavior will be kept until 17.08 and will be removed in 17.11.
-
 * ethdev: Tx offloads will no longer be enabled by default in 17.11.
   Instead, the ``rte_eth_txmode`` structure will be extended with
   bit field to enable each Tx offload.
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 0370aed89..702399ed8 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -291,6 +291,19 @@ API Changes
   ``rte_log_get_global_level()``, ``rte_log_set_level()`` and
   ``rte_log_get_level()``.
 
+* **Removed ``mbuf`` flags ``PKT_RX_VLAN_PKT`` and ``PKT_RX_QINQ_PKT``.**
+
+  The ``mbuf`` flags ``PKT_RX_VLAN_PKT`` and ``PKT_RX_QINQ_PKT`` have
+  been removed since their behavior were not properly described.
+
+* **Added ``mbuf`` flags ``PKT_RX_VLAN`` and ``PKT_RX_QINQ``.**
+
+  Two ``mbuf`` flags have been added to indicate that the VLAN
+  identifier has been saved in in the ``mbuf`` structure. For instance:
+
+  - if VLAN is not stripped and TCI is saved: ``PKT_RX_VLAN``
+  - if VLAN is stripped and TCI is saved: ``PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED``
+
 
 ABI Changes
 -----------
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index 46b8250d0..dc1867057 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -167,7 +167,7 @@ eth_af_packet_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 		/* check for vlan info */
 		if (ppd->tp_status & TP_STATUS_VLAN_VALID) {
 			mbuf->vlan_tci = ppd->tp_vlan_tci;
-			mbuf->ol_flags |= (PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED);
+			mbuf->ol_flags |= (PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED);
 		}
 
 		/* release incoming frame and advance ring buffer */
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index b97a90cea..43b33dbf2 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -1361,7 +1361,7 @@ avp_dev_copy_from_buffers(struct avp_dev *avp,
 	src_offset = 0;
 
 	if (pkt_buf->ol_flags & RTE_AVP_RX_VLAN_PKT) {
-		ol_flags = PKT_RX_VLAN_PKT;
+		ol_flags = PKT_RX_VLAN;
 		vlan_tci = pkt_buf->vlan_tci;
 	} else {
 		ol_flags = 0;
@@ -1619,7 +1619,7 @@ avp_recv_pkts(void *rx_queue,
 		m->port = avp->port_id;
 
 		if (pkt_buf->ol_flags & RTE_AVP_RX_VLAN_PKT) {
-			m->ol_flags = PKT_RX_VLAN_PKT;
+			m->ol_flags = PKT_RX_VLAN;
 			m->vlan_tci = pkt_buf->vlan_tci;
 		}
 
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.c b/drivers/net/bnx2x/bnx2x_rxtx.c
index 5dd4aee7f..c72067f6f 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.c
+++ b/drivers/net/bnx2x/bnx2x_rxtx.c
@@ -422,7 +422,7 @@ bnx2x_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		 */
 		if (cqe_fp->pars_flags.flags & PARSING_FLAGS_VLAN) {
 			rx_mb->vlan_tci = cqe_fp->vlan_tag;
-			rx_mb->ol_flags |= PKT_RX_VLAN_PKT;
+			rx_mb->ol_flags |= PKT_RX_VLAN;
 		}
 
 		rx_pkts[nb_rx] = rx_mb;
diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index 153ca93ed..a677183f1 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -199,7 +199,7 @@ static void bnxt_tpa_start(struct bnxt_rx_queue *rxq,
 	if (tpa_start1->flags2 &
 	    rte_cpu_to_le_32(RX_TPA_START_CMPL_FLAGS2_META_FORMAT_VLAN)) {
 		mbuf->vlan_tci = rte_le_to_cpu_32(tpa_start1->metadata);
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 	}
 	if (likely(tpa_start1->flags2 &
 		   rte_cpu_to_le_32(RX_TPA_START_CMPL_FLAGS2_L4_CS_CALC)))
@@ -464,7 +464,7 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
 			(RX_PKT_CMPL_METADATA_VID_MASK |
 			RX_PKT_CMPL_METADATA_DE |
 			RX_PKT_CMPL_METADATA_PRI_MASK);
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 	}
 
 	if (likely(RX_CMP_IP_CS_OK(rxcmp1)))
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 3fbc1b123..c48993940 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -129,7 +129,7 @@ is_lacp_packets(uint16_t ethertype, uint8_t subtype, struct rte_mbuf *mbuf)
 {
 	const uint16_t ether_type_slow_be = rte_be_to_cpu_16(ETHER_TYPE_SLOW);
 
-	return !((mbuf->ol_flags & PKT_RX_VLAN_PKT) ? mbuf->vlan_tci : 0) &&
+	return !((mbuf->ol_flags & PKT_RX_VLAN) ? mbuf->vlan_tci : 0) &&
 		(ethertype == ether_type_slow_be &&
 		(subtype == SLOW_SUBTYPE_MARKER || subtype == SLOW_SUBTYPE_LACP));
 }
diff --git a/drivers/net/cxgbe/sge.c b/drivers/net/cxgbe/sge.c
index 5376fc500..33f7f0bc2 100644
--- a/drivers/net/cxgbe/sge.c
+++ b/drivers/net/cxgbe/sge.c
@@ -1405,7 +1405,7 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
 	}
 
 	if (pkt->vlan_ex) {
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 		mbuf->vlan_tci = ntohs(pkt->vlan);
 	}
 	rxq->stats.pkts++;
@@ -1550,7 +1550,7 @@ static int process_responses(struct sge_rspq *q, int budget,
 				}
 
 				if (cpl->vlan_ex) {
-					pkt->ol_flags |= PKT_RX_VLAN_PKT;
+					pkt->ol_flags |= PKT_RX_VLAN;
 					pkt->vlan_tci = ntohs(cpl->vlan);
 				}
 
diff --git a/drivers/net/dpaa/dpaa_rxtx.c b/drivers/net/dpaa/dpaa_rxtx.c
index 0433f3bb1..f7cfff798 100644
--- a/drivers/net/dpaa/dpaa_rxtx.c
+++ b/drivers/net/dpaa/dpaa_rxtx.c
@@ -219,7 +219,7 @@ static inline void dpaa_eth_packet_info(struct rte_mbuf *m,
 
 	/* Check if Vlan is present */
 	if (prs & DPAA_PARSE_VLAN_MASK)
-		m->ol_flags |= PKT_RX_VLAN_PKT;
+		m->ol_flags |= PKT_RX_VLAN;
 	/* Packet received without stripping the vlan */
 }
 
diff --git a/drivers/net/dpaa2/dpaa2_rxtx.c b/drivers/net/dpaa2/dpaa2_rxtx.c
index 7cfa73a8c..3f57dc227 100644
--- a/drivers/net/dpaa2/dpaa2_rxtx.c
+++ b/drivers/net/dpaa2/dpaa2_rxtx.c
@@ -122,7 +122,7 @@ dpaa2_dev_rx_offload(uint64_t hw_annot_addr, struct rte_mbuf *mbuf)
 
 	if (BIT_ISSET_AT_POS(annotation->word3,
 			     L2_VLAN_1_PRESENT | L2_VLAN_N_PRESENT))
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 
 	if (BIT_ISSET_AT_POS(annotation->word8, DPAA2_ETH_FAS_L3CE))
 		mbuf->ol_flags |= PKT_RX_IP_CKSUM_BAD;
diff --git a/drivers/net/e1000/em_rxtx.c b/drivers/net/e1000/em_rxtx.c
index 92b66b0ea..d4d5fe6e1 100644
--- a/drivers/net/e1000/em_rxtx.c
+++ b/drivers/net/e1000/em_rxtx.c
@@ -675,7 +675,7 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status)
 
 	/* Check if VLAN present */
 	pkt_flags = ((rx_status & E1000_RXD_STAT_VP) ?
-		PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED : 0);
+		PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED : 0);
 
 	return pkt_flags;
 }
@@ -830,7 +830,7 @@ eth_em_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		rxm->ol_flags = rxm->ol_flags |
 				rx_desc_error_to_pkt_flags(rxd.errors);
 
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
+		/* Only valid if PKT_RX_VLAN set in pkt_flags */
 		rxm->vlan_tci = rte_le_to_cpu_16(rxd.special);
 
 		/*
@@ -1056,7 +1056,7 @@ eth_em_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		first_seg->ol_flags = first_seg->ol_flags |
 					rx_desc_error_to_pkt_flags(rxd.errors);
 
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
+		/* Only valid if PKT_RX_VLAN set in pkt_flags */
 		rxm->vlan_tci = rte_le_to_cpu_16(rxd.special);
 
 		/* Prefetch data of first segment, if configured to do so. */
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index 8a1e5b18e..d25ea048d 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -785,7 +785,7 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status)
 
 	/* Check if VLAN present */
 	pkt_flags = ((rx_status & E1000_RXD_STAT_VP) ?
-		PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED : 0);
+		PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED : 0);
 
 #if defined(RTE_LIBRTE_IEEE1588)
 	if (rx_status & E1000_RXD_STAT_TMST)
@@ -946,7 +946,7 @@ eth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 
 		rxm->hash.rss = rxd.wb.lower.hi_dword.rss;
 		hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
+		/* Only valid if PKT_RX_VLAN set in pkt_flags */
 		rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);
 
 		pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(rxq, hlen_type_rss);
@@ -1180,7 +1180,7 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		first_seg->hash.rss = rxd.wb.lower.hi_dword.rss;
 
 		/*
-		 * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is
+		 * The vlan_tci field is only valid when PKT_RX_VLAN is
 		 * set in the pkt_flags field.
 		 */
 		first_seg->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);
diff --git a/drivers/net/enic/enic_rxtx.c b/drivers/net/enic/enic_rxtx.c
index a39172f14..1d43bde9a 100644
--- a/drivers/net/enic/enic_rxtx.c
+++ b/drivers/net/enic/enic_rxtx.c
@@ -243,7 +243,7 @@ enic_cq_rx_to_pkt_flags(struct cq_desc *cqd, struct rte_mbuf *mbuf)
 
 	/* VLAN STRIPPED flag. The L2 packet type updated here also */
 	if (bwflags & CQ_ENET_RQ_DESC_FLAGS_VLAN_STRIPPED) {
-		pkt_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+		pkt_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 		mbuf->packet_type |= RTE_PTYPE_L2_ETHER;
 	} else {
 		if (vlan_tci != 0)
diff --git a/drivers/net/fm10k/fm10k_rxtx.c b/drivers/net/fm10k/fm10k_rxtx.c
index 4e84926f8..d6081e485 100644
--- a/drivers/net/fm10k/fm10k_rxtx.c
+++ b/drivers/net/fm10k/fm10k_rxtx.c
@@ -158,10 +158,10 @@ fm10k_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		 * Packets in fm10k device always carry at least one VLAN tag.
 		 * For those packets coming in without VLAN tag,
 		 * the port default VLAN tag will be used.
-		 * So, always PKT_RX_VLAN_PKT flag is set and vlan_tci
+		 * So, always PKT_RX_VLAN flag is set and vlan_tci
 		 * is valid for each RX packet's mbuf.
 		 */
-		mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+		mbuf->ol_flags |= PKT_RX_VLAN;
 		mbuf->vlan_tci = desc.w.vlan;
 		/**
 		 * mbuf->vlan_tci_outer is an idle field in fm10k driver,
@@ -319,10 +319,10 @@ fm10k_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		 * Packets in fm10k device always carry at least one VLAN tag.
 		 * For those packets coming in without VLAN tag,
 		 * the port default VLAN tag will be used.
-		 * So, always PKT_RX_VLAN_PKT flag is set and vlan_tci
+		 * So, always PKT_RX_VLAN flag is set and vlan_tci
 		 * is valid for each RX packet's mbuf.
 		 */
-		first_seg->ol_flags |= PKT_RX_VLAN_PKT;
+		first_seg->ol_flags |= PKT_RX_VLAN;
 		first_seg->vlan_tci = desc.w.vlan;
 		/**
 		 * mbuf->vlan_tci_outer is an idle field in fm10k driver,
diff --git a/drivers/net/fm10k/fm10k_rxtx_vec.c b/drivers/net/fm10k/fm10k_rxtx_vec.c
index d23bfe9b7..edc4ae16e 100644
--- a/drivers/net/fm10k/fm10k_rxtx_vec.c
+++ b/drivers/net/fm10k/fm10k_rxtx_vec.c
@@ -81,8 +81,8 @@ fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
 
 	const __m128i pkttype_msk = _mm_set_epi16(
 			0x0000, 0x0000, 0x0000, 0x0000,
-			PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT,
-			PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT);
+			PKT_RX_VLAN, PKT_RX_VLAN,
+			PKT_RX_VLAN, PKT_RX_VLAN);
 
 	/* mask everything except rss type */
 	const __m128i rsstype_msk = _mm_set_epi16(
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index f21c1c5d2..904d37f08 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -108,7 +108,7 @@ i40e_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union i40e_rx_desc *rxdp)
 {
 	if (rte_le_to_cpu_64(rxdp->wb.qword1.status_error_len) &
 		(1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) {
-		mb->ol_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+		mb->ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 		mb->vlan_tci =
 			rte_le_to_cpu_16(rxdp->wb.qword0.lo_dword.l2tag1);
 		PMD_RX_LOG(DEBUG, "Descriptor l2tag1: %u",
diff --git a/drivers/net/i40e/i40e_rxtx_vec_altivec.c b/drivers/net/i40e/i40e_rxtx_vec_altivec.c
index f4036ea28..5ab9445ed 100644
--- a/drivers/net/i40e/i40e_rxtx_vec_altivec.c
+++ b/drivers/net/i40e/i40e_rxtx_vec_altivec.c
@@ -146,7 +146,7 @@ desc_to_olflags_v(vector unsigned long descs[4], struct rte_mbuf **rx_pkts)
 	/* map rss and vlan type to rss hash and vlan flag */
 	const vector unsigned char vlan_flags = (vector unsigned char){
 			0, 0, 0, 0,
-			PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED, 0, 0, 0,
+			PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED, 0, 0, 0,
 			0, 0, 0, 0,
 			0, 0, 0, 0};
 
diff --git a/drivers/net/i40e/i40e_rxtx_vec_neon.c b/drivers/net/i40e/i40e_rxtx_vec_neon.c
index 694e91f33..d0e604068 100644
--- a/drivers/net/i40e/i40e_rxtx_vec_neon.c
+++ b/drivers/net/i40e/i40e_rxtx_vec_neon.c
@@ -137,7 +137,7 @@ desc_to_olflags_v(struct i40e_rx_queue *rxq, uint64x2_t descs[4],
 	/* map rss and vlan type to rss hash and vlan flag */
 	const uint8x16_t vlan_flags = {
 			0, 0, 0, 0,
-			PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED, 0, 0, 0,
+			PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED, 0, 0, 0,
 			0, 0, 0, 0,
 			0, 0, 0, 0};
 
diff --git a/drivers/net/i40e/i40e_rxtx_vec_sse.c b/drivers/net/i40e/i40e_rxtx_vec_sse.c
index 779f14e53..86e16ddf9 100644
--- a/drivers/net/i40e/i40e_rxtx_vec_sse.c
+++ b/drivers/net/i40e/i40e_rxtx_vec_sse.c
@@ -151,7 +151,7 @@ desc_to_olflags_v(struct i40e_rx_queue *rxq, __m128i descs[4],
 	/* map rss and vlan type to rss hash and vlan flag */
 	const __m128i vlan_flags = _mm_set_epi8(0, 0, 0, 0,
 			0, 0, 0, 0,
-			0, 0, 0, PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED,
+			0, 0, 0, PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED,
 			0, 0, 0, 0);
 
 	const __m128i rss_flags = _mm_set_epi8(0, 0, 0, 0,
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 14b9c5303..a16921afd 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -1960,9 +1960,9 @@ ixgbe_vlan_hw_strip_bitmap_set(struct rte_eth_dev *dev, uint16_t queue, bool on)
 	rxq = dev->data->rx_queues[queue];
 
 	if (on)
-		rxq->vlan_flags = PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+		rxq->vlan_flags = PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 	else
-		rxq->vlan_flags = PKT_RX_VLAN_PKT;
+		rxq->vlan_flags = PKT_RX_VLAN;
 }
 
 static void
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 0038dfbb4..ea2813a43 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -1849,7 +1849,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		rxm->port = rxq->port_id;
 
 		pkt_info = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
+		/* Only valid if PKT_RX_VLAN set in pkt_flags */
 		rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);
 
 		pkt_flags = rx_desc_status_to_pkt_flags(staterr, vlan_flags);
@@ -1940,7 +1940,7 @@ ixgbe_fill_cluster_head_buf(
 
 	head->port = rxq->port_id;
 
-	/* The vlan_tci field is only valid when PKT_RX_VLAN_PKT is
+	/* The vlan_tci field is only valid when PKT_RX_VLAN is
 	 * set in the pkt_flags field.
 	 */
 	head->vlan_tci = rte_le_to_cpu_16(desc->wb.upper.vlan);
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 44de1caac..18e3d199f 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -126,8 +126,8 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 	} vol;
 
 	const uint8x16_t pkttype_msk = {
-			PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT,
-			PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT,
+			PKT_RX_VLAN, PKT_RX_VLAN,
+			PKT_RX_VLAN, PKT_RX_VLAN,
 			0x00, 0x00, 0x00, 0x00,
 			0x00, 0x00, 0x00, 0x00,
 			0x00, 0x00, 0x00, 0x00};
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
index e704a7f35..fe6937bf3 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
@@ -397,7 +397,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	sw_ring = &rxq->sw_ring[rxq->rx_tail];
 
 	/* ensure these 2 flags are in the lower 8 bits */
-	RTE_BUILD_BUG_ON((PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED) > UINT8_MAX);
+	RTE_BUILD_BUG_ON((PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED) > UINT8_MAX);
 	vlan_flags = rxq->vlan_flags & UINT8_MAX;
 
 	/* A. load 4 packet in one loop
diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index 961967bf4..763d5bb59 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -1882,7 +1882,7 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 			if (rxq->vlan_strip &&
 			    (cqe->hdr_type_etc &
 			     rte_cpu_to_be_16(MLX5_CQE_VLAN_STRIPPED))) {
-				pkt->ol_flags |= PKT_RX_VLAN_PKT |
+				pkt->ol_flags |= PKT_RX_VLAN |
 					PKT_RX_VLAN_STRIPPED;
 				pkt->vlan_tci =
 					rte_be_to_cpu_16(cqe->vlan_info);
diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
index 4cb7f2889..da3c96f4a 100644
--- a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
+++ b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
@@ -572,7 +572,7 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq,
 	const uint32x4_t ptype_ol_mask = { 0x106, 0x106, 0x106, 0x106 };
 	const uint8x16_t cv_flag_sel = {
 		0,
-		(uint8_t)(PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED),
+		(uint8_t)(PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED),
 		(uint8_t)(PKT_RX_IP_CKSUM_GOOD >> 1),
 		0,
 		(uint8_t)(PKT_RX_L4_CKSUM_GOOD >> 1),
@@ -582,7 +582,7 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq,
 	};
 	const uint32x4_t cv_mask =
 		vdupq_n_u32(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			    PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED);
+			    PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED);
 	const uint64x1_t mbuf_init = vld1_u64(&rxq->mbuf_initializer);
 	const uint64x1_t r32_mask = vcreate_u64(0xffffffff);
 	uint64x2_t rearm0, rearm1, rearm2, rearm3;
diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
index e9819b762..95e41d51a 100644
--- a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
+++ b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
@@ -563,17 +563,17 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq, __m128i cqes[4],
 			     (uint8_t)(PKT_RX_L4_CKSUM_GOOD >> 1),
 			     0,
 			     (uint8_t)(PKT_RX_IP_CKSUM_GOOD >> 1),
-			     (uint8_t)(PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED),
+			     (uint8_t)(PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED),
 			     0);
 	const __m128i cv_mask =
 		_mm_set_epi32(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			      PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED,
+			      PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED,
 			      PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			      PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED,
+			      PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED,
 			      PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			      PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED,
+			      PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED,
 			      PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD |
-			      PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED);
+			      PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED);
 	const __m128i mbuf_init =
 		_mm_loadl_epi64((__m128i *)&rxq->mbuf_initializer);
 	__m128i rearm0, rearm1, rearm2, rearm3;
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 0917b9c49..098dbcb62 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -2067,7 +2067,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		if ((rxds->rxd.flags & PCIE_DESC_RX_VLAN) &&
 		    (hw->ctrl & NFP_NET_CFG_CTRL_RXVLAN)) {
 			mb->vlan_tci = rte_cpu_to_le_32(rxds->rxd.vlan);
-			mb->ol_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+			mb->ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 		}
 
 		/* Adding the mbuff to the mbuff array passed by the app */
diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c
index 45b4aeb8a..f2b62e8bf 100644
--- a/drivers/net/qede/qede_rxtx.c
+++ b/drivers/net/qede/qede_rxtx.c
@@ -1276,14 +1276,14 @@ qede_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		}
 
 		if (CQE_HAS_VLAN(parse_flag)) {
-			ol_flags |= PKT_RX_VLAN_PKT;
+			ol_flags |= PKT_RX_VLAN;
 			if (qdev->vlan_strip_flg) {
 				ol_flags |= PKT_RX_VLAN_STRIPPED;
 				rx_mb->vlan_tci = vlan_tci;
 			}
 		}
 		if (CQE_HAS_OUTER_VLAN(parse_flag)) {
-			ol_flags |= PKT_RX_QINQ_PKT;
+			ol_flags |= PKT_RX_QINQ;
 			if (qdev->vlan_strip_flg) {
 				rx_mb->vlan_tci = vlan_tci;
 				ol_flags |= PKT_RX_QINQ_STRIPPED;
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index c9a2df3f4..01c85f138 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -847,7 +847,8 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 
 			/* Check for hardware stripped VLAN tag */
 			if (rcd->ts) {
-				start->ol_flags |= (PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED);
+				start->ol_flags |= (PKT_RX_VLAN |
+						PKT_RX_VLAN_STRIPPED);
 				start->vlan_tci = rte_le_to_cpu_16((uint16_t)rcd->tci);
 			}
 
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 0e18709d9..92fc704ee 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -308,7 +308,7 @@ const void *__rte_pktmbuf_read(const struct rte_mbuf *m, uint32_t off,
 const char *rte_get_rx_ol_flag_name(uint64_t mask)
 {
 	switch (mask) {
-	case PKT_RX_VLAN_PKT: return "PKT_RX_VLAN_PKT";
+	case PKT_RX_VLAN: return "PKT_RX_VLAN";
 	case PKT_RX_RSS_HASH: return "PKT_RX_RSS_HASH";
 	case PKT_RX_FDIR: return "PKT_RX_FDIR";
 	case PKT_RX_L4_CKSUM_BAD: return "PKT_RX_L4_CKSUM_BAD";
@@ -339,7 +339,7 @@ int
 rte_get_rx_ol_flag_list(uint64_t mask, char *buf, size_t buflen)
 {
 	const struct flag_mask rx_flags[] = {
-		{ PKT_RX_VLAN_PKT, PKT_RX_VLAN_PKT, NULL },
+		{ PKT_RX_VLAN, PKT_RX_VLAN, NULL },
 		{ PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, NULL },
 		{ PKT_RX_FDIR, PKT_RX_FDIR, NULL },
 		{ PKT_RX_L4_CKSUM_BAD, PKT_RX_L4_CKSUM_MASK, NULL },
@@ -359,6 +359,7 @@ rte_get_rx_ol_flag_list(uint64_t mask, char *buf, size_t buflen)
 		{ PKT_RX_QINQ_STRIPPED, PKT_RX_QINQ_STRIPPED, NULL },
 		{ PKT_RX_LRO, PKT_RX_LRO, NULL },
 		{ PKT_RX_TIMESTAMP, PKT_RX_TIMESTAMP, NULL },
+		{ PKT_RX_QINQ, PKT_RX_QINQ, NULL },
 	};
 	const char *name;
 	unsigned int i;
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index cc380400d..5f250f364 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -89,12 +89,13 @@ extern "C" {
  */
 
 /**
- * RX packet is a 802.1q VLAN packet. This flag was set by PMDs when
- * the packet is recognized as a VLAN, but the behavior between PMDs
- * was not the same. This flag is kept for some time to avoid breaking
- * applications and should be replaced by PKT_RX_VLAN_STRIPPED.
+ * The RX packet is a 802.1q VLAN packet, and the tci has been
+ * saved in in mbuf->vlan_tci.
+ * If the flag PKT_RX_VLAN_STRIPPED is also present, the VLAN
+ * header has been stripped from mbuf data, else it is still
+ * present.
  */
-#define PKT_RX_VLAN_PKT      (1ULL << 0)
+#define PKT_RX_VLAN          (1ULL << 0)
 
 #define PKT_RX_RSS_HASH      (1ULL << 1)  /**< RX packet with RSS hash result. */
 #define PKT_RX_FDIR          (1ULL << 2)  /**< RX packet with FDIR match indicate. */
@@ -171,13 +172,6 @@ extern "C" {
 #define PKT_RX_QINQ_STRIPPED (1ULL << 15)
 
 /**
- * Deprecated.
- * RX packet with double VLAN stripped.
- * This flag is replaced by PKT_RX_QINQ_STRIPPED.
- */
-#define PKT_RX_QINQ_PKT      PKT_RX_QINQ_STRIPPED
-
-/**
  * When packets are coalesced by a hardware or virtual driver, this flag
  * can be set in the RX mbuf, meaning that the m->tso_segsz field is
  * valid and is set to the segment size of original packets.
@@ -189,6 +183,15 @@ extern "C" {
  */
 #define PKT_RX_TIMESTAMP     (1ULL << 17)
 
+/**
+ * The RX packet is a double VLAN, and the outer tci has been
+ * saved in in mbuf->vlan_tci_outer.
+ * If the flag PKT_RX_QINQ_STRIPPED is also present, both VLANs
+ * headers have been stripped from mbuf data, else they are still
+ * present.
+ */
+#define PKT_RX_QINQ          (1ULL << 18)
+
 /* add new RX flags here */
 
 /* add new TX flags here */
diff --git a/lib/librte_net/rte_ether.h b/lib/librte_net/rte_ether.h
index 917d42a1a..06d7b486c 100644
--- a/lib/librte_net/rte_ether.h
+++ b/lib/librte_net/rte_ether.h
@@ -358,7 +358,7 @@ static inline int rte_vlan_strip(struct rte_mbuf *m)
 		return -1;
 
 	struct vlan_hdr *vh = (struct vlan_hdr *)(eh + 1);
-	m->ol_flags |= PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+	m->ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
 	m->vlan_tci = rte_be_to_cpu_16(vh->vlan_tci);
 
 	/* Copy ether header over rather than moving whole packet */
-- 
2.11.0

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] DPDK techboard minutes of October 13
@ 2017-10-23 11:50  3% Olivier MATZ
  0 siblings, 0 replies; 200+ results
From: Olivier MATZ @ 2017-10-23 11:50 UTC (permalink / raw)
  To: dev

Hi,

Here are the minutes of the last DPDK technical board meeting
held on 2017-10-13.

Attendees:
- Bruce Richardson
- Hemant Agrawal
- Jan Blunck
- Jerin Jacob
- Konstantin Ananyev
- Olivier Matz
- Stephen Hemminger
- Thomas Monjalon
- Yuanhan Liu

1) Vendor trees

   The proposal to introduce new next-net-* repositories for vendors drivers
   has been approved to optimize the process.

   - A specific maintainer for this tree will be in charge of reviewing
     and integrating the incoming patches.
   - The next-net maintainer still has the responsibility of re-checking
     that patches do not conflict with deprecations and DPDK evolutions
     in net drivers or ethdev. This will be described in the
     contributing guide.
   - This applies to the most active vendors, where the number of
     patches justifies the additional work.
   - These trees are restricted to network drivers.

2) API/ABI stability

   a) one LTS per year

      The techboard approved the proposal made at userspace of having
      one LTS per year. The next version (17.11) will be a LTS.

      - Luca Bocassi accepted to be LTS maintainer, he will maintain
        16.11.
      - Yuanhan Liu will manage 17.11.

    b) experimental APIs

       Every new API will have the "experimental" tag, meaning that
       the API is not guaranteed to follow the API deprecation
       process. This won't apply to changes on existing APIs.

       This tag will remain for at least one release, and it is the
       responsibility of the developer and maintainer to send a patch
       to remove it.

    c) enforce acknowledging of deprecation notices

       It was suggested to require 3 acks coming from different
       companies for deprecations. The techboard did not approved it.

       However, the techboard agreed that the ack of the maintainer of
       the related code has to be mandatory (and 3 acks will still be
       required, as of today). The techboard also recommends to have
       acks from different "areas of interest" (ex: nics vendors, cpu
       vendors, sw vendors, ...)

   [1] http://dpdk.org/ml/archives/dev/2017-October/077937.html
   [2] http://dpdk.org/ml/archives/dev/2017-October/077935.html

3) license of the optimized division code from libdivide

   The original author would like to keep the license of its code and
   declined to put it under BSD [3]. The techboard asks to remove this
   code and rewrite it as a BSD-licensed code. It could possibly be
   based on rte_reciprocal.

   [3] http://dpdk.org/ml/archives/dev/2017-October/077338.html

4) update on IPSec offload (rte_security)

   - Discussions are ongoing on the mailing list.
   - Target is rc2.
   - Since it's a new API, it will be marked experimental.

5) VF are broken with igb-uio

   A suggestion was made [4] to revert the initial patch, whose
   objective was to avoid to leave the devices in unknown state.
   It was suggested to give a chance to the fix [5] into rc1.

   [4] http://dpdk.org/ml/archives/dev/2017-October/079111.html
   [5] http://dpdk.org/ml/archives/dev/2017-October/079159.html

6) next chair

   Thomas will chair the next meeting as Stephen (next per alphabetical
   order) may be unavailable.

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2] doc: fix highlight of bumped libs in release notes
  2017-10-14  0:09  3% [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes Thomas Monjalon
  2017-10-16  8:33  0% ` Yang, Zhiyong
  2017-10-18 20:57  0% ` Ferruh Yigit
@ 2017-10-23 10:15  3% ` Thomas Monjalon
  2017-10-23 16:26  0%   ` Ferruh Yigit
  2 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-23 10:15 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit

The libraries which have their ABI version increased in this release
must be prepended with a + sign to make them appear clearly.

Fixes: f8244c6399d9 ("ethdev: increase port id range")
Fixes: ec51443cc99a ("gso: add Generic Segmentation Offload API framework")

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Zhiyong Yang <zhiyong.yang@intel.com>
---
v2: highlight vhost too
---
 doc/guides/rel_notes/release_17_11.rst | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8db35f5e4..a8b113bb1 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -338,16 +338,16 @@ The libraries prepended with a plus sign were incremented in this version.
 .. code-block:: diff
 
      librte_acl.so.2
-     librte_bitratestats.so.2
+   + librte_bitratestats.so.2
      librte_cfgfile.so.2
      librte_cmdline.so.2
      librte_cryptodev.so.3
      librte_distributor.so.1
      librte_eal.so.5
-     librte_ethdev.so.8
-     librte_eventdev.so.3
+   + librte_ethdev.so.8
+   + librte_eventdev.so.3
      librte_gro.so.1
-     librte_gso.so.1
+   + librte_gso.so.1
      librte_hash.so.2
      librte_ip_frag.so.1
      librte_jobstats.so.1
@@ -360,15 +360,15 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_meter.so.1
      librte_metrics.so.1
      librte_net.so.1
-     librte_pdump.so.2
+   + librte_pdump.so.2
      librte_pipeline.so.3
-     librte_pmd_bnxt.so.2
-     librte_pmd_bond.so.2
-     librte_pmd_i40e.so.2
-     librte_pmd_ixgbe.so.2
+   + librte_pmd_bnxt.so.2
+   + librte_pmd_bond.so.2
+   + librte_pmd_i40e.so.2
+   + librte_pmd_ixgbe.so.2
      librte_pmd_ring.so.2
    + librte_pmd_softnic.so.1
-     librte_pmd_vhost.so.2
+   + librte_pmd_vhost.so.2
      librte_port.so.3
      librte_power.so.1
      librte_reorder.so.1
-- 
2.14.2

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes
  2017-10-18 20:57  0% ` Ferruh Yigit
@ 2017-10-23 10:13  0%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-23 10:13 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev

18/10/2017 22:57, Ferruh Yigit:
> On 10/13/2017 5:09 PM, Thomas Monjalon wrote:
> > The libraries which have their ABI version increased in this release
> > must be prepended with a + sign to make them appear clearly.
> > 
> > Fixes: f8244c6399d9 ("ethdev: increase port id range")
> > Fixes: ec51443cc99a ("gso: add Generic Segmentation Offload API framework")
> > 
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> 
> <...>
> 
> > +   + librte_pmd_ixgbe.so.2
> >       librte_pmd_ring.so.2
> >     + librte_pmd_softnic.so.1
> >       librte_pmd_vhost.so.2
> 
> librte_pmd_vhost.so.2 also requires a "+"

Right, I send a v2, thanks

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 1/4] cryptodev: remove crypto vdev init API
  2017-10-13 11:51  4%   ` [dpdk-dev] [PATCH v7 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
@ 2017-10-23 10:06  3%     ` De Lara Guarch, Pablo
  0 siblings, 0 replies; 200+ results
From: De Lara Guarch, Pablo @ 2017-10-23 10:06 UTC (permalink / raw)
  To: Tan, Jianfeng, dev
  Cc: jblunck, Richardson, Bruce, Ananyev, Konstantin, thomas, yliu,
	maxime.coquelin, mtetsuyah, Yigit, Ferruh

Hi Jianfeng,

> -----Original Message-----
> From: Tan, Jianfeng
> Sent: Friday, October 13, 2017 12:52 PM
> To: dev@dpdk.org
> Cc: jblunck@infradead.org; Richardson, Bruce
> <bruce.richardson@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; De Lara Guarch, Pablo
> <pablo.de.lara.guarch@intel.com>; thomas@monjalon.net;
> yliu@fridaylinux.org; maxime.coquelin@redhat.com;
> mtetsuyah@gmail.com; Yigit, Ferruh <ferruh.yigit@intel.com>; Tan,
> Jianfeng <jianfeng.tan@intel.com>
> Subject: [PATCH v7 1/4] cryptodev: remove crypto vdev init API
> 
> Remove rte_cryptodev_create_vdev() for duplication.
> 
> Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
> Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>

...

> --- a/lib/librte_cryptodev/Makefile
> +++ b/lib/librte_cryptodev/Makefile
> @@ -34,7 +34,7 @@ include $(RTE_SDK)/mk/rte.vars.mk  LIB =
> librte_cryptodev.a
> 
>  # library version
> -LIBABIVER := 3
> +LIBABIVER := 4

Sorry for the late review.
Since you are bumping the ABI version, you should also change it in
"Share Library Versions", in release_17_11.rst.

Thanks,
Pablo

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH] eal: remove deprecated log functions
@ 2017-10-23  9:56 10% Olivier Matz
  0 siblings, 0 replies; 200+ results
From: Olivier Matz @ 2017-10-23  9:56 UTC (permalink / raw)
  To: dev; +Cc: thomas

Remove rte_set_log_level(), rte_get_log_level(),
rte_set_log_type(), and rte_get_log_type().

Also update librte_eal.so version in docuementation.
The LIBABIVER variable in eal has already been modified in
commit f26ab687a74f ("eal: remove Xen dom0 support").

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---
 doc/guides/rel_notes/deprecation.rst            |  8 -----
 doc/guides/rel_notes/release_17_11.rst          | 10 ++++++-
 lib/librte_eal/bsdapp/eal/rte_eal_version.map   |  4 ---
 lib/librte_eal/common/eal_common_log.c          | 40 -------------------------
 lib/librte_eal/common/include/rte_log.h         | 29 ------------------
 lib/librte_eal/linuxapp/eal/rte_eal_version.map |  4 ---
 6 files changed, 9 insertions(+), 86 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 52058f580..0d9925126 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -8,14 +8,6 @@ API and ABI deprecation notices are to be posted here.
 Deprecation Notices
 -------------------
 
-* eal: the following functions are deprecated starting from 17.05 and will
-  be removed in 17.11:
-
-  - ``rte_set_log_level``, replaced by ``rte_log_set_global_level``
-  - ``rte_get_log_level``, replaced by ``rte_log_get_global_level``
-  - ``rte_set_log_type``, replaced by ``rte_log_set_level``
-  - ``rte_get_log_type``, replaced by ``rte_log_get_level``
-
 * eal: several API and ABI changes are planned for ``rte_devargs`` in v17.11.
   The format of device command line parameters will change. The bus will need
   to be explicitly stated in the device declaration. The enum ``rte_devtype``
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8db35f5e4..0370aed89 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -283,6 +283,14 @@ API Changes
   The function ``rte_cryptodev_allocate_driver()`` has been modified.
   An extra parameter ``struct cryptodev_driver *crypto_drv`` has been added.
 
+* **Removed deprecated functions to manage log level or type.**
+
+  The functions ``rte_set_log_level()``, ``rte_get_log_level()``,
+  ``rte_set_log_type()`` and ``rte_get_log_type()`` have been removed.
+  They are respectively replaced by ``rte_log_set_global_level()``,
+  ``rte_log_get_global_level()``, ``rte_log_set_level()`` and
+  ``rte_log_get_level()``.
+
 
 ABI Changes
 -----------
@@ -343,7 +351,7 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_cmdline.so.2
      librte_cryptodev.so.3
      librte_distributor.so.1
-     librte_eal.so.5
+   + librte_eal.so.6
      librte_ethdev.so.8
      librte_eventdev.so.3
      librte_gro.so.1
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index 080896f73..7dc687f88 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -44,8 +44,6 @@ DPDK_2.0 {
 	rte_free;
 	rte_get_hpet_cycles;
 	rte_get_hpet_hz;
-	rte_get_log_level;
-	rte_get_log_type;
 	rte_get_tsc_hz;
 	rte_hexdump;
 	rte_intr_callback_register;
@@ -78,8 +76,6 @@ DPDK_2.0 {
 	rte_openlog_stream;
 	rte_realloc;
 	rte_set_application_usage_hook;
-	rte_set_log_level;
-	rte_set_log_type;
 	rte_socket_id;
 	rte_strerror;
 	rte_strsplit;
diff --git a/lib/librte_eal/common/eal_common_log.c b/lib/librte_eal/common/eal_common_log.c
index b62b0a6d6..be404136d 100644
--- a/lib/librte_eal/common/eal_common_log.c
+++ b/lib/librte_eal/common/eal_common_log.c
@@ -89,14 +89,6 @@ rte_log_set_global_level(uint32_t level)
 	rte_logs.level = (uint32_t)level;
 }
 
-/* Set global log level */
-/* replaced by rte_log_set_global_level */
-__rte_deprecated void
-rte_set_log_level(uint32_t level)
-{
-	rte_log_set_global_level(level);
-}
-
 /* Get global log level */
 uint32_t
 rte_log_get_global_level(void)
@@ -104,14 +96,6 @@ rte_log_get_global_level(void)
 	return rte_logs.level;
 }
 
-/* Get global log level */
-/* replaced by rte_log_get_global_level */
-uint32_t
-rte_get_log_level(void)
-{
-	return rte_log_get_global_level();
-}
-
 int
 rte_log_get_level(uint32_t type)
 {
@@ -121,30 +105,6 @@ rte_log_get_level(uint32_t type)
 	return rte_logs.dynamic_types[type].loglevel;
 }
 
-/* Set global log type */
-__rte_deprecated void
-rte_set_log_type(uint32_t type, int enable)
-{
-	if (type < RTE_LOGTYPE_FIRST_EXT_ID) {
-		if (enable)
-			rte_logs.type |= 1 << type;
-		else
-			rte_logs.type &= ~(1 << type);
-	}
-
-	if (enable)
-		rte_log_set_level(type, 0);
-	else
-		rte_log_set_level(type, RTE_LOG_DEBUG);
-}
-
-/* Get global log type */
-__rte_deprecated uint32_t
-rte_get_log_type(void)
-{
-	return rte_logs.type;
-}
-
 int
 rte_log_set_level(uint32_t type, uint32_t level)
 {
diff --git a/lib/librte_eal/common/include/rte_log.h b/lib/librte_eal/common/include/rte_log.h
index 2fa119983..16564d41b 100644
--- a/lib/librte_eal/common/include/rte_log.h
+++ b/lib/librte_eal/common/include/rte_log.h
@@ -139,12 +139,6 @@ int rte_openlog_stream(FILE *f);
 void rte_log_set_global_level(uint32_t level);
 
 /**
- * Deprecated, replaced by rte_log_set_global_level().
- */
-__rte_deprecated
-void rte_set_log_level(uint32_t level);
-
-/**
  * Get the global log level.
  *
  * @return
@@ -153,29 +147,6 @@ void rte_set_log_level(uint32_t level);
 uint32_t rte_log_get_global_level(void);
 
 /**
- * Deprecated, replaced by rte_log_get_global_level().
- */
-__rte_deprecated
-uint32_t rte_get_log_level(void);
-
-/**
- * Enable or disable the log type.
- *
- * @param type
- *   Log type, for example, RTE_LOGTYPE_EAL.
- * @param enable
- *   True for enable; false for disable.
- */
-__rte_deprecated
-void rte_set_log_type(uint32_t type, int enable);
-
-/**
- * Get the global log type.
- */
-__rte_deprecated
-uint32_t rte_get_log_type(void);
-
-/**
  * Get the log level for a given type.
  *
  * @param logtype
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index c173ccfdb..8802b288e 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -44,8 +44,6 @@ DPDK_2.0 {
 	rte_free;
 	rte_get_hpet_cycles;
 	rte_get_hpet_hz;
-	rte_get_log_level;
-	rte_get_log_type;
 	rte_get_tsc_hz;
 	rte_hexdump;
 	rte_intr_callback_register;
@@ -78,8 +76,6 @@ DPDK_2.0 {
 	rte_openlog_stream;
 	rte_realloc;
 	rte_set_application_usage_hook;
-	rte_set_log_level;
-	rte_set_log_type;
 	rte_socket_id;
 	rte_strerror;
 	rte_strsplit;
-- 
2.11.0

^ permalink raw reply	[relevance 10%]

* Re: [dpdk-dev] [PATCH v2 01/25] ethdev: introduce generic flow API
  @ 2017-10-23  8:53  0%     ` Zhao1, Wei
  0 siblings, 0 replies; 200+ results
From: Zhao1, Wei @ 2017-10-23  8:53 UTC (permalink / raw)
  To: Adrien Mazarguil; +Cc: dev, Adrien Mazarguil

Hi, Adrien



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Adrien Mazarguil
> Sent: Saturday, December 17, 2016 12:25 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2 01/25] ethdev: introduce generic flow API
> 
> This new API supersedes all the legacy filter types described in rte_eth_ctrl.h.
> It is slightly higher level and as a result relies more on PMDs to process and
> validate flow rules.
> 
> Benefits:
> 
> - A unified API is easier to program for, applications do not have to be
>   written for a specific filter type which may or may not be supported by
>   the underlying device.
> 
> - The behavior of a flow rule is the same regardless of the underlying
>   device, applications do not need to be aware of hardware quirks.
> 
> - Extensible by design, API/ABI breakage should rarely occur if at all.
> 
> - Documentation is self-standing, no need to look up elsewhere.
> 
> Existing filter types will be deprecated and removed in the near future.
> 
> Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
> ---
>  MAINTAINERS                            |   4 +
>  doc/api/doxy-api-index.md              |   2 +
>  lib/librte_ether/Makefile              |   3 +
>  lib/librte_ether/rte_eth_ctrl.h        |   1 +
>  lib/librte_ether/rte_ether_version.map |  11 +
>  lib/librte_ether/rte_flow.c            | 159 +++++
>  lib/librte_ether/rte_flow.h            | 942 ++++++++++++++++++++++++++++
>  lib/librte_ether/rte_flow_driver.h     | 181 ++++++
>  8 files changed, 1303 insertions(+)
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 26d9590..5975cff 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -243,6 +243,10 @@ M: Thomas Monjalon
> <thomas.monjalon@6wind.com>
>  F: lib/librte_ether/
>  F: scripts/test-null.sh
> 

+/**
+ * RTE_FLOW_ACTION_TYPE_RSS
+ *
+ * Similar to QUEUE, except RSS is additionally performed on packets to
+ * spread them among several queues according to the provided parameters.
+ *
+ * Note: RSS hash result is normally stored in the hash.rss mbuf field,
+ * however it conflicts with the MARK action as they share the same
+ * space. When both actions are specified, the RSS hash is discarded 
+and
+ * PKT_RX_RSS_HASH is not set in ol_flags. MARK has priority. The mbuf
+ * structure should eventually evolve to store both.
+ *
+ * Terminating by default.
+ */
+struct rte_flow_action_rss {
+	const struct rte_eth_rss_conf *rss_conf; /**< RSS parameters. */
+	uint16_t num; /**< Number of entries in queue[]. */
+	uint16_t queue[]; /**< Queues indices to use. */ };
+

I am plan for moving rss to rte_flow.
May I ask you some question for this struct of rte_flow_action_rss.
1. why do you use pointer mode for rss_conf, why not use " struct rte_eth_rss_conf  rss_conf "?
we need to fill these rss info which get from CLI to this struct, if we use the pointer mode, how can we fill in these info?

2. And also why the" const" is not need? We need a const ?How can we config this parameter?

3. what is your expect mode for CLI command for rss config? When I type in :
" flow create 0 pattern eth / tcp / end actions rss queues queue 0 /end "
Or " flow create 0 pattern eth / tcp / end actions rss queues {0 1 2} /end "
I get " Bad arguments ".

So, the right CLI command is ?

Thank you!

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice
    @ 2017-10-20 12:31 15%     ` Santosh Shukla
  2017-10-23 20:29  0%       ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Santosh Shukla @ 2017-10-20 12:31 UTC (permalink / raw)
  To: dev
  Cc: olivier.matz, thomas, jerin.jacob, hemant.agrawal,
	anatoly.burakov, Santosh Shukla

Removed dpdk iova aware ABI deprecation notice,
and updated ABI change details in release_17.11.rst.

Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/rel_notes/deprecation.rst   |  7 -------
 doc/guides/rel_notes/release_17_11.rst | 28 ++++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 52058f580..d89d35320 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -29,13 +29,6 @@ Deprecation Notices
   - ``rte_eal_devargs_type_count``
   - ``rte_eal_parse_devargs_str``, replaced by ``rte_eal_devargs_parse``
 
-* eal: An ABI change is planned for 17.11 to make DPDK aware of IOVA address
-  translation scheme.
-  Reference to phys address in EAL data-structure or functions may change to
-  IOVA address or more appropriate name.
-  The change will be only for the name.
-  Functional aspects of the API or data-structure will remain same.
-
 * The mbuf flags PKT_RX_VLAN_PKT and PKT_RX_QINQ_PKT are deprecated and
   are respectively replaced by PKT_RX_VLAN_STRIPPED and
   PKT_RX_QINQ_STRIPPED, that are better described. The old flags and
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 6f3b92bc5..5287e96c3 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -302,6 +302,34 @@ ABI Changes
   The size of the field ``port_id`` in the ``rte_eth_dev_data`` structure
   changed, as described in the `New Features` section.
 
+* **Following datatypes, structure member and function renamed to iova type.**
+
+  * Renamed ``phys_addr_t`` to ``iova_addr_t``.
+  * Renamed ``buf_physaddr`` to ``buf_iovaaddr`` for struct rte_mbuf.
+  * Renamed ``phys_addr`` to ``iova_addr`` for struct rte_memseg.
+  * The Following memory translation api renamed from:
+
+    * ``rte_mempool_populate_phys()``
+    * ``rte_mempool_populate_phys_tab()``
+    * ``rte_eal_using_phys_addrs()``
+    * ``rte_mem_virt2phy()``
+    * ``rte_dump_physmem_layout()``
+    * ``rte_eal_get_physmem_layout()``
+    * ``rte_eal_get_physmem_size()``
+    * ``rte_malloc_virt2phy()``
+    * ``rte_mem_phy2mch()``
+
+  * To the following iova types api:
+
+    * ``rte_mempool_populate_iova()``
+    * ``rte_mempool_populate_iova_tab()``
+    * ``rte_eal_using_iova_addrs()``
+    * ``rte_mem_virt2iova()``
+    * ``rte_dump_iovamem_layout()``
+    * ``rte_eal_get_iovamem_layout()``
+    * ``rte_eal_get_iovamem_size()``
+    * ``rte_malloc_virt2iova()``
+    * ``rte_mem_phy2iova()``
 
 Removed Items
 -------------
-- 
2.14.1

^ permalink raw reply	[relevance 15%]

* Re: [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes
  2017-10-14  0:09  3% [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes Thomas Monjalon
  2017-10-16  8:33  0% ` Yang, Zhiyong
@ 2017-10-18 20:57  0% ` Ferruh Yigit
  2017-10-23 10:13  0%   ` Thomas Monjalon
  2017-10-23 10:15  3% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2017-10-18 20:57 UTC (permalink / raw)
  To: Thomas Monjalon, dev

On 10/13/2017 5:09 PM, Thomas Monjalon wrote:
> The libraries which have their ABI version increased in this release
> must be prepended with a + sign to make them appear clearly.
> 
> Fixes: f8244c6399d9 ("ethdev: increase port id range")
> Fixes: ec51443cc99a ("gso: add Generic Segmentation Offload API framework")
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>

<...>

> +   + librte_pmd_ixgbe.so.2
>       librte_pmd_ring.so.2
>     + librte_pmd_softnic.so.1
>       librte_pmd_vhost.so.2

librte_pmd_vhost.so.2 also requires a "+"

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2 00/18] devargs cleanup
  @ 2017-10-18  8:36  4%     ` Gaëtan Rivet
  0 siblings, 0 replies; 200+ results
From: Gaëtan Rivet @ 2017-10-18  8:36 UTC (permalink / raw)
  To: Aaron Conole; +Cc: dev

On Tue, Oct 17, 2017 at 02:18:02PM -0400, Aaron Conole wrote:
> Gaetan Rivet <gaetan.rivet@6wind.com> writes:
> 
> > The use of rte_devargs is inconsistent in the light of new functionalities
> > such as device hotplug.
> >
> > Most of its API is still experimental and needs stabilization.
> > Older functions were deprecated and need to be rewritten or removed.
> > The rte_devtype is meant to disappear.
> >
> > v2:
> >
> >   Big rework.
> >
> >   * Enact requiring bus name prepended in rte_devargs parsing functions.
> >   * Remove rte_devtype. Use new probe mode setter along with generic
> >     bus reference within rte_devargs.
> >   * Rework devargs parsing API.
> >     The function is now variadic, does not enforce bus rules on the devargs
> >     being inserted as the bus has been configured previously.
> >     Old parsing function is removed.
> >   * Expose bus guessing from device name.
> >     This uses the "parse" bus operator, which may be meant to disappear.
> >     This is optional, but nice to have in a transition period.
> >   * Introduce new --dev generic device declaration parameter.
> >
> > This patchset depends on:
> 
> It is weird to me that you introduce patch sets, and then introduce
> cleanups later?  Shouldn't we revise the existing patchsets?
> 
> Maybe I missed a discussion somewhere?
> 

No discussion missed :)

The way it happened here was that I started cleaning up the mess I did
last release in the rte_devargs to streamline somewhat the subsystem.

Several things needed to disappear:

 1. List of devargs manipulated by buses. With hotplug feature they had
    to be properly managed (i.e. freed on device unplug).

 2. rte_devtype, which was meant to disappear last release but was kept
    to smooth the transition to the new API.

 3. Different usages of devargs_add among applications / PMDs
    There had been some different last release about the exposed API,
    thus I made a compromise that could potentially benefit everyone.

Points 1 and 3 did not require additional work on the buses.
Point 2 however, required a way for buses to be configured in whitelist
/ blacklist mode. To clean up the rte_devtype, a configuration facility
is necessary.

While working on this facility, I found that I was once again breaking
the ABI of rte_bus, along with the IOVA configuration. I thought it
could be streamlined in a more stable way, thus I wrote the separate
patchset for a cleaner integration of these changes in this release.

All in all, the PCI move is not necessary but was sent a few weeks ago
already and it could be skipped with a small rework.

The bus control could be done in a more hackish way as well, without
having a whole separate patchset to introduce the control facility. I
wanted to propose a cleaner approach that could possibly keep the
rte_bus ABI stable for some time.

> > Move PCI away from the EAL
> > http://dpdk.org/ml/archives/dev/2017-August/073512.html
> >
> > Bus control framework
> > http://dpdk.org/ml/archives/dev/2017-October/078752.html
> >
> > Gaetan Rivet (18):
> >   eal: prepend busname on legacy device declaration
> >   eal: remove generic devtype
> >   devargs: introduce iterator
> >   devargs: introduce foreach macro
> >   vdev: do not reference devargs list
> >   bus/pci: do not reference devargs list
> >   test: remove devargs unit tests
> >   devargs: make devargs list private
> >   devargs: make parsing variadic
> >   devargs: require bus name prefix
> >   devargs: simplify implementation
> >   eal: add generic device declaration parameter
> >   bus: make device recognition function public
> >   net/failsafe: keep legacy sub-device declaration
> >   ether: use new devargs parsing function
> >   devargs: remove old devargs parsing function
> >   devargs: use proper prefix
> >   doc: remove devargs deprecation notices
> >
> >  MAINTAINERS                                     |   1 -
> >  app/test-pmd/cmdline.c                          |   2 +-
> >  doc/guides/rel_notes/deprecation.rst            |  13 ---
> >  drivers/bus/pci/pci_common.c                    |  22 +---
> >  drivers/net/failsafe/failsafe_args.c            |  11 +-
> >  examples/bond/main.c                            |   2 +-
> >  lib/librte_eal/bsdapp/eal/rte_eal_version.map   |  15 ++-
> >  lib/librte_eal/common/eal_common_dev.c          |  39 ++-----
> >  lib/librte_eal/common/eal_common_devargs.c      | 129 +++++++++--------------
> >  lib/librte_eal/common/eal_common_options.c      |  47 ++++++---
> >  lib/librte_eal/common/eal_common_vdev.c         |  11 +-
> >  lib/librte_eal/common/eal_options.h             |   2 +
> >  lib/librte_eal/common/include/rte_bus.h         |  12 +++
> >  lib/librte_eal/common/include/rte_dev.h         |   8 --
> >  lib/librte_eal/common/include/rte_devargs.h     | 120 ++++++++--------------
> >  lib/librte_eal/linuxapp/eal/rte_eal_version.map |  15 ++-
> >  lib/librte_ether/rte_ethdev.c                   |  11 +-
> >  test/test/Makefile                              |   1 -
> >  test/test/commands.c                            |   2 +-
> >  test/test/test_devargs.c                        | 131 ------------------------
> >  20 files changed, 186 insertions(+), 408 deletions(-)
> >  delete mode 100644 test/test/test_devargs.c

-- 
Gaëtan Rivet
6WIND

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v1 2/2] event/octeontx: bump library version
  2017-10-16 13:42  3% ` [dpdk-dev] [PATCH v1 2/2] event/octeontx: bump library version Santosh Shukla
@ 2017-10-17  9:50  0%   ` Hemant Agrawal
  2017-10-23 14:38  3%   ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Hemant Agrawal @ 2017-10-17  9:50 UTC (permalink / raw)
  To: Santosh Shukla, dev; +Cc: olivier.matz, thomas, jerin.jacob

On 10/16/2017 7:12 PM, Santosh Shukla wrote:
> This commit bumps the library version to reflect the ABI change
> caused by removing the below function from event/octeontx:
> * octeontx_ssovf_info
> * octeontx_ssovf_bar
> * octeontx_ssovf_mbox_send
>
> And moved to mempool/octeontx area.
>
> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
> ---
>  doc/guides/rel_notes/release_17_11.rst | 1 +
>  drivers/event/octeontx/Makefile        | 2 +-
>  2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
> index 8db35f5e4..eac2f677a 100644
> --- a/doc/guides/rel_notes/release_17_11.rst
> +++ b/doc/guides/rel_notes/release_17_11.rst
> @@ -377,6 +377,7 @@ The libraries prepended with a plus sign were incremented in this version.
>       librte_table.so.2
>       librte_timer.so.1
>       librte_vhost.so.3
> +     librte_pmd_octeontx_ssovf.so.2
>
>
>  Tested Platforms
> diff --git a/drivers/event/octeontx/Makefile b/drivers/event/octeontx/Makefile
> index 50434a384..08fc16775 100644
> --- a/drivers/event/octeontx/Makefile
> +++ b/drivers/event/octeontx/Makefile
> @@ -42,7 +42,7 @@ CFLAGS += -I$(RTE_SDK)/drivers/mempool/octeontx/
>
>  EXPORT_MAP := rte_pmd_octeontx_ssovf_version.map
>
> -LIBABIVER := 1
> +LIBABIVER := 2
>
>  #
>  # all source are stored in SRCS-y
>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v1 2/2] event/octeontx: bump library version
  @ 2017-10-16 13:42  3% ` Santosh Shukla
  2017-10-17  9:50  0%   ` Hemant Agrawal
  2017-10-23 14:38  3%   ` Thomas Monjalon
  0 siblings, 2 replies; 200+ results
From: Santosh Shukla @ 2017-10-16 13:42 UTC (permalink / raw)
  To: dev; +Cc: olivier.matz, thomas, jerin.jacob, hemant.agrawal, Santosh Shukla

This commit bumps the library version to reflect the ABI change
caused by removing the below function from event/octeontx:
* octeontx_ssovf_info
* octeontx_ssovf_bar
* octeontx_ssovf_mbox_send

And moved to mempool/octeontx area.

Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
---
 doc/guides/rel_notes/release_17_11.rst | 1 +
 drivers/event/octeontx/Makefile        | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8db35f5e4..eac2f677a 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -377,6 +377,7 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_table.so.2
      librte_timer.so.1
      librte_vhost.so.3
+     librte_pmd_octeontx_ssovf.so.2
 
 
 Tested Platforms
diff --git a/drivers/event/octeontx/Makefile b/drivers/event/octeontx/Makefile
index 50434a384..08fc16775 100644
--- a/drivers/event/octeontx/Makefile
+++ b/drivers/event/octeontx/Makefile
@@ -42,7 +42,7 @@ CFLAGS += -I$(RTE_SDK)/drivers/mempool/octeontx/
 
 EXPORT_MAP := rte_pmd_octeontx_ssovf_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
-- 
2.13.0

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes
  2017-10-14  0:09  3% [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes Thomas Monjalon
@ 2017-10-16  8:33  0% ` Yang, Zhiyong
  2017-10-18 20:57  0% ` Ferruh Yigit
  2017-10-23 10:15  3% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
  2 siblings, 0 replies; 200+ results
From: Yang, Zhiyong @ 2017-10-16  8:33 UTC (permalink / raw)
  To: Thomas Monjalon, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> Sent: Saturday, October 14, 2017 8:10 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes
> 
> The libraries which have their ABI version increased in this release must be
> prepended with a + sign to make them appear clearly.
> 
> Fixes: f8244c6399d9 ("ethdev: increase port id range")
> Fixes: ec51443cc99a ("gso: add Generic Segmentation Offload API framework")
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---

Acked-by: Zhiyong Yang <zhiyong.yang@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes
@ 2017-10-14  0:09  3% Thomas Monjalon
  2017-10-16  8:33  0% ` Yang, Zhiyong
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Thomas Monjalon @ 2017-10-14  0:09 UTC (permalink / raw)
  To: dev

The libraries which have their ABI version increased in this release
must be prepended with a + sign to make them appear clearly.

Fixes: f8244c6399d9 ("ethdev: increase port id range")
Fixes: ec51443cc99a ("gso: add Generic Segmentation Offload API framework")

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 doc/guides/rel_notes/release_17_11.rst | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8db35f5e4..1235350e9 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -338,16 +338,16 @@ The libraries prepended with a plus sign were incremented in this version.
 .. code-block:: diff
 
      librte_acl.so.2
-     librte_bitratestats.so.2
+   + librte_bitratestats.so.2
      librte_cfgfile.so.2
      librte_cmdline.so.2
      librte_cryptodev.so.3
      librte_distributor.so.1
      librte_eal.so.5
-     librte_ethdev.so.8
-     librte_eventdev.so.3
+   + librte_ethdev.so.8
+   + librte_eventdev.so.3
      librte_gro.so.1
-     librte_gso.so.1
+   + librte_gso.so.1
      librte_hash.so.2
      librte_ip_frag.so.1
      librte_jobstats.so.1
@@ -360,12 +360,12 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_meter.so.1
      librte_metrics.so.1
      librte_net.so.1
-     librte_pdump.so.2
+   + librte_pdump.so.2
      librte_pipeline.so.3
-     librte_pmd_bnxt.so.2
-     librte_pmd_bond.so.2
-     librte_pmd_i40e.so.2
-     librte_pmd_ixgbe.so.2
+   + librte_pmd_bnxt.so.2
+   + librte_pmd_bond.so.2
+   + librte_pmd_i40e.so.2
+   + librte_pmd_ixgbe.so.2
      librte_pmd_ring.so.2
    + librte_pmd_softnic.so.1
      librte_pmd_vhost.so.2
-- 
2.14.1

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2] doc: add note on hardware support deprecation
  2017-09-18 13:59 21% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
@ 2017-10-13 20:46  0%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-13 20:46 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, john.mcnamara

18/09/2017 15:59, Bruce Richardson:
> Following agreement at the DPDK Technical Board meeting [1], the policy
> that hardware support deprecation should be treated as though it were an
> ABI break needs to be documented in the contributors guide.
> 
> [1] http://dpdk.org/ml/archives/dev/2017-September/074613.html
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Acked-by: John McNamara <john.mcnamara@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH V4 3/5] ethdev: add new api for traffic metering and policing
  @ 2017-10-13 12:22  1%   ` Cristian Dumitrescu
  0 siblings, 0 replies; 200+ results
From: Cristian Dumitrescu @ 2017-10-13 12:22 UTC (permalink / raw)
  To: dev
  Cc: thomas, adrien.mazarguil, jingjing.wu, john.mcnamara,
	hemant.agrawal, jerin.jacob, jasvinder.singh

This patch introduces new ethdev generic API for Traffic Metering and
Policing (MTR), which is yet another standard RX offload for Ethernet
devices.

Similar to rte_flow and rte_tm APIs, the configuration of MTR objects is
done in their own namespace (rte_mtr) within the librte_ether library.

Main features:
1. Traffic metering: determine the color for the current packet (green,
   yellow, red) based on history maintained by the MTR object. Supported
   algorithms: srTCM (RFC 2697), trTCM (RFC 2698 and RFC 4115).
2. Policing (per meter output color actions): re-color the packet (keep
   or change the meter output color) or drop the packet.
3. Statistics
4. Capability API

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
Changes in v4:
- Input from Hemant:
	- Added the NONE metering algorithm for meter pass-through mode
	- Reordered stats counter types per pkt and per byte
	- Copyright cosmetics
- Updated ethdev port_id from uint8_t to uint16_t

Changes in v3:
- None

Changes in v2:
- Implemented input from Hemant:
     - Added support for RFC 4115 trTCM algorithm
     - Added support for meter pass-through mode: see API functions
       rte_mtr_meter_enable() and rte_mtr_meter_disable()
- Implemented input from Jerin:
     - Added capability API
- Implemented input from Thomas:
     - Added new API functions under the EXPERIMENTAL section in map file
- Improved the mechanism for MTR object chaining: each MTR object can be
  configured whther to read input color from a previous MTR object in the
  same flow (if any) of from DSCP traslation table
- Improved run-time update functions
- Doxygen: added more descriptions, small fixes

Changes in v1 (from RFC [1]):
- Implemented input from Thomas:
     - Added EXPERIMENTAL tag in rte_mtr.h and MANTAINERS for this new API
- Implemented input from Adrien:
     - Added more Doxygen comments to re-inforce relationship between MTR and
       flow
- Doxygen: added hook in doxy-api-index.md

[1] RFC: http://www.dpdk.org/ml/archives/dev/2017-May/066888.html

 MAINTAINERS                             |   4 +
 doc/api/doxy-api-index.md               |   1 +
 lib/librte_ether/Makefile               |   3 +
 lib/librte_ether/rte_ethdev_version.map |  18 +
 lib/librte_ether/rte_mtr.c              | 229 ++++++++++
 lib/librte_ether/rte_mtr.h              | 730 ++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_mtr_driver.h       | 221 ++++++++++
 7 files changed, 1206 insertions(+)
 create mode 100644 lib/librte_ether/rte_mtr.c
 create mode 100644 lib/librte_ether/rte_mtr.h
 create mode 100644 lib/librte_ether/rte_mtr_driver.h

diff --git a/MAINTAINERS b/MAINTAINERS
index c00d6d8..464ebac 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -255,6 +255,10 @@ M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
 T: git://dpdk.org/next/dpdk-next-tm
 F: lib/librte_ether/rte_tm*
 
+Traffic Metering and Policing API - EXPERIMENTAL
+M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+F: lib/librte_ether/rte_mtr*
+
 Crypto API
 M: Declan Doherty <declan.doherty@intel.com>
 F: lib/librte_cryptodev/
diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index 990815f..07d6f4a 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -41,6 +41,7 @@ The public API headers are grouped by topics:
   [ethctrl]            (@ref rte_eth_ctrl.h),
   [rte_flow]           (@ref rte_flow.h),
   [rte_tm]             (@ref rte_tm.h),
+  [rte_mtr]            (@ref rte_mtr.h),
   [cryptodev]          (@ref rte_cryptodev.h),
   [eventdev]           (@ref rte_eventdev.h),
   [event_eth_rx_adapter]   (@ref rte_event_eth_rx_adapter.h),
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index edcddf7..b2a93bf 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -46,6 +46,7 @@ LIBABIVER := 8
 SRCS-y += rte_ethdev.c
 SRCS-y += rte_flow.c
 SRCS-y += rte_tm.c
+SRCS-y += rte_mtr.c
 SRCS-y += ethdev_profile.c
 
 #
@@ -60,5 +61,7 @@ SYMLINK-y-include += rte_flow.h
 SYMLINK-y-include += rte_flow_driver.h
 SYMLINK-y-include += rte_tm.h
 SYMLINK-y-include += rte_tm_driver.h
+SYMLINK-y-include += rte_mtr.h
+SYMLINK-y-include += rte_mtr_driver.h
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map
index e27f596..bc0bbc5 100644
--- a/lib/librte_ether/rte_ethdev_version.map
+++ b/lib/librte_ether/rte_ethdev_version.map
@@ -196,3 +196,21 @@ DPDK_17.11 {
 	rte_flow_error_set;
 
 } DPDK_17.08;
+
+EXPERIMENTAL {
+	global:
+
+	rte_mtr_capabilities_get;
+	rte_mtr_meter_profile_add;
+	rte_mtr_meter_profile_delete;
+	rte_mtr_create;
+	rte_mtr_destroy;
+	rte_mtr_meter_enable;
+	rte_mtr_meter_disable;
+	rte_mtr_meter_profile_update;
+	rte_mtr_meter_dscp_table_update;
+	rte_mtr_policer_actions_update;
+	rte_mtr_stats_update;
+	rte_mtr_stats_read;
+
+} DPDK_17.11;
diff --git a/lib/librte_ether/rte_mtr.c b/lib/librte_ether/rte_mtr.c
new file mode 100644
index 0000000..4f56f87
--- /dev/null
+++ b/lib/librte_ether/rte_mtr.c
@@ -0,0 +1,229 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdint.h>
+
+#include <rte_errno.h>
+#include "rte_ethdev.h"
+#include "rte_mtr_driver.h"
+#include "rte_mtr.h"
+
+/* Get generic traffic metering & policing operations structure from a port. */
+const struct rte_mtr_ops *
+rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	const struct rte_mtr_ops *ops;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		rte_mtr_error_set(error,
+			ENODEV,
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+			NULL,
+			rte_strerror(ENODEV));
+		return NULL;
+	}
+
+	if ((dev->dev_ops->mtr_ops_get == NULL) ||
+		(dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
+		(ops == NULL)) {
+		rte_mtr_error_set(error,
+			ENOSYS,
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+			NULL,
+			rte_strerror(ENOSYS));
+		return NULL;
+	}
+
+	return ops;
+}
+
+#define RTE_MTR_FUNC(port_id, func)			\
+({							\
+	const struct rte_mtr_ops *ops =			\
+		rte_mtr_ops_get(port_id, error);		\
+	if (ops == NULL)					\
+		return -rte_errno;			\
+							\
+	if (ops->func == NULL)				\
+		return -rte_mtr_error_set(error,		\
+			ENOSYS,				\
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,	\
+			NULL,				\
+			rte_strerror(ENOSYS));		\
+							\
+	ops->func;					\
+})
+
+/* MTR capabilities get */
+int
+rte_mtr_capabilities_get(uint16_t port_id,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
+		cap, error);
+}
+
+/* MTR meter profile add */
+int
+rte_mtr_meter_profile_add(uint16_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
+		meter_profile_id, profile, error);
+}
+
+/** MTR meter profile delete */
+int
+rte_mtr_meter_profile_delete(uint16_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
+		meter_profile_id, error);
+}
+
+/** MTR object create */
+int
+rte_mtr_create(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, create)(dev,
+		mtr_id, params, shared, error);
+}
+
+/** MTR object destroy */
+int
+rte_mtr_destroy(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, destroy)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter enable */
+int
+rte_mtr_meter_enable(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_enable)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter disable */
+int
+rte_mtr_meter_disable(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_disable)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter profile update */
+int
+rte_mtr_meter_profile_update(uint16_t port_id,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
+		mtr_id, meter_profile_id, error);
+}
+
+/** MTR object meter DSCP table update */
+int
+rte_mtr_meter_dscp_table_update(uint16_t port_id,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
+		mtr_id, dscp_table, error);
+}
+
+/** MTR object policer action update */
+int
+rte_mtr_policer_actions_update(uint16_t port_id,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, policer_actions_update)(dev,
+		mtr_id, action_mask, actions, error);
+}
+
+/** MTR object enabled stats update */
+int
+rte_mtr_stats_update(uint16_t port_id,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, stats_update)(dev,
+		mtr_id, stats_mask, error);
+}
+
+/** MTR object stats read */
+int
+rte_mtr_stats_read(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, stats_read)(dev,
+		mtr_id, stats, stats_mask, clear, error);
+}
diff --git a/lib/librte_ether/rte_mtr.h b/lib/librte_ether/rte_mtr.h
new file mode 100644
index 0000000..f6b6ef3
--- /dev/null
+++ b/lib/librte_ether/rte_mtr.h
@@ -0,0 +1,730 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright 2017 Intel Corporation
+ *   Copyright 2017 NXP
+ *   Copyright 2017 Cavium
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INCLUDE_RTE_MTR_H__
+#define __INCLUDE_RTE_MTR_H__
+
+/**
+ * @file
+ * RTE Generic Traffic Metering and Policing API
+ *
+ * This interface provides the ability to configure the traffic metering and
+ * policing (MTR) in a generic way.
+ *
+ * The processing done for each input packet hitting a MTR object is:
+ *    A) Traffic metering: The packet is assigned a color (the meter output
+ *       color), based on the previous history of the flow reflected in the
+ *       current state of the MTR object, according to the specific traffic
+ *       metering algorithm. The traffic metering algorithm can typically work
+ *       in color aware mode, in which case the input packet already has an
+ *       initial color (the input color), or in color blind mode, which is
+ *       equivalent to considering all input packets initially colored as green.
+ *    B) Policing: There is a separate policer action configured for each meter
+ *       output color, which can:
+ *          a) Drop the packet.
+ *          b) Keep the same packet color: the policer output color matches the
+ *             meter output color (essentially a no-op action).
+ *          c) Recolor the packet: the policer output color is different than
+ *             the meter output color.
+ *       The policer output color is the output color of the packet, which is
+ *       set in the packet meta-data (i.e. struct rte_mbuf::sched::color).
+ *    C) Statistics: The set of counters maintained for each MTR object is
+ *       configurable and subject to the implementation support. This set
+ *       includes the number of packets and bytes dropped or passed for each
+ *       output color.
+ *
+ * Once successfully created, an MTR object is linked to one or several flows
+ * through the meter action of the flow API.
+ *    A) Whether an MTR object is private to a flow or potentially shared by
+ *       several flows has to be specified at creation time.
+ *    B) Several meter actions can be potentially registered for the same flow.
+ *
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ */
+#include <stdint.h>
+
+#include <rte_common.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Color
+ */
+enum rte_mtr_color {
+	RTE_MTR_GREEN = 0, /**< Green */
+	RTE_MTR_YELLOW, /**< Yellow */
+	RTE_MTR_RED, /**< Red */
+	RTE_MTR_COLORS /**< Number of colors. */
+};
+
+/**
+ * Statistics counter type
+ */
+enum rte_mtr_stats_type {
+	/** Number of packets passed as green by the policer. */
+	RTE_MTR_STATS_N_PKTS_GREEN = 1 << 0,
+
+	/** Number of packets passed as yellow by the policer. */
+	RTE_MTR_STATS_N_PKTS_YELLOW = 1 << 1,
+
+	/** Number of packets passed as red by the policer. */
+	RTE_MTR_STATS_N_PKTS_RED = 1 << 2,
+
+	/** Number of packets dropped by the policer. */
+	RTE_MTR_STATS_N_PKTS_DROPPED = 1 << 3,
+
+	/** Number of bytes passed as green by the policer. */
+	RTE_MTR_STATS_N_BYTES_GREEN = 1 << 4,
+
+	/** Number of bytes passed as yellow by the policer. */
+	RTE_MTR_STATS_N_BYTES_YELLOW = 1 << 5,
+
+	/** Number of bytes passed as red by the policer. */
+	RTE_MTR_STATS_N_BYTES_RED = 1 << 6,
+
+	/** Number of bytes dropped by the policer. */
+	RTE_MTR_STATS_N_BYTES_DROPPED = 1 << 7,
+};
+
+/**
+ * Statistics counters
+ */
+struct rte_mtr_stats {
+	/** Number of packets passed by the policer (per color). */
+	uint64_t n_pkts[RTE_MTR_COLORS];
+
+	/** Number of bytes passed by the policer (per color). */
+	uint64_t n_bytes[RTE_MTR_COLORS];
+
+	/** Number of packets dropped by the policer. */
+	uint64_t n_pkts_dropped;
+
+	/** Number of bytes passed by the policer. */
+	uint64_t n_bytes_dropped;
+};
+
+/**
+ * Traffic metering algorithms
+ */
+enum rte_mtr_algorithm {
+	/** No traffic metering performed, the output color is the same as the
+	 * input color for every input packet. The meter of the MTR object is
+	 * working in pass-through mode, having same effect as meter disable.
+	 * @see rte_mtr_meter_disable()
+	 */
+	RTE_MTR_NONE = 0,
+
+	/** Single Rate Three Color Marker (srTCM) - IETF RFC 2697. */
+	RTE_MTR_SRTCM_RFC2697,
+
+	/** Two Rate Three Color Marker (trTCM) - IETF RFC 2698. */
+	RTE_MTR_TRTCM_RFC2698,
+
+	/** Two Rate Three Color Marker (trTCM) - IETF RFC 4115. */
+	RTE_MTR_TRTCM_RFC4115,
+};
+
+/**
+ * Meter profile
+ */
+struct rte_mtr_meter_profile {
+	/** Traffic metering algorithm. */
+	enum rte_mtr_algorithm alg;
+
+	RTE_STD_C11
+	union {
+		/** Items only valid when *alg* is set to srTCM - RFC 2697. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Committed Burst Size (CBS) (bytes). */
+			uint64_t cbs;
+
+			/** Excess Burst Size (EBS) (bytes). */
+			uint64_t ebs;
+		} srtcm_rfc2697;
+
+		/** Items only valid when *alg* is set to trTCM - RFC 2698. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Peak Information Rate (PIR) (bytes/second). */
+			uint64_t pir;
+
+			/** Committed Burst Size (CBS) (byes). */
+			uint64_t cbs;
+
+			/** Peak Burst Size (PBS) (bytes). */
+			uint64_t pbs;
+		} trtcm_rfc2698;
+
+		/** Items only valid when *alg* is set to trTCM - RFC 4115. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Excess Information Rate (EIR) (bytes/second). */
+			uint64_t eir;
+
+			/** Committed Burst Size (CBS) (byes). */
+			uint64_t cbs;
+
+			/** Excess Burst Size (EBS) (bytes). */
+			uint64_t ebs;
+		} trtcm_rfc4115;
+	};
+};
+
+/**
+ * Policer actions
+ */
+enum rte_mtr_policer_action {
+	/** Recolor the packet as green. */
+	MTR_POLICER_ACTION_COLOR_GREEN = 0,
+
+	/** Recolor the packet as yellow. */
+	MTR_POLICER_ACTION_COLOR_YELLOW,
+
+	/** Recolor the packet as red. */
+	MTR_POLICER_ACTION_COLOR_RED,
+
+	/** Drop the packet. */
+	MTR_POLICER_ACTION_DROP,
+};
+
+/**
+ * Parameters for each traffic metering & policing object
+ *
+ * @see enum rte_mtr_stats_type
+ */
+struct rte_mtr_params {
+	/** Meter profile ID. */
+	uint32_t meter_profile_id;
+
+	/** Meter input color in case of MTR object chaining. When non-zero: if
+	 * a previous MTR object is enabled in the same flow, then the color
+	 * determined by the latest MTR object in the same flow is used as the
+	 * input color by the current MTR object, otherwise the current MTR
+	 * object uses the *dscp_table* to determine the input color. When zero:
+	 * the color determined by any previous MTR object in same flow is
+	 * ignored by the current MTR object, which uses the *dscp_table* to
+	 * determine the input color.
+	 */
+	int use_prev_mtr_color;
+
+	/** Meter input color. When non-NULL: it points to a pre-allocated and
+	 * pre-populated table with exactly 64 elements providing the input
+	 * color for each value of the IPv4/IPv6 Differentiated Services Code
+	 * Point (DSCP) input packet field. When NULL: it is equivalent to
+	 * setting this parameter to an all-green populated table (i.e. table
+	 * with all the 64 elements set to green color). The color blind mode
+	 * is configured by setting *use_prev_mtr_color* to 0 and *dscp_table*
+	 * to either NULL or to an all-green populated table. When
+	 * *use_prev_mtr_color* is non-zero value or when *dscp_table* contains
+	 * at least one yellow or red color element, then the color aware mode
+	 * is configured.
+	 */
+	enum rte_mtr_color *dscp_table;
+
+	/** Non-zero to enable the meter, zero to disable the meter at the time
+	 * of MTR object creation. Ignored when the meter profile indicated by
+	 * *meter_profile_id* is set to NONE.
+	 * @see rte_mtr_meter_disable()
+	 */
+	int meter_enable;
+
+	/** Policer actions (per meter output color). */
+	enum rte_mtr_policer_action action[RTE_MTR_COLORS];
+
+	/** Set of stats counters to be enabled.
+	 * @see enum rte_mtr_stats_type
+	 */
+	uint64_t stats_mask;
+};
+
+/**
+ * MTR capabilities
+ */
+struct rte_mtr_capabilities {
+	/** Maximum number of MTR objects. */
+	uint32_t n_max;
+
+	/** Maximum number of MTR objects that can be shared by multiple flows.
+	 * The value of zero indicates that shared MTR objects are not
+	 * supported. The maximum value is *n_max*.
+	 */
+	uint32_t n_shared_max;
+
+	/** When non-zero, this flag indicates that all the MTR objects that
+	 * cannot be shared by multiple flows have identical capability set.
+	 */
+	int identical;
+
+	/** When non-zero, this flag indicates that all the MTR objects that
+	 * can be shared by multiple flows have identical capability set.
+	 */
+	int shared_identical;
+
+	/** Maximum number of flows that can share the same MTR object. The
+	 * value of zero is invalid. The value of 1 means that shared MTR
+	 * objects not supported.
+	 */
+	uint32_t shared_n_flows_per_mtr_max;
+
+	/** Maximum number of MTR objects that can be part of the same flow. The
+	 * value of zero is invalid. The value of 1 indicates that MTR object
+	 * chaining is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t chaining_n_mtrs_per_flow_max;
+
+	/**
+	 * When non-zero, it indicates that the packet color identified by one
+	 * MTR object can be used as the packet input color by any subsequent
+	 * MTR object from the same flow. When zero, it indicates that the color
+	 * determined by one MTR object is always ignored by any subsequent MTR
+	 * object from the same flow. Only valid when MTR chaining is supported,
+	 * i.e. *chaining_n_mtrs_per_flow_max* is greater than 1. When non-zero,
+	 * it also means that the color aware mode is supported by at least one
+	 * metering algorithm.
+	 */
+	int chaining_use_prev_mtr_color_supported;
+
+	/**
+	 * When non-zero, it indicates that the packet color identified by one
+	 * MTR object is always used as the packet input color by any subsequent
+	 * MTR object that is part of the same flow. When zero, it indicates
+	 * that whether the color determined by one MTR object is either ignored
+	 * or used as the packet input color by any subsequent MTR object from
+	 * the same flow is individually configurable for each MTR object. Only
+	 * valid when *chaining_use_prev_mtr_color_supported* is non-zero.
+	 */
+	int chaining_use_prev_mtr_color_enforced;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the srTCM RFC 2697 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_srtcm_rfc2697_n_max;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the trTCM RFC 2698 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_trtcm_rfc2698_n_max;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the trTCM RFC 4115 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_trtcm_rfc4115_n_max;
+
+	/** Maximum traffic rate that can be metered by a single MTR object. For
+	 * srTCM RFC 2697, this is the maximum CIR rate. For trTCM RFC 2698,
+	 * this is the maximum PIR rate. For trTCM RFC 4115, this is the maximum
+	 * value for the sum of PIR and EIR rates.
+	 */
+	uint64_t meter_rate_max;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the srTCM RFC 2697 metering algorithm.
+	 */
+	int color_aware_srtcm_rfc2697_supported;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the trTCM RFC 2698 metering algorithm.
+	 */
+	int color_aware_trtcm_rfc2698_supported;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the trTCM RFC 4115 metering algorithm.
+	 */
+	int color_aware_trtcm_rfc4115_supported;
+
+	/** When non-zero, it indicates that the policer packet recolor actions
+	 * are supported.
+	 * @see enum rte_mtr_policer_action
+	 */
+	int policer_action_recolor_supported;
+
+	/** When non-zero, it indicates that the policer packet drop action is
+	 * supported.
+	 * @see enum rte_mtr_policer_action
+	 */
+	int policer_action_drop_supported;
+
+	/** Set of supported statistics counter types.
+	 * @see enum rte_mtr_stats_type
+	 */
+	uint64_t stats_mask;
+};
+
+/**
+ * Verbose error types.
+ *
+ * Most of them provide the type of the object referenced by struct
+ * rte_mtr_error::cause.
+ */
+enum rte_mtr_error_type {
+	RTE_MTR_ERROR_TYPE_NONE, /**< No error. */
+	RTE_MTR_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */
+	RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+	RTE_MTR_ERROR_TYPE_METER_PROFILE,
+	RTE_MTR_ERROR_TYPE_MTR_ID,
+	RTE_MTR_ERROR_TYPE_MTR_PARAMS,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_GREEN,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_YELLOW,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_RED,
+	RTE_MTR_ERROR_TYPE_STATS_MASK,
+	RTE_MTR_ERROR_TYPE_STATS,
+	RTE_MTR_ERROR_TYPE_SHARED,
+};
+
+/**
+ * Verbose error structure definition.
+ *
+ * This object is normally allocated by applications and set by PMDs, the
+ * message points to a constant string which does not need to be freed by
+ * the application, however its pointer can be considered valid only as long
+ * as its associated DPDK port remains configured. Closing the underlying
+ * device or unloading the PMD invalidates it.
+ *
+ * Both cause and message may be NULL regardless of the error type.
+ */
+struct rte_mtr_error {
+	enum rte_mtr_error_type type; /**< Cause field and error type. */
+	const void *cause; /**< Object responsible for the error. */
+	const char *message; /**< Human-readable error message. */
+};
+
+/**
+ * MTR capabilities get
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[out] cap
+ *   MTR capabilities. Needs to be pre-allocated and valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_capabilities_get(uint16_t port_id,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error);
+
+/**
+ * Meter profile add
+ *
+ * Create a new meter profile with ID set to *meter_profile_id*. The new profile
+ * is used to create one or several MTR objects.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] meter_profile_id
+ *   ID for the new meter profile. Needs to be unused by any of the existing
+ *   meter profiles added for the current port.
+ * @param[in] profile
+ *   Meter profile parameters. Needs to be pre-allocated and valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_add(uint16_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error);
+
+/**
+ * Meter profile delete
+ *
+ * Delete an existing meter profile. This operation fails when there is
+ * currently at least one user (i.e. MTR object) of this profile.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] meter_profile_id
+ *   Meter profile ID. Needs to be the valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_delete(uint16_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object create
+ *
+ * Create a new MTR object for the current port. This object is run as part of
+ * associated flow action for traffic metering and policing.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be unused by any of the existing MTR objects.
+ *   created for the current port.
+ * @param[in] params
+ *   MTR object params. Needs to be pre-allocated and valid.
+ * @param[in] shared
+ *   Non-zero when this MTR object can be shared by multiple flows, zero when
+ *   this MTR object can be used by a single flow.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_flow_action_type::RTE_FLOW_ACTION_TYPE_METER
+ */
+int
+rte_mtr_create(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object destroy
+ *
+ * Delete an existing MTR object. This operation fails when there is currently
+ * at least one user (i.e. flow) of this MTR object.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ *   created for the current port.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_destroy(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter disable
+ *
+ * Disable the meter of an existing MTR object. In disabled state, the meter of
+ * the current MTR object works in pass-through mode, meaning that for each
+ * input packet the meter output color is always the same as the input color. In
+ * particular, when the meter of the current MTR object is configured in color
+ * blind mode, the input color is always green, so the meter output color is
+ * also always green. Note that the policer and the statistics of the current
+ * MTR object are working as usual while the meter is disabled. No action is
+ * taken and this function returns successfully when the meter of the current
+ * MTR object is already disabled.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_disable(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter enable
+ *
+ * Enable the meter of an existing MTR object. If the MTR object has its meter
+ * already enabled, then no action is taken and this function returns
+ * successfully.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_enable(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter profile update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] meter_profile_id
+ *   Meter profile ID for the current MTR object. Needs to be valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_update(uint16_t port_id,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object DSCP table update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] dscp_table
+ *   When non-NULL: it points to a pre-allocated and pre-populated table with
+ *   exactly 64 elements providing the input color for each value of the
+ *   IPv4/IPv6 Differentiated Services Code Point (DSCP) input packet field.
+ *   When NULL: it is equivalent to setting this parameter to an “all-green”
+ *   populated table (i.e. table with all the 64 elements set to green color).
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_dscp_table_update(uint16_t port_id,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object policer actions update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] action_mask
+ *   Bit mask indicating which policer actions need to be updated. One or more
+ *   policer actions can be updated in a single function invocation. To update
+ *   the policer action associated with color C, bit (1 << C) needs to be set in
+ *   *action_mask* and element at position C in the *actions* array needs to be
+ *   valid.
+ * @param[in] actions
+ *   Pre-allocated and pre-populated array of policer actions.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_policer_actions_update(uint16_t port_id,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object enabled statistics counters update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] stats_mask
+ *   Mask of statistics counter types to be enabled for the current MTR object.
+ *   Any statistics counter type not included in this set is to be disabled for
+ *   the current MTR object.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_mtr_stats_type
+ */
+int
+rte_mtr_stats_update(uint16_t port_id,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object statistics counters read
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[out] stats
+ *   When non-NULL, it contains the current value for the statistics counters
+ *   enabled for the current MTR object.
+ * @param[out] stats_mask
+ *   When non-NULL, it contains the mask of statistics counter types that are
+ *   currently enabled for this MTR object, indicating which of the counters
+ *   retrieved with the *stats* structure are valid.
+ * @param[in] clear
+ *   When this parameter has a non-zero value, the statistics counters are
+ *   cleared (i.e. set to zero) immediately after they have been read,
+ *   otherwise the statistics counters are left untouched.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_mtr_stats_type
+ */
+int
+rte_mtr_stats_read(uint16_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_RTE_MTR_H__ */
diff --git a/lib/librte_ether/rte_mtr_driver.h b/lib/librte_ether/rte_mtr_driver.h
new file mode 100644
index 0000000..6a289ef
--- /dev/null
+++ b/lib/librte_ether/rte_mtr_driver.h
@@ -0,0 +1,221 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INCLUDE_RTE_MTR_DRIVER_H__
+#define __INCLUDE_RTE_MTR_DRIVER_H__
+
+/**
+ * @file
+ * RTE Generic Traffic Metering and Policing API (Driver Side)
+ *
+ * This file provides implementation helpers for internal use by PMDs, they
+ * are not intended to be exposed to applications and are not subject to ABI
+ * versioning.
+ */
+
+#include <stdint.h>
+
+#include <rte_errno.h>
+#include "rte_ethdev.h"
+#include "rte_mtr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int (*rte_mtr_capabilities_get_t)(struct rte_eth_dev *dev,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error);
+/**< @internal MTR capabilities get */
+
+typedef int (*rte_mtr_meter_profile_add_t)(struct rte_eth_dev *dev,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error);
+/**< @internal MTR meter profile add */
+
+typedef int (*rte_mtr_meter_profile_delete_t)(struct rte_eth_dev *dev,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR meter profile delete */
+
+typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error);
+/**< @internal MTR object create */
+
+typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object destroy */
+
+typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter enable */
+
+typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter disable */
+
+typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter profile update */
+
+typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter DSCP table update */
+
+typedef int (*rte_mtr_policer_actions_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error);
+/**< @internal MTR object policer action update*/
+
+typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error);
+/**< @internal MTR object enabled stats update */
+
+typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error);
+/**< @internal MTR object stats read */
+
+struct rte_mtr_ops {
+	/** MTR capabilities get */
+	rte_mtr_capabilities_get_t capabilities_get;
+
+	/** MTR meter profile add */
+	rte_mtr_meter_profile_add_t meter_profile_add;
+
+	/** MTR meter profile delete */
+	rte_mtr_meter_profile_delete_t meter_profile_delete;
+
+	/** MTR object create */
+	rte_mtr_create_t create;
+
+	/** MTR object destroy */
+	rte_mtr_destroy_t destroy;
+
+	/** MTR object meter enable */
+	rte_mtr_meter_enable_t meter_enable;
+
+	/** MTR object meter disable */
+	rte_mtr_meter_disable_t meter_disable;
+
+	/** MTR object meter profile update */
+	rte_mtr_meter_profile_update_t meter_profile_update;
+
+	/** MTR object meter DSCP table update */
+	rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
+
+	/** MTR object policer action update */
+	rte_mtr_policer_actions_update_t policer_actions_update;
+
+	/** MTR object enabled stats update */
+	rte_mtr_stats_update_t stats_update;
+
+	/** MTR object stats read */
+	rte_mtr_stats_read_t stats_read;
+};
+
+/**
+ * Initialize generic error structure.
+ *
+ * This function also sets rte_errno to a given value.
+ *
+ * @param[out] error
+ *   Pointer to error structure (may be NULL).
+ * @param[in] code
+ *   Related error code (rte_errno).
+ * @param[in] type
+ *   Cause field and error type.
+ * @param[in] cause
+ *   Object responsible for the error.
+ * @param[in] message
+ *   Human-readable error message.
+ *
+ * @return
+ *   Error code.
+ */
+static inline int
+rte_mtr_error_set(struct rte_mtr_error *error,
+		   int code,
+		   enum rte_mtr_error_type type,
+		   const void *cause,
+		   const char *message)
+{
+	if (error) {
+		*error = (struct rte_mtr_error){
+			.type = type,
+			.cause = cause,
+			.message = message,
+		};
+	}
+	rte_errno = code;
+	return code;
+}
+
+/**
+ * Get generic traffic metering and policing operations structure from a port
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[out] error
+ *   Error details
+ *
+ * @return
+ *   The traffic metering and policing operations structure associated with
+ *   port_id on success, NULL otherwise.
+ */
+const struct rte_mtr_ops *
+rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */
-- 
2.7.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v7 1/4] cryptodev: remove crypto vdev init API
  @ 2017-10-13 11:51  4%   ` Jianfeng Tan
  2017-10-23 10:06  3%     ` De Lara Guarch, Pablo
  0 siblings, 1 reply; 200+ results
From: Jianfeng Tan @ 2017-10-13 11:51 UTC (permalink / raw)
  To: dev
  Cc: jblunck, bruce.richardson, konstantin.ananyev,
	pablo.de.lara.guarch, thomas, yliu, maxime.coquelin, mtetsuyah,
	ferruh.yigit, Jianfeng Tan

Remove rte_cryptodev_create_vdev() for duplication.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 doc/guides/rel_notes/deprecation.rst           |  5 -----
 doc/guides/rel_notes/release_17_11.rst         |  2 ++
 lib/librte_cryptodev/Makefile                  |  2 +-
 lib/librte_cryptodev/rte_cryptodev.c           |  6 ------
 lib/librte_cryptodev/rte_cryptodev.h           | 17 -----------------
 lib/librte_cryptodev/rte_cryptodev_version.map |  1 -
 6 files changed, 3 insertions(+), 30 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index f4269f0..85a9287 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -78,11 +78,6 @@ Deprecation Notices
   ``rte_cryptodev`` respectively to support security protocol offloaded
   operations.
 
-* cryptodev: the following function is deprecated starting from 17.08 and will
-  be removed in 17.11:
-
-  - ``rte_cryptodev_create_vdev``
-
 * cryptodev: the following function will be static in 17.11 and included
   by all crypto drivers, therefore, will not be public:
 
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 6a75ae0..6b405af 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -183,6 +183,8 @@ API Changes
 * ``rte_mem_phy2mch`` was used in Xen dom0 to obtain the physical address;
   remove this API as Xen dom0 support was removed.
 
+* ``rte_cryptodev_create_vdev`` was removed to avoid the dependency on vdev
+  in librte_cryptodev; instead, users can call rte_vdev_init() directly.
 
 ABI Changes
 -----------
diff --git a/lib/librte_cryptodev/Makefile b/lib/librte_cryptodev/Makefile
index 59d9a4e..47f466d 100644
--- a/lib/librte_cryptodev/Makefile
+++ b/lib/librte_cryptodev/Makefile
@@ -34,7 +34,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
 LIB = librte_cryptodev.a
 
 # library version
-LIBABIVER := 3
+LIBABIVER := 4
 
 # build flags
 CFLAGS += -O3
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index 5e8f7f4..f2c55cc 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -377,12 +377,6 @@ rte_cryptodev_get_feature_name(uint64_t flag)
 	}
 }
 
-int
-rte_cryptodev_create_vdev(const char *name, const char *args)
-{
-	return rte_vdev_init(name, args);
-}
-
 struct rte_cryptodev *
 rte_cryptodev_pmd_get_dev(uint8_t dev_id)
 {
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index ad97ff9..c5d6939 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -433,23 +433,6 @@ struct rte_cryptodev_stats {
 /**< Max length of name of crypto PMD */
 
 /**
- * @deprecated
- *
- * Create a virtual crypto device
- *
- * @param	name	Cryptodev PMD name of device to be created.
- * @param	args	Options arguments for device.
- *
- * @return
- * - On successful creation of the cryptodev the device index is returned,
- *   which will be between 0 and rte_cryptodev_count().
- * - In the case of a failure, returns -1.
- */
-__rte_deprecated
-extern int
-rte_cryptodev_create_vdev(const char *name, const char *args);
-
-/**
  * Get the device identifier for the named crypto device.
  *
  * @param	name	device name to select the device structure.
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index abdbbda..b07f4ca 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -7,7 +7,6 @@ DPDK_16.04 {
 	rte_cryptodev_close;
 	rte_cryptodev_count;
 	rte_cryptodev_configure;
-	rte_cryptodev_create_vdev;
 	rte_cryptodev_get_dev_id;
 	rte_cryptodev_get_feature_name;
 	rte_cryptodev_info_get;
-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v1 1/7] ethdev: expose flow API error helper
  2017-10-11 19:05  5%       ` Aaron Conole
  2017-10-12 13:37  4%         ` Neil Horman
@ 2017-10-12 14:02  5%         ` Adrien Mazarguil
  1 sibling, 0 replies; 200+ results
From: Adrien Mazarguil @ 2017-10-12 14:02 UTC (permalink / raw)
  To: Aaron Conole
  Cc: Thomas Monjalon, dev, Ferruh Yigit, Gaetan Rivet, fbl, Neil Horman

On Wed, Oct 11, 2017 at 03:05:47PM -0400, Aaron Conole wrote:
> Adrien Mazarguil <adrien.mazarguil@6wind.com> writes:
> 
> > On Wed, Oct 11, 2017 at 11:23:12AM +0200, Thomas Monjalon wrote:
> >> 05/10/2017 11:49, Adrien Mazarguil:
> >> > rte_flow_error_set() is a convenient helper to initialize error objects.
> >> > 
> >> > Since there is no fundamental reason to prevent applications from using it,
> >> > expose it through the public interface after modifying its return value
> >> > from positive to negative. This is done for consistency with the rest of
> >> > the public interface.
> >> > 
> >> > Documentation is updated accordingly.
> >> > 
> >> > Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
> >> > ---
> >> > --- a/lib/librte_ether/rte_flow.h
> >> > +++ b/lib/librte_ether/rte_flow.h
> >> >  /**
> >> > + * Initialize flow error structure.
> >> > + *
> >> > + * @param[out] error
> >> > + *   Pointer to flow error structure (may be NULL).
> >> > + * @param code
> >> > + *   Related error code (rte_errno).
> >> > + * @param type
> >> > + *   Cause field and error types.
> >> > + * @param cause
> >> > + *   Object responsible for the error.
> >> > + * @param message
> >> > + *   Human-readable error message.
> >> > + *
> >> > + * @return
> >> > + *   Negative error code (errno value) and rte_errno is set.
> >> > + */
> >> > +static inline int
> >> > +rte_flow_error_set(struct rte_flow_error *error,
> >> > +		   int code,
> >> > +		   enum rte_flow_error_type type,
> >> > +		   const void *cause,
> >> > +		   const char *message)
> >> 
> >> When calling this function, the performance is not critical.
> >> So it must not be an inline function.
> >> Please move it to the .c file and add it to the .map file.
> >
> > I'll do it as part of moving this patch into my upcoming series for mlx4,
> > since it relies on the new return value.
> >
> > Now for the record, I believe that static inlines, particularly short ones
> > that are not expected to be modified any time soon (provided they are
> > defined properly that is) are harmless.
> >
> > Yes, that means modifying them, depending on what they do, may cause a
> > global ABI breakage of the underlying library which translates to a major
> > version bump, however exactly the same applies to some macros (in particular
> > the *_MAX ones), structure and other type definitions and so on.
> 
> Sure.  I think if it's small and there's never a chance for it to
> change, then it's okay.  But, as you point out - they are similar to
> macros in that they are code directly added to the application.  There
> is never a way to fix a bug or adjust some semantic behavior without
> requiring a recompile.  That's a strong kind of binding.  Certainly we
> would want that communicated as ABI, regardless of which .h/.c file the
> function exists, yes?

Yes, I entirely agree, I must admit the stated reasons behind my previous
message weren't super clear to begin with as I wrote it after some off-list
discussion.

My point is that static inlines must not be considered harmful for what they
are particularly in a project like DPDK where there is almost always a
performance trade-off depending on the use case. They must be considered on
a case basis, and not be forbidden outright with no possible discussion.

> > What I'm getting at is, making this function part of the .map file won't
> > help all that much with the goal of reaching a stable ABI. Making it a
> > normal function on the other hand successfully prevents PMDs and
> > applications from considering its use in their data plane (flow rules
> > management from the data plane is likely the next step for rte_flow).
> 
> I don't understand this point well.  There are two things - committing
> to a stable ABI, and communicating information about that ABI.  Having
> .map files doesn't do anything for a stable ABI.  It merely
> communicates information.  The stability must come from the developer
> community and maintainers.

Right, nothing against that. I was referring to the fact the .map file in
the case of a shared libray helps with ABI breakage by providing a kind of
run-time error check that ensures an application compiled against an older
version of a symbol is prevented from starting at all, thereby avoiding any
adverse effects later on.

However to benefit from that, some sort of symbol is necessary and that's
only possible on non-inline functions. Since we agree that this, in itself,
doesn't guarantee ABI stability due to other mandatory factors, I think it
cannot be the only ammunition to use against inline functions. Everything
must be considered.

> > In my opinion, performance (even if hypothetical) matters more than ABI
> > stability, particularly since the current pattern is for the whole ABI to be
> > broken every other release. I think that with DPDK, ABI stability can only
> > be properly guaranteed in stable/maintenance releases but that effort is
> > vain in the master branch, affected by way too many changes for it to ever
> > become reality. This doesn't mean we shouldn't even try, however we
> > shouldn't restrict ourselves; when the ABI needs to be broken, so be it.
> 
> First, performance isn't hypothetical.  You have code which performs,
> and have measured various metrics to show this, or you don't have data.
> No voodoo required.  Hypothetical isn't even an argument when it comes
> to predictable devices (like computers).  In the case above, you have a
> non-performance critical function.  It's an error function.  It passes
> strings around.  Performance cannot be a consideration here.
> 
> Second, it depends on where you want to view the boundary.  If a change is
> internal to DPDK (meaning, the application is never expected to interact
> with that area of code), then it shouldn't be part of ABI and changing
> it to your hearts content should be fine.

For the specific case of this function, it basically initializes a
structure. Now that's probably just me, but I believe initializers are a
nice thing to have inline so the compiler can optimize them away wherever it
thinks it's worth a few CPU cycles, somewhat like optimized memcpy's (that
was the possible performance gain I was thinking about).

This function should only change if the target structure changes, the ABI
breakage requiring the major ABI version bump in that case comes from the
structure change, not from the inline function itself.

You have a point with the fact the main change from the original code is the
return value sign update due to bad design. Had it been non-inline, only the
resulting symbol version would have changed, not that of the entire ABI.

Fortunately for this specific case again, that function was neither
versioned nor part of the public facing API until this commit. It would have
been an entirely different story otherwise.

> *rant-on*
> 
> I see lots of projects which use DPDK, but I only know of three or so
> projects which don't directly embed a copy of the DPDK source
> tree.  I think this is a side effect of not having a stable ABI - it's
> not possible to rely on easily upgrading the library, so people just
> pick a version and never upgrade.  That's bad for everyone.  It results
> in fewer contributions, and difficulty getting people to participate.
> There's too much text like "Install DPDK 1.8.0. With other versions is
> not guaranted it works properly" that is embedded in downstream users
> (that comes from an actual project README).  Even at DPDK summit in
> Dublin, one of the most vocal opponents to ABI stability admitted that
> his company takes the code and never contributes it back.  That is
> really not friendly.

I believe all the remaining "bare metal" handling code has been removed by
now, however the fact DPDK started as a framework to embed applications and
not as a shared library to link them against surely didn't help. There's a
lot of design leftovers from this era, such as EAL still snatching argv.

> This even has a different side effect - one of market penetration.  It's
> difficult for distributions to support this model.  So, there will be
> one or two packages they might pick up, with one or two versions.
> Everything else is "roll your own."  And when it's more difficult than
> 'apt-get|yum|dnf|foo install' then users don't use it, and the cycle
> continues.
> 
> I'll point out that I can take a number of compiled binaries from 20
> years ago[0], and run on a modern kernel.  I wish I could take a
> binary linked to DPDK from 5 months ago, and run it with today's DPDK.
> I believe that *should* be the goal.  I am confident it's achievable.
> But, I recognize it's hard and requires extra effort.

I do understand your points and the reasons behind them. My goal and the way
I see things as a PMD developer are likely why we're having this discussion,
so I'd like to summarize why the topic came up on my side:

- DPDK is all about performance *because* without much more performance than
  what can be achieved with a vanilla Linux kernel, it's only a pain to use
  compared to the much more comfortable (and stable) socket() API. Since no
  one would use it, there wouldn't be any market for it.

- Every CPU cycle counts. That makes DPDK difficult to use because we cannot
  get away with a friendly socket()-like API. Almost every aspect can be
  configured to tailor it to an application needs. This was historically
  done at compile time through .config options, now through run-time
  parameters with the unfortunate side effect of causing the number of TX/RX
  burst functions grow dangerously in many PMDs to maintain the same level
  of performance.

- ABI concerns mainly apply to shared libraries [1], which happens to be
  what Linux distributions want to use for very good reasons. The problem is
  that shared libraries, by their very nature are not as efficient thanks to
  PIC, relocations and so on. CPU-bound applications may actually prefer to
  link against static libraries to squeeze a handful more pps; DPDK cannot
  ignore this as it has a measurable performance impact for those.

Basically ABI stability is good, unless we want more performance on top of
more features. There is no end in sight to new features and associated API
changes/ABI breakages.

While I don't want to sound pessimistic, I don't think expecting things to
settle without killing DPDK is a realistic goal. That's why I was taking
maintenance/stable releases as an example; without new features, ABI
stability is almost guaranteed. Efforts could be diverted from the pursuit
of ABI stability in the master branch to improve maintenance ones.

> Anyway, apologies if I took some bait here, and sorry that I ranted off
> on my own.

No worries, I needed to vent a bit myself :)

Note, from the above comments it may not look like it but I'm actually
concerned about API/ABI stability where applicable, that was one of the
reasons behind the design of rte_flow (which can be extended safely without
wrecking ABIs in the process). Unfortunately several bad design choices led
to the need for the obligatory ABI breakage that will have to occur at some
point in the future.

> > (end of rant, thanks for reading)
> 
> [0]: https://www.complang.tuwien.ac.at/anton/linux-binary-compatibility.html

[1] Applications are pretty much guaranteed to be recompiled against static
    ones and encounter issues due to API changes first.

-- 
Adrien Mazarguil
6WIND

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v1 1/7] ethdev: expose flow API error helper
  2017-10-11 19:05  5%       ` Aaron Conole
@ 2017-10-12 13:37  4%         ` Neil Horman
  2017-10-12 14:02  5%         ` Adrien Mazarguil
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2017-10-12 13:37 UTC (permalink / raw)
  To: Aaron Conole
  Cc: Adrien Mazarguil, Thomas Monjalon, dev, Ferruh Yigit, Gaetan Rivet, fbl

On Wed, Oct 11, 2017 at 03:05:47PM -0400, Aaron Conole wrote:
> Adrien Mazarguil <adrien.mazarguil@6wind.com> writes:
> 
> > On Wed, Oct 11, 2017 at 11:23:12AM +0200, Thomas Monjalon wrote:
> >> 05/10/2017 11:49, Adrien Mazarguil:
> >> > rte_flow_error_set() is a convenient helper to initialize error objects.
> >> > 
> >> > Since there is no fundamental reason to prevent applications from using it,
> >> > expose it through the public interface after modifying its return value
> >> > from positive to negative. This is done for consistency with the rest of
> >> > the public interface.
> >> > 
> >> > Documentation is updated accordingly.
> >> > 
> >> > Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
> >> > ---
> >> > --- a/lib/librte_ether/rte_flow.h
> >> > +++ b/lib/librte_ether/rte_flow.h
> >> >  /**
> >> > + * Initialize flow error structure.
> >> > + *
> >> > + * @param[out] error
> >> > + *   Pointer to flow error structure (may be NULL).
> >> > + * @param code
> >> > + *   Related error code (rte_errno).
> >> > + * @param type
> >> > + *   Cause field and error types.
> >> > + * @param cause
> >> > + *   Object responsible for the error.
> >> > + * @param message
> >> > + *   Human-readable error message.
> >> > + *
> >> > + * @return
> >> > + *   Negative error code (errno value) and rte_errno is set.
> >> > + */
> >> > +static inline int
> >> > +rte_flow_error_set(struct rte_flow_error *error,
> >> > +		   int code,
> >> > +		   enum rte_flow_error_type type,
> >> > +		   const void *cause,
> >> > +		   const char *message)
> >> 
> >> When calling this function, the performance is not critical.
> >> So it must not be an inline function.
> >> Please move it to the .c file and add it to the .map file.
> >
> > I'll do it as part of moving this patch into my upcoming series for mlx4,
> > since it relies on the new return value.
> >
> > Now for the record, I believe that static inlines, particularly short ones
> > that are not expected to be modified any time soon (provided they are
> > defined properly that is) are harmless.
> >
> > Yes, that means modifying them, depending on what they do, may cause a
> > global ABI breakage of the underlying library which translates to a major
> > version bump, however exactly the same applies to some macros (in particular
> > the *_MAX ones), structure and other type definitions and so on.
> 
> Sure.  I think if it's small and there's never a chance for it to
> change, then it's okay.  But, as you point out - they are similar to
> macros in that they are code directly added to the application.  There
> is never a way to fix a bug or adjust some semantic behavior without
> requiring a recompile.  That's a strong kind of binding.  Certainly we
> would want that communicated as ABI, regardless of which .h/.c file the
> function exists, yes?
> 
> > What I'm getting at is, making this function part of the .map file won't
> > help all that much with the goal of reaching a stable ABI. Making it a
> > normal function on the other hand successfully prevents PMDs and
> > applications from considering its use in their data plane (flow rules
> > management from the data plane is likely the next step for rte_flow).
> 
> I don't understand this point well.  There are two things - committing
> to a stable ABI, and communicating information about that ABI.  Having
> .map files doesn't do anything for a stable ABI.  It merely
> communicates information.  The stability must come from the developer
> community and maintainers.
> 
> > In my opinion, performance (even if hypothetical) matters more than ABI
> > stability, particularly since the current pattern is for the whole ABI to be
> > broken every other release. I think that with DPDK, ABI stability can only
> > be properly guaranteed in stable/maintenance releases but that effort is
> > vain in the master branch, affected by way too many changes for it to ever
> > become reality. This doesn't mean we shouldn't even try, however we
> > shouldn't restrict ourselves; when the ABI needs to be broken, so be it.
> 
> First, performance isn't hypothetical.  You have code which performs,
> and have measured various metrics to show this, or you don't have data.
> No voodoo required.  Hypothetical isn't even an argument when it comes
> to predictable devices (like computers).  In the case above, you have a
> non-performance critical function.  It's an error function.  It passes
> strings around.  Performance cannot be a consideration here.
> 
> Second, it depends on where you want to view the boundary.  If a change is
> internal to DPDK (meaning, the application is never expected to interact
> with that area of code), then it shouldn't be part of ABI and changing
> it to your hearts content should be fine.
> 
> *rant-on*
> 
> I see lots of projects which use DPDK, but I only know of three or so
> projects which don't directly embed a copy of the DPDK source
> tree.  I think this is a side effect of not having a stable ABI - it's
> not possible to rely on easily upgrading the library, so people just
> pick a version and never upgrade.  That's bad for everyone.  It results
> in fewer contributions, and difficulty getting people to participate.
> There's too much text like "Install DPDK 1.8.0. With other versions is
> not guaranted it works properly" that is embedded in downstream users
> (that comes from an actual project README).  Even at DPDK summit in
> Dublin, one of the most vocal opponents to ABI stability admitted that
> his company takes the code and never contributes it back.  That is
> really not friendly.
> 
> This even has a different side effect - one of market penetration.  It's
> difficult for distributions to support this model.  So, there will be
> one or two packages they might pick up, with one or two versions.
> Everything else is "roll your own."  And when it's more difficult than
> 'apt-get|yum|dnf|foo install' then users don't use it, and the cycle
> continues.
> 
> I'll point out that I can take a number of compiled binaries from 20
> years ago[0], and run on a modern kernel.  I wish I could take a
> binary linked to DPDK from 5 months ago, and run it with today's DPDK.
> I believe that *should* be the goal.  I am confident it's achievable.
> But, I recognize it's hard and requires extra effort.
> 
> Anyway, apologies if I took some bait here, and sorry that I ranted off
> on my own.
> 
I'll add a +1 here.  The degree to which the community is concerned about ABI
stability is reflected in the fact that no two major releases of DPDK have had
compatible ABI's.  While thats somewhat understandable from a developer
perspective (it really doesn't matter if you have a stable ABI if you always use
the latest version, in fact its a hinderance to doing your job), its potentially
catastrophic from a downstream consumer point of view.  No downstream consumer
is going to keep up with the latest version of DPDK on a consistent basis (I'm
going to guess that there are still users of DPDK 2.2 floating out there).  They
just embed a copy, get it working, and move on with their lives.  Thats
seemingly fine for as long as your foot print is small, but the second that you
hit a major bug or security issue in an old version and can't just upgrade the
DPDK without a major engineering effort, thats going to be a big problem, and
users will look elsewhere for a solution that offers both performance and
compatibility.  XDP and iovisor are already gaining ground on the performance
front, and offer that level of upgradability.

Neil

> > (end of rant, thanks for reading)
> 
> [0]: https://www.complang.tuwien.ac.at/anton/linux-binary-compatibility.html

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] eal: bus scan and probe never fail
  2017-10-12  5:39  0%                 ` Shreyansh Jain
@ 2017-10-12 13:20  0%                   ` Aaron Conole
  0 siblings, 0 replies; 200+ results
From: Aaron Conole @ 2017-10-12 13:20 UTC (permalink / raw)
  To: Shreyansh Jain
  Cc: Don Provan, Jan Blunck, Thomas Monjalon, dev, Hemant Agrawal

Shreyansh Jain <shreyansh.jain@nxp.com> writes:

> Hello Aaron,
>
> On Tuesday 10 October 2017 09:30 PM, Aaron Conole wrote:
>> Shreyansh Jain <shreyansh.jain@nxp.com> writes:
>>
>>> Hello Don,
>>>
>
> [snip]
>
>>>>
>>>> These practical problems confirm to me that the failure of a bus
>>>> scan is more of a strategic issue: when asking "which devices can
>>>> I use?", "none" is a perfectly valid answer that does not seem
>>>> like an error to me even when a failed bus scan is the reason for
>>>> that answer.
>>>
>>> I agree with this.
>>>
>>>>
>>>>   From the application's point of view, the potential error here
>>>> is that the device it wants to use isn't available. I don't see that
>>>> either the init function or the probe function will have enough
>>>> information to understand that application-level problem, so
>>>> they should leave it to the application to detect it.
>>>
>>> I think I understand you comment but just want to cross check again:
>>> Scan or probe error should simply be ignored by EAL layer and let the
>>> application take stance when it detects that the device it was looking
>>> for is missing. Is my understanding correct?
>>>
>>> I am trying to come a conclusion so that this patch can either be
>>> modified or pushed as it is. If the above understanding is correct, I
>>> don't see any changes required in the patch.
>>
>> Does it make sense to introduce a way to query the results of the
>> various bus types for their status?  That way we can give the relevant
>> information to the application if it wants, and make the bus scanning
>> code *always* succeed?  This version shouldn't be an ABI breakage,
>> either (confirm?).
>>
>> half-baked below (not tested or suitable - just an example):
>>
>> ---
>> diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c
>> index a30a898..cd1ef1e 100644
>> --- a/lib/librte_eal/common/eal_common_bus.c
>> +++ b/lib/librte_eal/common/eal_common_bus.c
>> @@ -38,9 +38,23 @@
>>     #include "eal_private.h"
>>   +struct rte_bus_failure {
>> +	struct rte_bus *bus;
>> +	int err;
>> +};
>> +
>>   struct rte_bus_list rte_bus_list =
>>   	TAILQ_HEAD_INITIALIZER(rte_bus_list);
>>   +TAILQ_HEAD(rte_bus_scan_failure_list, rte_bus_failure);
>> +struct rte_bus_scan_failure_list rte_bus_scan_failure_list =
>> +	TAILQ_HEAD_INITIALIZER(rte_bus_failure);
>> +
>> +TAILQ_HEAD(rte_bus_probe_failure_list, rte_bus_failure);
>> +struct rte_bus_probe_failure_list rte_bus_probe_failure_list =
>> +	TAILQ_HEAD_INITIALIZER(rte_bus_failure);
>> +
>> +
>>   void
>>   rte_bus_register(struct rte_bus *bus)
>>   {
>> @@ -64,6 +78,26 @@ rte_bus_unregister(struct rte_bus *bus)
>>   	RTE_LOG(DEBUG, EAL, "Unregistered [%s] bus.\n", bus->name);
>>   }
>>   +static void
>> +rte_bus_append_failed_scan(struct rte_bus *bus, int ret)
>> +{
>> +	struct rte_bus_failure *f = malloc(sizeof(struct rte_bus_failure));
>> +	if (!f) abort();
>> +	f->bus = bus;
>> +	f->ret = ret;
>> +	TAILQ_INSERT_TAIL(&rte_bus_scan_failure_list, f, next);
>> +}
>> +
>> +static void
>> +rte_bus_append_failed_scan(struct rte_bus *bus, int ret)
>> +{
>> +	struct rte_bus_failure *f = malloc(sizeof(struct rte_bus_failure));
>> +	if (!f) abort();
>> +	f->bus = bus;
>> +	f->ret = ret;
>> +	TAILQ_INSERT_TAIL(&rte_bus_probe_failure_list, f, next);
>> +}
>> +
>>   /* Scan all the buses for registered devices */
>>   int
>>   rte_bus_scan(void)
>> @@ -76,13 +110,33 @@ rte_bus_scan(void)
>>   		if (ret) {
>>   			RTE_LOG(ERR, EAL, "Scan for (%s) bus failed.\n",
>>   				bus->name);
>> -			return ret;
>> +			rte_bus_append_failed_scan(bus, ret);
>>   		}
>>   	}
>>     	return 0;
>>   }
>>   +/* Seek through scan failures */
>> +void
>> +rte_bus_scan_errors(rte_bus_error_callback cb)
>> +{
>> +	struct rte_bus_failure *f = NULL;
>> +	TAILQ_FOREACH(f, &rte_bus_scan_failure_list, next) {
>> +		cb(f->bus, f->ret);
>> +	}
>> +}
>> +
>> +/* Seek through probe failures */
>> +void
>> +rte_bus_probe_errors(rte_bus_error_callback cb)
>> +{
>> +	struct rte_bus_failure *f = NULL;
>> +	TAILQ_FOREACH(f, &rte_bus_probe_failure_list, next) {
>> +		cb(f->bus, f->ret);
>> +	}
>> +}
>> +
>>   /* Probe all devices of all buses */
>>   int
>>   rte_bus_probe(void)
>> @@ -100,7 +154,7 @@ rte_bus_probe(void)
>>   		if (ret) {
>>   			RTE_LOG(ERR, EAL, "Bus (%s) probe failed.\n",
>>   				bus->name);
>> -			return ret;
>> +            rte_bus_append_failed_probe(bus, ret);
>>   		}
>>   	}
>>   @@ -109,7 +163,7 @@ rte_bus_probe(void)
>>   		if (ret) {
>>   			RTE_LOG(ERR, EAL, "Bus (%s) probe failed.\n",
>>   				vbus->name);
>> -			return ret;
>> +            rte_bus_append_failed_probe(bus, ret);
>>   		}
>>   	}
>>   diff --git a/lib/librte_eal/common/include/rte_bus.h
>> b/lib/librte_eal/common/include/rte_bus.h
>> index 6fb0834..daddb28 100644
>> --- a/lib/librte_eal/common/include/rte_bus.h
>> +++ b/lib/librte_eal/common/include/rte_bus.h
>> @@ -231,6 +231,20 @@ void rte_bus_register(struct rte_bus *bus);
>>    */
>>   void rte_bus_unregister(struct rte_bus *bus);
>>   +typedef void (*rte_bus_error_callback)(struct rte_bus *bus, int
>> err);
>> +
>> +/**
>> + * Search through all buses, invoking cb for each bus which reports scan
>> + * error.
>> + */
>> +void rte_bus_scan_errors(rte_bus_error_callback cb);
>> +
>> +/**
>> + * Search through all buses, invoking cb for each bus which reports scan
>> + * error.
>> + */
>> +void rte_bus_probe_errors(rte_bus_error_callback cb);
>> +
>>   /**
>>    * Scan all the buses.
>>    *
>>
>
> I am assuming that that aim of this is to have a way so that
> application can query whether its device of interest is there or
> not. But, I think this (creating a list of scan errrors) would be
> overkill.

No.  That can be done through a different query.

> Even if we were to create a list of errors from scan/probe, how would
> that help an application? Is there some specific use-case that you are
> hinting at?

Sure.  Let's assume that due to some permissions problem, /proc/bus/pci
doesn't exist for the application.  The entire PCI bus scan fails.  No
PCI devices are found.

In this case, how can the application even start to understand why the
device is missing?  I don't think parsing logs makes sense.  But if
there's a way to see that the PCI bus scan/probe failed, maybe the
application can start making corrective action (for instance, check that
/proc is mounted, and retry the bus probe/scan).

> Application should worry about devices rather than how they are being
> detected (scan/probe etc). Application can use API like
> rte_eth_dev_get_port_by_name to query its specific device of
> interest. If the scan has failed, this API would be sufficient for the
> application to take counter-measures. Isn't that enough from a DPDK
> application perspective to move from init to I/O?

I'm not sure what you're asking here.  I agree that bus probe/scan
shouldn't ever fail, and that we should pass from init to i/o asap.

> I am not discounting that there might be some higher use-cases where
> this list might come of us - but I can't think of one right now and I
> can't comment on this proposal in absence of that understanding -
> sorry.

Maybe the above helps?  Not sure if I described my thinking.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] eal: bus scan and probe never fail
  2017-10-11 22:34  0%                 ` Thomas Monjalon
@ 2017-10-12 13:08  0%                   ` Aaron Conole
  0 siblings, 0 replies; 200+ results
From: Aaron Conole @ 2017-10-12 13:08 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, Shreyansh Jain, Don Provan, Jan Blunck, Hemant Agrawal

Thomas Monjalon <thomas@monjalon.net> writes:

> 10/10/2017 18:00, Aaron Conole:
>> Shreyansh Jain <shreyansh.jain@nxp.com> writes:
>> 
>> > Hello Don,
>> >
>> > On Monday 09 October 2017 11:51 PM, Don Provan wrote:
>> >>> -----Original Message-----
>> >>> From: Shreyansh Jain [mailto:shreyansh.jain@nxp.com]
>> >>> Sent: Monday, October 09, 2017 4:10 AM
>> >>> To: Jan Blunck <jblunck@infradead.org>; Thomas Monjalon
>> >>> <thomas@monjalon.net>
>> >>> Cc: dev <dev@dpdk.org>; Hemant Agrawal <hemant.agrawal@nxp.com>
>> >>> Subject: Re: [dpdk-dev] [PATCH] eal: bus scan and probe never fail
>> >>>
>> >>> ...
>> >>> This is where I have disagreement/doubt.
>> >>> Reporting error code from rte_bus_scan would do two things:
>> >>>
>> >>> 1. rte_eal_init is not designed to ignore/log-only these errors - it
>> >>> would quit initialization. (But, this can be changed)
>> >>> 2. What should rte_eal_init do with this error? rte_bus_scan would have
>> >>> already printed the problematic bus->scan() failure.
>> >>
>> >> These practical problems confirm to me that the failure of a bus
>> >> scan is more of a strategic issue: when asking "which devices can
>> >> I use?", "none" is a perfectly valid answer that does not seem
>> >> like an error to me even when a failed bus scan is the reason for
>> >> that answer.
>> >
>> > I agree with this.
>> >
>> >>
>> >>  From the application's point of view, the potential error here
>> >> is that the device it wants to use isn't available. I don't see that
>> >> either the init function or the probe function will have enough
>> >> information to understand that application-level problem, so
>> >> they should leave it to the application to detect it.
>> >
>> > I think I understand you comment but just want to cross check again:
>> > Scan or probe error should simply be ignored by EAL layer and let the
>> > application take stance when it detects that the device it was looking
>> > for is missing. Is my understanding correct?
>> >
>> > I am trying to come a conclusion so that this patch can either be
>> > modified or pushed as it is. If the above understanding is correct, I
>> > don't see any changes required in the patch.
>> 
>> Does it make sense to introduce a way to query the results of the
>> various bus types for their status?  That way we can give the relevant
>> information to the application if it wants, and make the bus scanning
>> code *always* succeed?  This version shouldn't be an ABI breakage,
>> either (confirm?).
>> 
>> half-baked below (not tested or suitable - just an example):
>
> We are going to need notification callbacks for scan and probe anyway.
> I think errors could be also notified with callbacks?

Definitely.  That's part of my half-baked patch.  Call the error check
function and get a callback.  There's probably a better way to do it
than my patch.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 19/20] doc: add notes on EAL PCI API update
  @ 2017-10-12 10:45  4%         ` Gaetan Rivet
    1 sibling, 0 replies; 200+ results
From: Gaetan Rivet @ 2017-10-12 10:45 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

Add a section related to EAL API changes to 17.11 release notes.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 63b9869..ed3d6d8 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -232,6 +232,34 @@ API Changes
   By this way PMDs can return an error value in case of failure at stats
   getting process time.
 
+* **PCI bus API moved outside of the EAL**
+
+  The PCI bus previously implemented within the EAL has been moved.
+  A first part has been added as an RTE library providing PCI helpers to
+  parse device locations or other such utilities.
+  A second part consisting in the actual bus driver has been moved to its
+  proper subdirectory, without changing its functionalities.
+
+  As such, several PCI-related functions are not proposed by the EAL anymore:
+
+  * rte_pci_detach
+  * rte_pci_dump
+  * rte_pci_ioport_map
+  * rte_pci_ioport_read
+  * rte_pci_ioport_unmap
+  * rte_pci_ioport_write
+  * rte_pci_map_device
+  * rte_pci_probe
+  * rte_pci_probe_one
+  * rte_pci_read_config
+  * rte_pci_register
+  * rte_pci_scan
+  * rte_pci_unmap_device
+  * rte_pci_unregister
+  * rte_pci_write_config
+
+  These functions are made available either as part of ``librte_pci`` or
+  ``librte_bus_pci``.
 
 ABI Changes
 -----------
-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 1/2] reorder: fix ready buffers not being nulled out
  @ 2017-10-12  8:32  3% ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2017-10-12  8:32 UTC (permalink / raw)
  To: Pavan Nikhilesh; +Cc: reshma.pattan, dev

On Tue, Sep 12, 2017 at 08:36:03PM +0530, Pavan Nikhilesh wrote:
> The ready buffers should be set to NULL when drained else it might
> result in double free (mempool put) when rte_reorder_free is called.
> 
> Fixes: b70b56032bff ("reorder: new library")
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com> ---
> lib/librte_reorder/rte_reorder.c | 1 + 1 file changed, 1 insertion(+)
> 
Rather than having an addition write for each entry going through the
reorder library, it should be possible to change free function so that
it only frees entries based on the index values.

In fact, a better solution to having reorder_free just blindly free the
mbufs would be to have reorder_free hand them back to the application,
or allow reorder_free to fail if the reorder buffer is non-empty. Making
such a change would be an ABI break, though.

/Bruce

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2 18/18] doc: remove devargs deprecation notices
  @ 2017-10-12  8:21 10%   ` Gaetan Rivet
    1 sibling, 0 replies; 200+ results
From: Gaetan Rivet @ 2017-10-12  8:21 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

These actions have been enacted.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
 doc/guides/rel_notes/deprecation.rst | 13 -------------
 1 file changed, 13 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index ef2264f..23faa19 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -16,19 +16,6 @@ Deprecation Notices
   - ``rte_set_log_type``, replaced by ``rte_log_set_level``
   - ``rte_get_log_type``, replaced by ``rte_log_get_level``
 
-* eal: several API and ABI changes are planned for ``rte_devargs`` in v17.11.
-  The format of device command line parameters will change. The bus will need
-  to be explicitly stated in the device declaration. The enum ``rte_devtype``
-  was used to identify a bus and will disappear.
-  The structure ``rte_devargs`` will change.
-  The ``rte_devargs_list`` will be made private.
-  The following functions are deprecated starting from 17.08 and will either be
-  modified or removed in 17.11:
-
-  - ``rte_eal_devargs_add``
-  - ``rte_eal_devargs_type_count``
-  - ``rte_eal_parse_devargs_str``, replaced by ``rte_eal_devargs_parse``
-
 * eal: An ABI change is planned for 17.11 to make DPDK aware of IOVA address
   translation scheme.
   Reference to phys address in EAL data-structure or functions may change to
-- 
2.1.4

^ permalink raw reply	[relevance 10%]

* [dpdk-dev] [PATCH v1 2/8] bus: introduce opaque control framework
  2017-10-12  8:18  4% [dpdk-dev] [PATCH v1 0/8] Bus control framework Gaetan Rivet
@ 2017-10-12  8:18  4% ` Gaetan Rivet
  0 siblings, 0 replies; 200+ results
From: Gaetan Rivet @ 2017-10-12  8:18 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

New configuration elements are added to the buses. They make the ABI
unstable and will continue to do so.

This new control scheme allows to add new bus operators without
breaking the ABI and by only expanding the API.

This helps having more stability in core EAL subsystems, while allowing
flexibility for future evolutions.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
 lib/librte_eal/common/eal_common_bus.c  |  9 +++++++
 lib/librte_eal/common/include/rte_bus.h | 46 +++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c
index 3c66a02..65d7229 100644
--- a/lib/librte_eal/common/eal_common_bus.c
+++ b/lib/librte_eal/common/eal_common_bus.c
@@ -42,6 +42,13 @@
 struct rte_bus_list rte_bus_list =
 	TAILQ_HEAD_INITIALIZER(rte_bus_list);
 
+static rte_bus_ctrl_t
+rte_bus_default_ctrl(enum rte_bus_ctrl_op op __rte_unused,
+		     enum rte_bus_ctrl_item item __rte_unused)
+{
+	return NULL;
+}
+
 void
 rte_bus_register(struct rte_bus *bus)
 {
@@ -53,6 +60,8 @@ rte_bus_register(struct rte_bus *bus)
 	RTE_VERIFY(bus->find_device);
 	/* Buses supporting driver plug also require unplug. */
 	RTE_VERIFY(!bus->plug || bus->unplug);
+	if (bus->ctrl == NULL)
+		bus->ctrl = &rte_bus_default_ctrl;
 
 	TAILQ_INSERT_TAIL(&rte_bus_list, bus, next);
 	RTE_LOG(DEBUG, EAL, "Registered [%s] bus.\n", bus->name);
diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h
index 331d954..bd3c28e 100644
--- a/lib/librte_eal/common/include/rte_bus.h
+++ b/lib/librte_eal/common/include/rte_bus.h
@@ -183,6 +183,51 @@ struct rte_bus_conf {
 	enum rte_bus_probe_mode probe_mode; /**< Probe policy. */
 };
 
+/**
+ * Bus configuration items.
+ */
+enum rte_bus_ctrl_item {
+	RTE_BUS_CTRL_PROBE_MODE = 0,
+	RTE_BUS_CTRL_ITEM_MAX,
+};
+
+/**
+ * Bus configuration operations.
+ */
+enum rte_bus_ctrl_op {
+	RTE_BUS_CTRL_GET = 0,
+	RTE_BUS_CTRL_SET,
+	RTE_BUS_CTRL_RESET,
+	RTE_BUS_CTRL_OP_MAX,
+};
+
+/**
+ * Operator for a particular rte_bus configuration item.
+ *
+ * @param arg
+ *    Operation parameter.
+ *
+ * @return
+ *	0 on success
+ *	!0 otherwise
+ */
+typedef int (*rte_bus_ctrl_t)(void *arg);
+
+/**
+ * Accessor to bus configuration operators.
+ *
+ * @param op
+ *	Operation type.
+ *
+ * @param item
+ *	Operation element.
+ *
+ * @return
+ *	Operator function on success.
+ *	NULL if this item is not supported.
+ */
+typedef rte_bus_ctrl_t (*rte_bus_ctrl_get_t)(enum rte_bus_ctrl_op op,
+					     enum rte_bus_ctrl_item item);
 
 /**
  * Get common iommu class of the all the devices on the bus. The bus may
@@ -211,6 +256,7 @@ struct rte_bus {
 	rte_bus_parse_t parse;       /**< Parse a device name */
 	struct rte_bus_conf conf;    /**< Bus configuration */
 	rte_bus_get_iommu_class_t get_iommu_class; /**< Get iommu class */
+	rte_bus_ctrl_get_t ctrl;     /**< Get control operators */
 };
 
 /**
-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v1 0/8] Bus control framework
@ 2017-10-12  8:18  4% Gaetan Rivet
  2017-10-12  8:18  4% ` [dpdk-dev] [PATCH v1 2/8] bus: introduce opaque " Gaetan Rivet
  0 siblings, 1 reply; 200+ results
From: Gaetan Rivet @ 2017-10-12  8:18 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

Probing policy was introduced in the previous release as a configuration item.
It was thus added to the generic bus structure, breaking its ABI.

In this release, the IOVA mode can be read from a bus to configure the
EAL. This new configuration element also broke the bus ABI when it was
added.

As new operators had to be implemented for the probe policy item, these
patches were developed to help mitigate this issue.

This control framework allows to expand the rte_bus API without breaking
its ABI. It is meant to be used with configuration elements that may
only be valid for a few buses, while the others would remain untouched
and unaware of the evolution.

A central control operator is used, similarly to the working of rte_flow
API in the ether layer. Each driver thus chooses to expose a set of
operators relevant to its implementation. The caller is then free to use
those if they are available.

Both Probe mode and IOVA mode operators are implemented for the PCI bus.

This patchset depends on:

Move PCI away from the EAL
http://dpdk.org/ml/archives/dev/2017-August/073512.html

Gaetan Rivet (8):
  bus: rename scan policy as probe policy
  bus: introduce opaque control framework
  bus: remove probe mode configuration structure
  bus: add probe mode setter
  bus/pci: implement ctrl operator
  bus: add IOVA mode as a ctrl operation
  bus/pci: implement IOVA mode getter
  bus: remove redundant IOVA mode getter

 drivers/bus/pci/bsd/pci.c                       |   9 +-
 drivers/bus/pci/include/rte_bus_pci.h           |  12 +--
 drivers/bus/pci/linux/pci.c                     |  20 ++--
 drivers/bus/pci/pci_common.c                    |  53 +++++++++-
 drivers/bus/pci/private.h                       |  13 +++
 lib/librte_eal/bsdapp/eal/rte_eal_version.map   |   1 -
 lib/librte_eal/common/eal_common_bus.c          |  57 +++++++++--
 lib/librte_eal/common/eal_common_devargs.c      |   8 --
 lib/librte_eal/common/eal_common_options.c      |  17 +---
 lib/librte_eal/common/include/rte_bus.h         | 127 ++++++++++++++++--------
 lib/librte_eal/linuxapp/eal/rte_eal_version.map |   1 -
 11 files changed, 222 insertions(+), 96 deletions(-)

-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v4 16/16] doc: add notes on EAL PCI API update
  @ 2017-10-12  8:17  4%       ` Gaetan Rivet
    1 sibling, 0 replies; 200+ results
From: Gaetan Rivet @ 2017-10-12  8:17 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

Add a section related to EAL API changes to 17.11 release notes.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 63b9869..ed3d6d8 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -232,6 +232,34 @@ API Changes
   By this way PMDs can return an error value in case of failure at stats
   getting process time.
 
+* **PCI bus API moved outside of the EAL**
+
+  The PCI bus previously implemented within the EAL has been moved.
+  A first part has been added as an RTE library providing PCI helpers to
+  parse device locations or other such utilities.
+  A second part consisting in the actual bus driver has been moved to its
+  proper subdirectory, without changing its functionalities.
+
+  As such, several PCI-related functions are not proposed by the EAL anymore:
+
+  * rte_pci_detach
+  * rte_pci_dump
+  * rte_pci_ioport_map
+  * rte_pci_ioport_read
+  * rte_pci_ioport_unmap
+  * rte_pci_ioport_write
+  * rte_pci_map_device
+  * rte_pci_probe
+  * rte_pci_probe_one
+  * rte_pci_read_config
+  * rte_pci_register
+  * rte_pci_scan
+  * rte_pci_unmap_device
+  * rte_pci_unregister
+  * rte_pci_write_config
+
+  These functions are made available either as part of ``librte_pci`` or
+  ``librte_bus_pci``.
 
 ABI Changes
 -----------
-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] eal: bus scan and probe never fail
  2017-10-10 16:00  3%               ` Aaron Conole
  2017-10-11 22:34  0%                 ` Thomas Monjalon
@ 2017-10-12  5:39  0%                 ` Shreyansh Jain
  2017-10-12 13:20  0%                   ` Aaron Conole
  1 sibling, 1 reply; 200+ results
From: Shreyansh Jain @ 2017-10-12  5:39 UTC (permalink / raw)
  To: Aaron Conole; +Cc: Don Provan, Jan Blunck, Thomas Monjalon, dev, Hemant Agrawal

Hello Aaron,

On Tuesday 10 October 2017 09:30 PM, Aaron Conole wrote:
> Shreyansh Jain <shreyansh.jain@nxp.com> writes:
> 
>> Hello Don,
>>

[snip]

>>>
>>> These practical problems confirm to me that the failure of a bus
>>> scan is more of a strategic issue: when asking "which devices can
>>> I use?", "none" is a perfectly valid answer that does not seem
>>> like an error to me even when a failed bus scan is the reason for
>>> that answer.
>>
>> I agree with this.
>>
>>>
>>>   From the application's point of view, the potential error here
>>> is that the device it wants to use isn't available. I don't see that
>>> either the init function or the probe function will have enough
>>> information to understand that application-level problem, so
>>> they should leave it to the application to detect it.
>>
>> I think I understand you comment but just want to cross check again:
>> Scan or probe error should simply be ignored by EAL layer and let the
>> application take stance when it detects that the device it was looking
>> for is missing. Is my understanding correct?
>>
>> I am trying to come a conclusion so that this patch can either be
>> modified or pushed as it is. If the above understanding is correct, I
>> don't see any changes required in the patch.
> 
> Does it make sense to introduce a way to query the results of the
> various bus types for their status?  That way we can give the relevant
> information to the application if it wants, and make the bus scanning
> code *always* succeed?  This version shouldn't be an ABI breakage,
> either (confirm?).
> 
> half-baked below (not tested or suitable - just an example):
> 
> ---
> diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c
> index a30a898..cd1ef1e 100644
> --- a/lib/librte_eal/common/eal_common_bus.c
> +++ b/lib/librte_eal/common/eal_common_bus.c
> @@ -38,9 +38,23 @@
>   
>   #include "eal_private.h"
>   
> +struct rte_bus_failure {
> +	struct rte_bus *bus;
> +	int err;
> +};
> +
>   struct rte_bus_list rte_bus_list =
>   	TAILQ_HEAD_INITIALIZER(rte_bus_list);
>   
> +TAILQ_HEAD(rte_bus_scan_failure_list, rte_bus_failure);
> +struct rte_bus_scan_failure_list rte_bus_scan_failure_list =
> +	TAILQ_HEAD_INITIALIZER(rte_bus_failure);
> +
> +TAILQ_HEAD(rte_bus_probe_failure_list, rte_bus_failure);
> +struct rte_bus_probe_failure_list rte_bus_probe_failure_list =
> +	TAILQ_HEAD_INITIALIZER(rte_bus_failure);
> +
> +
>   void
>   rte_bus_register(struct rte_bus *bus)
>   {
> @@ -64,6 +78,26 @@ rte_bus_unregister(struct rte_bus *bus)
>   	RTE_LOG(DEBUG, EAL, "Unregistered [%s] bus.\n", bus->name);
>   }
>   
> +static void
> +rte_bus_append_failed_scan(struct rte_bus *bus, int ret)
> +{
> +	struct rte_bus_failure *f = malloc(sizeof(struct rte_bus_failure));
> +	if (!f) abort();
> +	f->bus = bus;
> +	f->ret = ret;
> +	TAILQ_INSERT_TAIL(&rte_bus_scan_failure_list, f, next);
> +}
> +
> +static void
> +rte_bus_append_failed_scan(struct rte_bus *bus, int ret)
> +{
> +	struct rte_bus_failure *f = malloc(sizeof(struct rte_bus_failure));
> +	if (!f) abort();
> +	f->bus = bus;
> +	f->ret = ret;
> +	TAILQ_INSERT_TAIL(&rte_bus_probe_failure_list, f, next);
> +}
> +
>   /* Scan all the buses for registered devices */
>   int
>   rte_bus_scan(void)
> @@ -76,13 +110,33 @@ rte_bus_scan(void)
>   		if (ret) {
>   			RTE_LOG(ERR, EAL, "Scan for (%s) bus failed.\n",
>   				bus->name);
> -			return ret;
> +			rte_bus_append_failed_scan(bus, ret);
>   		}
>   	}
>   
>   	return 0;
>   }
>   
> +/* Seek through scan failures */
> +void
> +rte_bus_scan_errors(rte_bus_error_callback cb)
> +{
> +	struct rte_bus_failure *f = NULL;
> +	TAILQ_FOREACH(f, &rte_bus_scan_failure_list, next) {
> +		cb(f->bus, f->ret);
> +	}
> +}
> +
> +/* Seek through probe failures */
> +void
> +rte_bus_probe_errors(rte_bus_error_callback cb)
> +{
> +	struct rte_bus_failure *f = NULL;
> +	TAILQ_FOREACH(f, &rte_bus_probe_failure_list, next) {
> +		cb(f->bus, f->ret);
> +	}
> +}
> +
>   /* Probe all devices of all buses */
>   int
>   rte_bus_probe(void)
> @@ -100,7 +154,7 @@ rte_bus_probe(void)
>   		if (ret) {
>   			RTE_LOG(ERR, EAL, "Bus (%s) probe failed.\n",
>   				bus->name);
> -			return ret;
> +            rte_bus_append_failed_probe(bus, ret);
>   		}
>   	}
>   
> @@ -109,7 +163,7 @@ rte_bus_probe(void)
>   		if (ret) {
>   			RTE_LOG(ERR, EAL, "Bus (%s) probe failed.\n",
>   				vbus->name);
> -			return ret;
> +            rte_bus_append_failed_probe(bus, ret);
>   		}
>   	}
>   
> diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h
> index 6fb0834..daddb28 100644
> --- a/lib/librte_eal/common/include/rte_bus.h
> +++ b/lib/librte_eal/common/include/rte_bus.h
> @@ -231,6 +231,20 @@ void rte_bus_register(struct rte_bus *bus);
>    */
>   void rte_bus_unregister(struct rte_bus *bus);
>   
> +typedef void (*rte_bus_error_callback)(struct rte_bus *bus, int err);
> +
> +/**
> + * Search through all buses, invoking cb for each bus which reports scan
> + * error.
> + */
> +void rte_bus_scan_errors(rte_bus_error_callback cb);
> +
> +/**
> + * Search through all buses, invoking cb for each bus which reports scan
> + * error.
> + */
> +void rte_bus_probe_errors(rte_bus_error_callback cb);
> +
>   /**
>    * Scan all the buses.
>    *
> 

I am assuming that that aim of this is to have a way so that application 
can query whether its device of interest is there or not. But, I think 
this (creating a list of scan errrors) would be overkill.

Even if we were to create a list of errors from scan/probe, how would 
that help an application? Is there some specific use-case that you are 
hinting at?

Application should worry about devices rather than how they are being 
detected (scan/probe etc). Application can use API like 
rte_eth_dev_get_port_by_name to query its specific device of interest. 
If the scan has failed, this API would be sufficient for the application 
to take counter-measures. Isn't that enough from a DPDK application 
perspective to move from init to I/O?

I am not discounting that there might be some higher use-cases where 
this list might come of us - but I can't think of one right now and I 
can't comment on this proposal in absence of that understanding - sorry.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 0/5] increase port_id range
  2017-10-11 21:21  0%           ` Ferruh Yigit
@ 2017-10-12  1:33  0%             ` Yang, Zhiyong
  0 siblings, 0 replies; 200+ results
From: Yang, Zhiyong @ 2017-10-12  1:33 UTC (permalink / raw)
  To: Yigit, Ferruh, dev
  Cc: thomas, Nelio Laranjeiro, Gaetan Rivet, Doherty, Declan

Hi ferruh,

> >> Zhiyong Yang (5):
> >>   net/bonding: remove bonding APIs using ABI versioning
> >>   ethdev: increase port_id range
> >>   examples: increase port_id range
> >>   test: increase port_id range
> >>   librte_mbuf: modify port initialization value
> >
> > Series applied to dpdk-next-net/master, thanks.
> 
> Hi Zhiyong,
> 
> I can see there are more "uint8_t port_id" usage in testpmd:
> 
> $ git grep -c "uint8_t port_id"
> cmdline.c:93
> config.c:7
> testpmd.c:4
> testpmd.h:8
> 
> I believe there can be false-positives, but can you please check and send a fix
> patch if required?
> 

Ok.

thanks
Zhiyong

> Thanks,
> ferruh
> 
> <...>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v9 0/9] Policy Based Power Control for Guest
  2017-10-11 16:18  2% ` [dpdk-dev] [PATCH v9 " David Hunt
@ 2017-10-12  0:23  0%   ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-10-12  0:23 UTC (permalink / raw)
  To: David Hunt, dev; +Cc: konstantin.ananyev, jingjing.wu, santosh.shukla

On 10/11/2017 5:18 PM, David Hunt wrote:
> Policy Based Power Control for Guest
> 
> This patchset adds the facility for a guest VM to send a policy down to the
> host that will allow the host to scale up/down cpu frequencies
> depending on the policy criteria independently of the DPDK app running in
> the guest.  This differs from the previous vm_power implementation where
> individual scale up/down requests were send from the guest to the host via
> virtio-serial.
> 
> V9 patchset changes:
>   * Rebased on top of the tip of the master branch
>   * changed port_id from uint8 to uint16 due to changes elsewhere
> 
> V8 patchset changes:
>   * Added Ack's and Reviewed-by's to individual patches in the set so as to
>     keep patchwork A/R/T flags properly in sync.
> 
> V7 patchset changes:
>   * Changed return code of rte_pmd_i40e_query_vfid_by_mac() from an
>     int64_t to int
> 
> V6 patchset changes:
>   * Fixed comments in header for rte_pmd_i40e_query_vfid_by_mac.
>   * changed rte_pmd_i40e_query_vfid_by_mac return code from uint to int
>     as it can return negative error codes.
>   * Removed bool enum from channel_commands.h, including stdbool.h instead.
>   * Added #define VM_MAX_NAME_SZ 32 to channel_commands.h
>   * Renamed a few variables to be more readable.
>   * Added returns in a few places if failed to get info on domain.
>   * Fixed power_manager_init to keep track of num_freqs for each core.
>   * In power_manager_scale_core_med(), changed a hardcoded '5' to instead
>     be calculated from the centre of the frequency list
>     (global_core_freq_info[core_num].num_freqs / 2)
> 
> V5 patchset changes:
>   * Removed most of the #ifdef I40_PMD as it will be applicable to
>     other PMDs in the future.
>   * Changed the parameter of rte_pmd_i40e_query_vfid_by_mac from a uint64
>     to a const struct ether_addr *, rather than casting it later in the
>     function.
> 
> V4 patchset changes:
>   * None, re-post to mailing list under the correct email thread.
> 
> V3 patchset changes:
>   * Changed to using is_same_ether_addr() instead of looping through
>     the mac address bytes to compare them.
>   * Tweaked some comments and working in the i40e patch after review.
>   * Added a patch to the set to add new i40e function to map file, so
>     as to allow shared library builds. The power library API needs a cleanup
>     in next release, so will add API/ABI warning for this cleanup in a
>     separate patch.
> 
> V2 patchset changes:
>   * Removed API's in ethdev layer.
>   * Now just a single new API in the i40e driver for mapping VF MAC to
>     VF index.
>   * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
>   * Removed function for reading i40e register, moved to using the
>     standard stats API.
>   * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
>   * Cleaned up policy generation code.
> 
> It's a modification of the vm_power_manager app that runs in the host, and
> the guest_vm_power_app example app that runs in the guest. This allows the
> guest to send down a policy to the host via virtio-serial, which then allows
> the host to scale up/down based on the criteria in the policy, resulting in
> quicker scale up/down than individual requests coming from the guest.
> It also means that the DPDK application running in the guest does not need
> to be modified in any way, it is unaware that it's cores are being scaled
> up/down, reducing the effort in implementing a power-aware infrastructure.
> 
> The usage model is as follows:
> 1. Set up the VF's and assign to the guest in the usual way.
> 2. run vm_power_manager on the host, creating a channel to the guest.
> 3. Start the guest_vm_power_mgr app on the guest, which establishes
>    a virtio-serial channel to the host.
> 4. Send down the profile for the guest using the "send_profile now" command.
>    There is an example profile hard-coded into guest_vm_power_mgr.
> 5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
> 6. Send traffic into the VFs at varying traffic rates.
>    Observe the frequency change on the host (turbostat -i 1)
> 
> The sequence of code changes are as follows:
> 
> A new function has been aded to the i40e driver to allow mapping of
> a VF MAC to VF index.
> 
> Next we make an addition to librte_power that adds an extra command to allow
> the passing of a policy structure from the guest to the host. This struct
> contains information like busy/quiet hour, packet throughput thresholds, etc.
> 
> The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
> physical CPU (pcpu) IDs so that the host can scale up/down the cores used
> in the guest.
> 
> The remaining patches are functionality to process the policy, and take action
> when the relevant trigger occurs to cause a frequency change.

Applied to dpdk/master, thanks.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] eal: bus scan and probe never fail
  2017-10-10 16:00  3%               ` Aaron Conole
@ 2017-10-11 22:34  0%                 ` Thomas Monjalon
  2017-10-12 13:08  0%                   ` Aaron Conole
  2017-10-12  5:39  0%                 ` Shreyansh Jain
  1 sibling, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-11 22:34 UTC (permalink / raw)
  To: Aaron Conole; +Cc: dev, Shreyansh Jain, Don Provan, Jan Blunck, Hemant Agrawal

10/10/2017 18:00, Aaron Conole:
> Shreyansh Jain <shreyansh.jain@nxp.com> writes:
> 
> > Hello Don,
> >
> > On Monday 09 October 2017 11:51 PM, Don Provan wrote:
> >>> -----Original Message-----
> >>> From: Shreyansh Jain [mailto:shreyansh.jain@nxp.com]
> >>> Sent: Monday, October 09, 2017 4:10 AM
> >>> To: Jan Blunck <jblunck@infradead.org>; Thomas Monjalon
> >>> <thomas@monjalon.net>
> >>> Cc: dev <dev@dpdk.org>; Hemant Agrawal <hemant.agrawal@nxp.com>
> >>> Subject: Re: [dpdk-dev] [PATCH] eal: bus scan and probe never fail
> >>>
> >>> ...
> >>> This is where I have disagreement/doubt.
> >>> Reporting error code from rte_bus_scan would do two things:
> >>>
> >>> 1. rte_eal_init is not designed to ignore/log-only these errors - it
> >>> would quit initialization. (But, this can be changed)
> >>> 2. What should rte_eal_init do with this error? rte_bus_scan would have
> >>> already printed the problematic bus->scan() failure.
> >>
> >> These practical problems confirm to me that the failure of a bus
> >> scan is more of a strategic issue: when asking "which devices can
> >> I use?", "none" is a perfectly valid answer that does not seem
> >> like an error to me even when a failed bus scan is the reason for
> >> that answer.
> >
> > I agree with this.
> >
> >>
> >>  From the application's point of view, the potential error here
> >> is that the device it wants to use isn't available. I don't see that
> >> either the init function or the probe function will have enough
> >> information to understand that application-level problem, so
> >> they should leave it to the application to detect it.
> >
> > I think I understand you comment but just want to cross check again:
> > Scan or probe error should simply be ignored by EAL layer and let the
> > application take stance when it detects that the device it was looking
> > for is missing. Is my understanding correct?
> >
> > I am trying to come a conclusion so that this patch can either be
> > modified or pushed as it is. If the above understanding is correct, I
> > don't see any changes required in the patch.
> 
> Does it make sense to introduce a way to query the results of the
> various bus types for their status?  That way we can give the relevant
> information to the application if it wants, and make the bus scanning
> code *always* succeed?  This version shouldn't be an ABI breakage,
> either (confirm?).
> 
> half-baked below (not tested or suitable - just an example):

We are going to need notification callbacks for scan and probe anyway.
I think errors could be also notified with callbacks?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 0/5] increase port_id range
  2017-10-06  2:15  0%         ` [dpdk-dev] [PATCH v6 0/5] " Ferruh Yigit
                             ` (2 preceding siblings ...)
  2017-10-06 16:02  0%           ` Thomas Monjalon
@ 2017-10-11 21:21  0%           ` Ferruh Yigit
  2017-10-12  1:33  0%             ` Yang, Zhiyong
  3 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2017-10-11 21:21 UTC (permalink / raw)
  To: Zhiyong Yang, dev; +Cc: thomas, Nelio Laranjeiro, Gaetan Rivet, Declan Doherty

On 10/6/2017 3:15 AM, Ferruh Yigit wrote:
> On 9/29/2017 8:17 AM, Zhiyong Yang wrote:
>> port_id is currently defined as uint8_t, which is limited to the range
>> 0 to 255. A larger range is required for vdev scalability.
>>
>> It is necessary for a redefinition of port_id to extend it from
>> 1 bytes to 2 bytes. All ethdev APIs and usages related to port_id will
>> be changed at the same time.
>>
>> Discussion about port_id is the following thread.
>> http://www.dpdk.org/dev/patchwork/patch/23208/
>>
>> Changes in V2:
>> 1. cover more PMDs to increase port_id range.
>> 2. cover more examples to increase port_id range.
>> 3. add 17.11 release note.
>>
>> Changes in V3:
>> 1.  cover mlx4 and mlx5.
>> 2.  add to increase port_id range in test code.
>> 3.  The patch "librte_mbuf: modify port initialization value" is merged
>>     into the patchset.
>>
>> Changes in V4:
>> 1.  Add a patch to remove bonding APIs using ABI versioning according to
>>     Ferruh's comments.
>> 2.  Unify to use typedef portid_t in testpmd code.
>> 3.  update release note deprecation doc in 2/5
>> 4.  fix some issues according to comments.
>>
>> Changes in V5:
>> 1.  For 1/5, bond_mode_8023ad_conf_get_v1708() and bond_mode_8023ad_conf
>>     _get() are merged into one function bond_mode_8023ad_conf_get.
>>
>> Changes in V6:
>> 1.  For 2/5, remove the unnecessary LIBABIVER in Makefile and update
>>     the release notes "Shared Library Versions".
>>     Note: The patchset have dependency on the following patch.
>>     http://www.dpdk.org/dev/patchwork/patch/28738/
>>     http://www.dpdk.org/dev/patchwork/patch/29219/
>>
>> Note: 3/5 and 4/5 patches' building depends on 2/5 patch since 2/5 patch
>> breaks lib/PMD API/ABI.
>>
>> Zhiyong Yang (5):
>>   net/bonding: remove bonding APIs using ABI versioning
>>   ethdev: increase port_id range
>>   examples: increase port_id range
>>   test: increase port_id range
>>   librte_mbuf: modify port initialization value
> 
> Series applied to dpdk-next-net/master, thanks.

Hi Zhiyong,

I can see there are more "uint8_t port_id" usage in testpmd:

$ git grep -c "uint8_t port_id"
cmdline.c:93
config.c:7
testpmd.c:4
testpmd.h:8

I believe there can be false-positives, but can you please check and
send a fix patch if required?

Thanks,
ferruh

<...>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v1 1/7] ethdev: expose flow API error helper
  2017-10-11 11:56  5%     ` Adrien Mazarguil
@ 2017-10-11 19:05  5%       ` Aaron Conole
  2017-10-12 13:37  4%         ` Neil Horman
  2017-10-12 14:02  5%         ` Adrien Mazarguil
  0 siblings, 2 replies; 200+ results
From: Aaron Conole @ 2017-10-11 19:05 UTC (permalink / raw)
  To: Adrien Mazarguil
  Cc: Thomas Monjalon, dev, Ferruh Yigit, Gaetan Rivet, fbl, Neil Horman

Adrien Mazarguil <adrien.mazarguil@6wind.com> writes:

> On Wed, Oct 11, 2017 at 11:23:12AM +0200, Thomas Monjalon wrote:
>> 05/10/2017 11:49, Adrien Mazarguil:
>> > rte_flow_error_set() is a convenient helper to initialize error objects.
>> > 
>> > Since there is no fundamental reason to prevent applications from using it,
>> > expose it through the public interface after modifying its return value
>> > from positive to negative. This is done for consistency with the rest of
>> > the public interface.
>> > 
>> > Documentation is updated accordingly.
>> > 
>> > Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
>> > ---
>> > --- a/lib/librte_ether/rte_flow.h
>> > +++ b/lib/librte_ether/rte_flow.h
>> >  /**
>> > + * Initialize flow error structure.
>> > + *
>> > + * @param[out] error
>> > + *   Pointer to flow error structure (may be NULL).
>> > + * @param code
>> > + *   Related error code (rte_errno).
>> > + * @param type
>> > + *   Cause field and error types.
>> > + * @param cause
>> > + *   Object responsible for the error.
>> > + * @param message
>> > + *   Human-readable error message.
>> > + *
>> > + * @return
>> > + *   Negative error code (errno value) and rte_errno is set.
>> > + */
>> > +static inline int
>> > +rte_flow_error_set(struct rte_flow_error *error,
>> > +		   int code,
>> > +		   enum rte_flow_error_type type,
>> > +		   const void *cause,
>> > +		   const char *message)
>> 
>> When calling this function, the performance is not critical.
>> So it must not be an inline function.
>> Please move it to the .c file and add it to the .map file.
>
> I'll do it as part of moving this patch into my upcoming series for mlx4,
> since it relies on the new return value.
>
> Now for the record, I believe that static inlines, particularly short ones
> that are not expected to be modified any time soon (provided they are
> defined properly that is) are harmless.
>
> Yes, that means modifying them, depending on what they do, may cause a
> global ABI breakage of the underlying library which translates to a major
> version bump, however exactly the same applies to some macros (in particular
> the *_MAX ones), structure and other type definitions and so on.

Sure.  I think if it's small and there's never a chance for it to
change, then it's okay.  But, as you point out - they are similar to
macros in that they are code directly added to the application.  There
is never a way to fix a bug or adjust some semantic behavior without
requiring a recompile.  That's a strong kind of binding.  Certainly we
would want that communicated as ABI, regardless of which .h/.c file the
function exists, yes?

> What I'm getting at is, making this function part of the .map file won't
> help all that much with the goal of reaching a stable ABI. Making it a
> normal function on the other hand successfully prevents PMDs and
> applications from considering its use in their data plane (flow rules
> management from the data plane is likely the next step for rte_flow).

I don't understand this point well.  There are two things - committing
to a stable ABI, and communicating information about that ABI.  Having
.map files doesn't do anything for a stable ABI.  It merely
communicates information.  The stability must come from the developer
community and maintainers.

> In my opinion, performance (even if hypothetical) matters more than ABI
> stability, particularly since the current pattern is for the whole ABI to be
> broken every other release. I think that with DPDK, ABI stability can only
> be properly guaranteed in stable/maintenance releases but that effort is
> vain in the master branch, affected by way too many changes for it to ever
> become reality. This doesn't mean we shouldn't even try, however we
> shouldn't restrict ourselves; when the ABI needs to be broken, so be it.

First, performance isn't hypothetical.  You have code which performs,
and have measured various metrics to show this, or you don't have data.
No voodoo required.  Hypothetical isn't even an argument when it comes
to predictable devices (like computers).  In the case above, you have a
non-performance critical function.  It's an error function.  It passes
strings around.  Performance cannot be a consideration here.

Second, it depends on where you want to view the boundary.  If a change is
internal to DPDK (meaning, the application is never expected to interact
with that area of code), then it shouldn't be part of ABI and changing
it to your hearts content should be fine.

*rant-on*

I see lots of projects which use DPDK, but I only know of three or so
projects which don't directly embed a copy of the DPDK source
tree.  I think this is a side effect of not having a stable ABI - it's
not possible to rely on easily upgrading the library, so people just
pick a version and never upgrade.  That's bad for everyone.  It results
in fewer contributions, and difficulty getting people to participate.
There's too much text like "Install DPDK 1.8.0. With other versions is
not guaranted it works properly" that is embedded in downstream users
(that comes from an actual project README).  Even at DPDK summit in
Dublin, one of the most vocal opponents to ABI stability admitted that
his company takes the code and never contributes it back.  That is
really not friendly.

This even has a different side effect - one of market penetration.  It's
difficult for distributions to support this model.  So, there will be
one or two packages they might pick up, with one or two versions.
Everything else is "roll your own."  And when it's more difficult than
'apt-get|yum|dnf|foo install' then users don't use it, and the cycle
continues.

I'll point out that I can take a number of compiled binaries from 20
years ago[0], and run on a modern kernel.  I wish I could take a
binary linked to DPDK from 5 months ago, and run it with today's DPDK.
I believe that *should* be the goal.  I am confident it's achievable.
But, I recognize it's hard and requires extra effort.

Anyway, apologies if I took some bait here, and sorry that I ranted off
on my own.

> (end of rant, thanks for reading)

[0]: https://www.complang.tuwien.ac.at/anton/linux-binary-compatibility.html

^ permalink raw reply	[relevance 5%]

* [dpdk-dev] [PATCH v9 0/9] Policy Based Power Control for Guest
    2017-10-03 14:08  3% ` [dpdk-dev] [PATCH v3 0/9] Policy Based Power Control for Guest David Hunt
@ 2017-10-11 16:18  2% ` David Hunt
  2017-10-12  0:23  0%   ` Ferruh Yigit
  1 sibling, 1 reply; 200+ results
From: David Hunt @ 2017-10-11 16:18 UTC (permalink / raw)
  To: dev; +Cc: konstantin.ananyev, jingjing.wu, santosh.shukla

Policy Based Power Control for Guest

This patchset adds the facility for a guest VM to send a policy down to the
host that will allow the host to scale up/down cpu frequencies
depending on the policy criteria independently of the DPDK app running in
the guest.  This differs from the previous vm_power implementation where
individual scale up/down requests were send from the guest to the host via
virtio-serial.

V9 patchset changes:
  * Rebased on top of the tip of the master branch
  * changed port_id from uint8 to uint16 due to changes elsewhere

V8 patchset changes:
  * Added Ack's and Reviewed-by's to individual patches in the set so as to
    keep patchwork A/R/T flags properly in sync.

V7 patchset changes:
  * Changed return code of rte_pmd_i40e_query_vfid_by_mac() from an
    int64_t to int

V6 patchset changes:
  * Fixed comments in header for rte_pmd_i40e_query_vfid_by_mac.
  * changed rte_pmd_i40e_query_vfid_by_mac return code from uint to int
    as it can return negative error codes.
  * Removed bool enum from channel_commands.h, including stdbool.h instead.
  * Added #define VM_MAX_NAME_SZ 32 to channel_commands.h
  * Renamed a few variables to be more readable.
  * Added returns in a few places if failed to get info on domain.
  * Fixed power_manager_init to keep track of num_freqs for each core.
  * In power_manager_scale_core_med(), changed a hardcoded '5' to instead
    be calculated from the centre of the frequency list
    (global_core_freq_info[core_num].num_freqs / 2)

V5 patchset changes:
  * Removed most of the #ifdef I40_PMD as it will be applicable to
    other PMDs in the future.
  * Changed the parameter of rte_pmd_i40e_query_vfid_by_mac from a uint64
    to a const struct ether_addr *, rather than casting it later in the
    function.

V4 patchset changes:
  * None, re-post to mailing list under the correct email thread.

V3 patchset changes:
  * Changed to using is_same_ether_addr() instead of looping through
    the mac address bytes to compare them.
  * Tweaked some comments and working in the i40e patch after review.
  * Added a patch to the set to add new i40e function to map file, so
    as to allow shared library builds. The power library API needs a cleanup
    in next release, so will add API/ABI warning for this cleanup in a
    separate patch.

V2 patchset changes:
  * Removed API's in ethdev layer.
  * Now just a single new API in the i40e driver for mapping VF MAC to
    VF index.
  * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
  * Removed function for reading i40e register, moved to using the
    standard stats API.
  * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
  * Cleaned up policy generation code.

It's a modification of the vm_power_manager app that runs in the host, and
the guest_vm_power_app example app that runs in the guest. This allows the
guest to send down a policy to the host via virtio-serial, which then allows
the host to scale up/down based on the criteria in the policy, resulting in
quicker scale up/down than individual requests coming from the guest.
It also means that the DPDK application running in the guest does not need
to be modified in any way, it is unaware that it's cores are being scaled
up/down, reducing the effort in implementing a power-aware infrastructure.

The usage model is as follows:
1. Set up the VF's and assign to the guest in the usual way.
2. run vm_power_manager on the host, creating a channel to the guest.
3. Start the guest_vm_power_mgr app on the guest, which establishes
   a virtio-serial channel to the host.
4. Send down the profile for the guest using the "send_profile now" command.
   There is an example profile hard-coded into guest_vm_power_mgr.
5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
6. Send traffic into the VFs at varying traffic rates.
   Observe the frequency change on the host (turbostat -i 1)

The sequence of code changes are as follows:

A new function has been aded to the i40e driver to allow mapping of
a VF MAC to VF index.

Next we make an addition to librte_power that adds an extra command to allow
the passing of a policy structure from the guest to the host. This struct
contains information like busy/quiet hour, packet throughput thresholds, etc.

The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
physical CPU (pcpu) IDs so that the host can scale up/down the cores used
in the guest.

The remaining patches are functionality to process the policy, and take action
when the relevant trigger occurs to cause a frequency change.

[1/9] net/i40e: add API to convert VF MAC to VF id
[2/9] lib/librte_power: add extra msg type for policies
[3/9] examples/vm_power_mgr: add vcpu to pcpu mapping
[4/9] examples/vm_power_mgr: add scale to medium freq fn
[5/9] examples/vm_power_mgr: add policy to channels
[6/9] examples/vm_power_mgr: add port initialisation
[7/9] power: add send channel msg function to map file
[8/9] examples/guest_cli: add send policy to host
[9/9] examples/vm_power_mgr: set MAC address of VF

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [dpdk-techboard]  next techboard meeting (13th, October)
  2017-10-11 12:48  0%   ` [dpdk-dev] [dpdk-techboard] " Thomas Monjalon
@ 2017-10-11 12:53  0%     ` Wiles, Keith
  0 siblings, 0 replies; 200+ results
From: Wiles, Keith @ 2017-10-11 12:53 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: DPDK, techboard, Olivier MATZ



> On Oct 11, 2017, at 7:48 AM, Thomas Monjalon <thomas@monjalon.net> wrote:
> 
> 11/10/2017 14:41, Wiles, Keith:
>>> On Oct 11, 2017, at 4:36 AM, Olivier MATZ <olivier.matz@6wind.com> wrote:
>>> 1) ABI stability:
>>>   - one LTS per year
>>>   - 17.11 to be a LTS
>>>   - every new API has the "experimental" tag
>>>   - 3 Acks are needed for deprecation and they should come from different companies
>>> reference: http://dpdk.org/ml/archives/dev/2017-October/077937.html
>>> reference: http://dpdk.org/ml/archives/dev/2017-October/077935.html
>> 
>> I assume the person or company that pushes the notice can be one of the ACKs is this correct?
>> 
>> Also does the ACK need to come from a person working for a company or can this person be an independent developer? Maybe a very minor point, but someone that is working for a company could Ack independent of the company if so stated. Just be careful how you word the requirement, something like ‘Only one Ack per company or independent developer’ 
> 
> As an open community, we should avoid sorting people per company.
> I prefer talking about different areas of interest.
> Anyway considering acks is a matter of confidence.
> We cannot have strict rules, but we can provide some guidelines.

Sounds reasonable.

Regards,
Keith


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [dpdk-techboard]  next techboard meeting (13th, October)
  2017-10-11 12:41  0% ` Wiles, Keith
@ 2017-10-11 12:48  0%   ` Thomas Monjalon
  2017-10-11 12:53  0%     ` Wiles, Keith
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-11 12:48 UTC (permalink / raw)
  To: dev; +Cc: techboard, Wiles, Keith, Olivier MATZ

11/10/2017 14:41, Wiles, Keith:
> > On Oct 11, 2017, at 4:36 AM, Olivier MATZ <olivier.matz@6wind.com> wrote:
> > 1) ABI stability:
> >    - one LTS per year
> >    - 17.11 to be a LTS
> >    - every new API has the "experimental" tag
> >    - 3 Acks are needed for deprecation and they should come from different companies
> >  reference: http://dpdk.org/ml/archives/dev/2017-October/077937.html
> >  reference: http://dpdk.org/ml/archives/dev/2017-October/077935.html
> 
> I assume the person or company that pushes the notice can be one of the ACKs is this correct?
> 
> Also does the ACK need to come from a person working for a company or can this person be an independent developer? Maybe a very minor point, but someone that is working for a company could Ack independent of the company if so stated. Just be careful how you word the requirement, something like ‘Only one Ack per company or independent developer’ 

As an open community, we should avoid sorting people per company.
I prefer talking about different areas of interest.
Anyway considering acks is a matter of confidence.
We cannot have strict rules, but we can provide some guidelines.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] next techboard meeting (13th, October)
  2017-10-11  9:36  3% [dpdk-dev] next techboard meeting (13th, October) Olivier MATZ
@ 2017-10-11 12:41  0% ` Wiles, Keith
  2017-10-11 12:48  0%   ` [dpdk-dev] [dpdk-techboard] " Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Wiles, Keith @ 2017-10-11 12:41 UTC (permalink / raw)
  To: Olivier MATZ; +Cc: dev, techboard



> On Oct 11, 2017, at 4:36 AM, Olivier MATZ <olivier.matz@6wind.com> wrote:
> 
> Hi all,
> 
> The next techboard meeting will happen on IRC #dpdk-board, at 3pm UTC,
> this friday 13th of october.
> 
> The agenda is updated here:
>    https://annuel.framapad.org/p/r.0c3cc4d1e011214183872a98f6b5c7db
> 
> 
> 1) ABI stability:
>    - one LTS per year
>    - 17.11 to be a LTS
>    - every new API has the "experimental" tag
>    - 3 Acks are needed for deprecation and they should come from different companies
>  reference: http://dpdk.org/ml/archives/dev/2017-October/077937.html
>  reference: http://dpdk.org/ml/archives/dev/2017-October/077935.html

I assume the person or company that pushes the notice can be one of the ACKs is this correct?

Also does the ACK need to come from a person working for a company or can this person be an independent developer? Maybe a very minor point, but someone that is working for a company could Ack independent of the company if so stated. Just be careful how you word the requirement, something like ‘Only one Ack per company or independent developer’ 

> 
> 2) update on license discussion concerning the optimized version of 64bit division
> code from libdivide
>  - any feedback from governing board?
> 
> 3) update on IPSec offload (rte_security)
>  - the conclusion on this topic was to post concerns/proposals on dpdk-dev
>  - is there still something expected from techboard?
> 
> Olivier

Regards,
Keith


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v1 1/7] ethdev: expose flow API error helper
  @ 2017-10-11 11:56  5%     ` Adrien Mazarguil
  2017-10-11 19:05  5%       ` Aaron Conole
  0 siblings, 1 reply; 200+ results
From: Adrien Mazarguil @ 2017-10-11 11:56 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit, Gaetan Rivet, aconole, fbl

On Wed, Oct 11, 2017 at 11:23:12AM +0200, Thomas Monjalon wrote:
> 05/10/2017 11:49, Adrien Mazarguil:
> > rte_flow_error_set() is a convenient helper to initialize error objects.
> > 
> > Since there is no fundamental reason to prevent applications from using it,
> > expose it through the public interface after modifying its return value
> > from positive to negative. This is done for consistency with the rest of
> > the public interface.
> > 
> > Documentation is updated accordingly.
> > 
> > Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
> > ---
> > --- a/lib/librte_ether/rte_flow.h
> > +++ b/lib/librte_ether/rte_flow.h
> >  /**
> > + * Initialize flow error structure.
> > + *
> > + * @param[out] error
> > + *   Pointer to flow error structure (may be NULL).
> > + * @param code
> > + *   Related error code (rte_errno).
> > + * @param type
> > + *   Cause field and error types.
> > + * @param cause
> > + *   Object responsible for the error.
> > + * @param message
> > + *   Human-readable error message.
> > + *
> > + * @return
> > + *   Negative error code (errno value) and rte_errno is set.
> > + */
> > +static inline int
> > +rte_flow_error_set(struct rte_flow_error *error,
> > +		   int code,
> > +		   enum rte_flow_error_type type,
> > +		   const void *cause,
> > +		   const char *message)
> 
> When calling this function, the performance is not critical.
> So it must not be an inline function.
> Please move it to the .c file and add it to the .map file.

I'll do it as part of moving this patch into my upcoming series for mlx4,
since it relies on the new return value.

Now for the record, I believe that static inlines, particularly short ones
that are not expected to be modified any time soon (provided they are
defined properly that is) are harmless.

Yes, that means modifying them, depending on what they do, may cause a
global ABI breakage of the underlying library which translates to a major
version bump, however exactly the same applies to some macros (in particular
the *_MAX ones), structure and other type definitions and so on.

What I'm getting at is, making this function part of the .map file won't
help all that much with the goal of reaching a stable ABI. Making it a
normal function on the other hand successfully prevents PMDs and
applications from considering its use in their data plane (flow rules
management from the data plane is likely the next step for rte_flow).

In my opinion, performance (even if hypothetical) matters more than ABI
stability, particularly since the current pattern is for the whole ABI to be
broken every other release. I think that with DPDK, ABI stability can only
be properly guaranteed in stable/maintenance releases but that effort is
vain in the master branch, affected by way too many changes for it to ever
become reality. This doesn't mean we shouldn't even try, however we
shouldn't restrict ourselves; when the ABI needs to be broken, so be it.

(end of rant, thanks for reading)

-- 
Adrien Mazarguil
6WIND

^ permalink raw reply	[relevance 5%]

* [dpdk-dev] next techboard meeting (13th, October)
@ 2017-10-11  9:36  3% Olivier MATZ
  2017-10-11 12:41  0% ` Wiles, Keith
  0 siblings, 1 reply; 200+ results
From: Olivier MATZ @ 2017-10-11  9:36 UTC (permalink / raw)
  To: dev, techboard

Hi all,

The next techboard meeting will happen on IRC #dpdk-board, at 3pm UTC,
this friday 13th of october.

The agenda is updated here:
    https://annuel.framapad.org/p/r.0c3cc4d1e011214183872a98f6b5c7db


1) ABI stability:
    - one LTS per year
    - 17.11 to be a LTS
    - every new API has the "experimental" tag
    - 3 Acks are needed for deprecation and they should come from different companies
  reference: http://dpdk.org/ml/archives/dev/2017-October/077937.html
  reference: http://dpdk.org/ml/archives/dev/2017-October/077935.html

2) update on license discussion concerning the optimized version of 64bit division
code from libdivide
  - any feedback from governing board?

3) update on IPSec offload (rte_security)
  - the conclusion on this topic was to post concerns/proposals on dpdk-dev
  - is there still something expected from techboard?

Olivier

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2] ethdev: add return value to stats get dev op
    2017-10-09 16:12  4% ` [dpdk-dev] [PATCH 2/2] doc: update stats get API change Matan Azrad
@ 2017-10-10 20:20  1% ` Matan Azrad
  1 sibling, 0 replies; 200+ results
From: Matan Azrad @ 2017-10-10 20:20 UTC (permalink / raw)
  To: dev; +Cc: Ferruh Yigit

The stats_get dev op API doesn't include return value, so PMD cannot
return an error in case of failure at stats getting process time.

Since PCI devices can be removed and there is a time between the
physical removal to the RMV interrupt, the user may get invalid stats
without any indication.

This patch changes the stats_get API return value to be int instead of
void.

All the net PMDs stats_get dev ops are adjusted by this patch.

Signed-off-by: Matan Azrad <matan@mellanox.com>
---

V2:
Rebased patch with next_net master.
Adjusted dpaa, octeontx and mrvl PMDs.
Merged release notes patch.

 doc/guides/rel_notes/release_17_11.rst    |  6 ++++++
 drivers/net/af_packet/rte_eth_af_packet.c |  3 ++-
 drivers/net/ark/ark_ethdev.c              |  9 +++++----
 drivers/net/ark/ark_ext.h                 |  2 +-
 drivers/net/ark/ark_global.h              |  2 +-
 drivers/net/avp/avp_ethdev.c              |  6 ++++--
 drivers/net/bnx2x/bnx2x_ethdev.c          |  4 +++-
 drivers/net/bnxt/bnxt_stats.c             | 16 ++++++++++++----
 drivers/net/bnxt/bnxt_stats.h             |  2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c    |  4 +++-
 drivers/net/cxgbe/cxgbe_ethdev.c          |  3 ++-
 drivers/net/dpaa/dpaa_ethdev.c            |  3 ++-
 drivers/net/dpaa2/dpaa2_ethdev.c          | 10 +++++-----
 drivers/net/e1000/em_ethdev.c             |  7 ++++---
 drivers/net/e1000/igb_ethdev.c            | 14 ++++++++------
 drivers/net/ena/ena_ethdev.c              |  9 +++++----
 drivers/net/enic/enic.h                   |  2 +-
 drivers/net/enic/enic_ethdev.c            |  4 ++--
 drivers/net/enic/enic_main.c              |  8 +++++---
 drivers/net/failsafe/failsafe_ops.c       | 11 +++++++++--
 drivers/net/fm10k/fm10k_ethdev.c          |  3 ++-
 drivers/net/i40e/i40e_ethdev.c            |  5 +++--
 drivers/net/i40e/i40e_ethdev_vf.c         |  5 +++--
 drivers/net/ixgbe/ixgbe_ethdev.c          | 14 ++++++++------
 drivers/net/kni/rte_eth_kni.c             |  4 +++-
 drivers/net/liquidio/lio_ethdev.c         |  4 +++-
 drivers/net/mlx4/mlx4.h                   |  2 +-
 drivers/net/mlx4/mlx4_ethdev.c            |  3 ++-
 drivers/net/mlx5/mlx5.h                   |  2 +-
 drivers/net/mlx5/mlx5_stats.c             |  3 ++-
 drivers/net/mrvl/mrvl_ethdev.c            |  9 +++++++--
 drivers/net/nfp/nfp_net.c                 |  9 ++++++---
 drivers/net/null/rte_eth_null.c           |  6 ++++--
 drivers/net/octeontx/octeontx_ethdev.c    | 12 ++++++++----
 drivers/net/pcap/rte_eth_pcap.c           |  4 +++-
 drivers/net/qede/qede_ethdev.c            |  4 +++-
 drivers/net/ring/rte_eth_ring.c           |  4 +++-
 drivers/net/sfc/sfc_ethdev.c              |  7 +++++--
 drivers/net/szedata2/rte_eth_szedata2.c   |  4 +++-
 drivers/net/tap/rte_eth_tap.c             |  3 ++-
 drivers/net/thunderx/nicvf_ethdev.c       |  4 +++-
 drivers/net/vhost/rte_eth_vhost.c         |  4 +++-
 drivers/net/virtio/virtio_ethdev.c        |  6 ++++--
 drivers/net/vmxnet3/vmxnet3_ethdev.c      |  6 ++++--
 lib/librte_ether/rte_ethdev.c             |  3 +--
 lib/librte_ether/rte_ethdev.h             |  2 +-
 46 files changed, 169 insertions(+), 88 deletions(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index c184f1e..0513b95 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -216,6 +216,12 @@ API Changes
 * ``rte_mem_phy2mch`` was used in Xen dom0 to obtain the physical address;
   remove this API as Xen dom0 support was removed.
 
+* **Add return value to stats_get dev op API**
+
+  The ``stats_get`` dev op API return value has been changed to be int.
+  By this way PMDs can return an error value in case of failure at stats
+  getting process time.
+
 
 ABI Changes
 -----------
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index 295b7a7..46b8250 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -331,7 +331,7 @@ struct pmd_internals {
 	dev_info->min_rx_bufsize = 0;
 }
 
-static void
+static int
 eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *igb_stats)
 {
 	unsigned i, imax;
@@ -364,6 +364,7 @@ struct pmd_internals {
 	igb_stats->opackets = tx_total;
 	igb_stats->oerrors = tx_err_total;
 	igb_stats->obytes = tx_bytes_total;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c
index 0d60846..dae1f3d 100644
--- a/drivers/net/ark/ark_ethdev.c
+++ b/drivers/net/ark/ark_ethdev.c
@@ -65,7 +65,7 @@ static int eth_ark_dev_link_update(struct rte_eth_dev *dev,
 				   int wait_to_complete);
 static int eth_ark_dev_set_link_up(struct rte_eth_dev *dev);
 static int eth_ark_dev_set_link_down(struct rte_eth_dev *dev);
-static void eth_ark_dev_stats_get(struct rte_eth_dev *dev,
+static int eth_ark_dev_stats_get(struct rte_eth_dev *dev,
 				  struct rte_eth_stats *stats);
 static void eth_ark_dev_stats_reset(struct rte_eth_dev *dev);
 static void eth_ark_set_default_mac_addr(struct rte_eth_dev *dev,
@@ -241,7 +241,7 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 		(int (*)(struct rte_eth_dev *, void *))
 		dlsym(ark->d_handle, "dev_set_link_down");
 	ark->user_ext.stats_get =
-		(void (*)(struct rte_eth_dev *, struct rte_eth_stats *,
+		(int (*)(struct rte_eth_dev *, struct rte_eth_stats *,
 			  void *))
 		dlsym(ark->d_handle, "stats_get");
 	ark->user_ext.stats_reset =
@@ -816,7 +816,7 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	return 0;
 }
 
-static void
+static int
 eth_ark_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	uint16_t i;
@@ -835,8 +835,9 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	for (i = 0; i < dev->data->nb_rx_queues; i++)
 		eth_rx_queue_stats_get(dev->data->rx_queues[i], stats);
 	if (ark->user_ext.stats_get)
-		ark->user_ext.stats_get(dev, stats,
+		return ark->user_ext.stats_get(dev, stats,
 			ark->user_data[dev->data->port_id]);
+	return 0;
 }
 
 static void
diff --git a/drivers/net/ark/ark_ext.h b/drivers/net/ark/ark_ext.h
index 63b7a26..d26c819 100644
--- a/drivers/net/ark/ark_ext.h
+++ b/drivers/net/ark/ark_ext.h
@@ -91,7 +91,7 @@ int dev_set_link_up(struct rte_eth_dev *dev,
 int dev_set_link_down(struct rte_eth_dev *dev,
 		      void *user_data);
 
-void stats_get(struct rte_eth_dev *dev,
+int stats_get(struct rte_eth_dev *dev,
 	       struct rte_eth_stats *stats,
 	       void *user_data);
 
diff --git a/drivers/net/ark/ark_global.h b/drivers/net/ark/ark_global.h
index 2a6375f..aef2cf7 100644
--- a/drivers/net/ark/ark_global.h
+++ b/drivers/net/ark/ark_global.h
@@ -97,7 +97,7 @@ struct ark_user_ext {
 	int (*link_update)(struct rte_eth_dev *, int wait_to_complete, void *);
 	int (*dev_set_link_up)(struct rte_eth_dev *, void *);
 	int (*dev_set_link_down)(struct rte_eth_dev *, void *);
-	void (*stats_get)(struct rte_eth_dev *, struct rte_eth_stats *, void *);
+	int (*stats_get)(struct rte_eth_dev *, struct rte_eth_stats *, void *);
 	void (*stats_reset)(struct rte_eth_dev *, void *);
 	void (*mac_addr_add)(struct rte_eth_dev *,
 						  struct ether_addr *,
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index b5cc955..b97a90c 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -107,7 +107,7 @@ static uint16_t avp_xmit_pkts(void *tx_queue,
 static void avp_dev_rx_queue_release(void *rxq);
 static void avp_dev_tx_queue_release(void *txq);
 
-static void avp_dev_stats_get(struct rte_eth_dev *dev,
+static int avp_dev_stats_get(struct rte_eth_dev *dev,
 			      struct rte_eth_stats *stats);
 static void avp_dev_stats_reset(struct rte_eth_dev *dev);
 
@@ -2241,7 +2241,7 @@ struct avp_queue {
 	}
 }
 
-static void
+static int
 avp_dev_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)
 {
 	struct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
@@ -2274,6 +2274,8 @@ struct avp_queue {
 			stats->q_errors[i] += txq->errors;
 		}
 	}
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index 6f62a37..95861a0 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -329,7 +329,7 @@ struct rte_bnx2x_xstats_name_off {
 	return old_link_status == dev->data->dev_link.link_status ? -1 : 0;
 }
 
-static void
+static int
 bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct bnx2x_softc *sc = dev->data->dev_private;
@@ -389,6 +389,8 @@ struct rte_bnx2x_xstats_name_off {
 
 	stats->imissed = brb_drops + brb_truncates +
 			 brb_truncate_discard + stats->rx_nombuf;
+
+	return 0;
 }
 
 static int
diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c
index 87feac6..fe83d37 100644
--- a/drivers/net/bnxt/bnxt_stats.c
+++ b/drivers/net/bnxt/bnxt_stats.c
@@ -228,9 +228,10 @@ void bnxt_free_stats(struct bnxt *bp)
 	}
 }
 
-void bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
+int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
 			   struct rte_eth_stats *bnxt_stats)
 {
+	int rc = 0;
 	unsigned int i;
 	struct bnxt *bp = eth_dev->data->dev_private;
 
@@ -240,19 +241,26 @@ void bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
 		struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
 
-		bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
+		rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
 				     bnxt_stats, 1);
+		if (unlikely(rc))
+			return rc;
 	}
 
 	for (i = 0; i < bp->tx_cp_nr_rings; i++) {
 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
 		struct bnxt_cp_ring_info *cpr = txq->cp_ring;
 
-		bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
+		rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
 				     bnxt_stats, 0);
+		if (unlikely(rc))
+			return rc;
 	}
-	bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
+	rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
+	if (unlikely(rc))
+		return rc;
 	bnxt_stats->rx_nombuf = rte_atomic64_read(&bp->rx_mbuf_alloc_fail);
+	return rc;
 }
 
 void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
diff --git a/drivers/net/bnxt/bnxt_stats.h b/drivers/net/bnxt/bnxt_stats.h
index daeb3d9..51d16f5 100644
--- a/drivers/net/bnxt/bnxt_stats.h
+++ b/drivers/net/bnxt/bnxt_stats.h
@@ -37,7 +37,7 @@
 #include <rte_ethdev.h>
 
 void bnxt_free_stats(struct bnxt *bp);
-void bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
+int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
 			   struct rte_eth_stats *bnxt_stats);
 void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev);
 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 4bc5329..eb40348 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -2370,7 +2370,7 @@ struct bwg_slave {
 }
 
 
-static void
+static int
 bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct bond_dev_private *internals = dev->data->dev_private;
@@ -2398,6 +2398,8 @@ struct bwg_slave {
 		}
 
 	}
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index 7bca456..02b4f62 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -647,7 +647,7 @@ static void cxgbe_dev_rx_queue_release(void *q)
 /*
  * Get port statistics.
  */
-static void cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev,
+static int cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev,
 				struct rte_eth_stats *eth_stats)
 {
 	struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
@@ -690,6 +690,7 @@ static void cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev,
 		eth_stats->q_obytes[i] = txq->stats.tx_bytes;
 		eth_stats->q_errors[i] = txq->stats.mapping_err;
 	}
+	return 0;
 }
 
 /*
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 9f33e44..551da20 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -283,7 +283,7 @@ static int dpaa_eth_link_update(struct rte_eth_dev *dev,
 	return 0;
 }
 
-static void dpaa_eth_stats_get(struct rte_eth_dev *dev,
+static int dpaa_eth_stats_get(struct rte_eth_dev *dev,
 			       struct rte_eth_stats *stats)
 {
 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
@@ -291,6 +291,7 @@ static void dpaa_eth_stats_get(struct rte_eth_dev *dev,
 	PMD_INIT_FUNC_TRACE();
 
 	fman_if_stats_get(dpaa_intf->fif, stats);
+	return 0;
 }
 
 static void dpaa_eth_stats_reset(struct rte_eth_dev *dev)
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 39c32b3..1ac607c 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -1061,7 +1061,7 @@ static int dpaa2_dev_link_update(struct rte_eth_dev *dev,
 			"error: Setting the MAC ADDR failed %d\n", ret);
 }
 static
-void dpaa2_dev_stats_get(struct rte_eth_dev *dev,
+int dpaa2_dev_stats_get(struct rte_eth_dev *dev,
 			 struct rte_eth_stats *stats)
 {
 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
@@ -1076,12 +1076,12 @@ void dpaa2_dev_stats_get(struct rte_eth_dev *dev,
 
 	if (!dpni) {
 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
-		return;
+		return -EINVAL;
 	}
 
 	if (!stats) {
 		RTE_LOG(ERR, PMD, "stats is NULL\n");
-		return;
+		return -EINVAL;
 	}
 
 	/*Get Counters from page_0*/
@@ -1116,11 +1116,11 @@ void dpaa2_dev_stats_get(struct rte_eth_dev *dev,
 	stats->oerrors = value.page_2.egress_discarded_frames;
 	stats->imissed = value.page_2.ingress_nobuffer_discards;
 
-	return;
+	return 0;
 
 err:
 	RTE_LOG(ERR, PMD, "Operation not completed:Error Code = %d\n", retcode);
-	return;
+	return retcode;
 };
 
 static int
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index a59947d..e724205 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -72,7 +72,7 @@
 static void eth_em_allmulticast_disable(struct rte_eth_dev *dev);
 static int eth_em_link_update(struct rte_eth_dev *dev,
 				int wait_to_complete);
-static void eth_em_stats_get(struct rte_eth_dev *dev,
+static int eth_em_stats_get(struct rte_eth_dev *dev,
 				struct rte_eth_stats *rte_stats);
 static void eth_em_stats_reset(struct rte_eth_dev *dev);
 static void eth_em_infos_get(struct rte_eth_dev *dev,
@@ -906,7 +906,7 @@ static int eth_em_pci_remove(struct rte_pci_device *pci_dev)
 }
 
 /* This function is based on em_update_stats_counters() in e1000/if_em.c */
-static void
+static int
 eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)
 {
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1006,7 +1006,7 @@ static int eth_em_pci_remove(struct rte_pci_device *pci_dev)
 	}
 
 	if (rte_stats == NULL)
-		return;
+		return -EINVAL;
 
 	/* Rx Errors */
 	rte_stats->imissed = stats->mpc;
@@ -1021,6 +1021,7 @@ static int eth_em_pci_remove(struct rte_pci_device *pci_dev)
 	rte_stats->opackets = stats->gptc;
 	rte_stats->ibytes   = stats->gorc;
 	rte_stats->obytes   = stats->gotc;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 040dd9f..f3b1d70 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -112,7 +112,7 @@
 static void eth_igb_allmulticast_disable(struct rte_eth_dev *dev);
 static int  eth_igb_link_update(struct rte_eth_dev *dev,
 				int wait_to_complete);
-static void eth_igb_stats_get(struct rte_eth_dev *dev,
+static int eth_igb_stats_get(struct rte_eth_dev *dev,
 				struct rte_eth_stats *rte_stats);
 static int eth_igb_xstats_get(struct rte_eth_dev *dev,
 			      struct rte_eth_xstat *xstats, unsigned n);
@@ -188,7 +188,7 @@ static void eth_igb_default_mac_addr_set(struct rte_eth_dev *dev,
 static void igbvf_allmulticast_enable(struct rte_eth_dev *dev);
 static void igbvf_allmulticast_disable(struct rte_eth_dev *dev);
 static int eth_igbvf_link_update(struct e1000_hw *hw);
-static void eth_igbvf_stats_get(struct rte_eth_dev *dev,
+static int eth_igbvf_stats_get(struct rte_eth_dev *dev,
 				struct rte_eth_stats *rte_stats);
 static int eth_igbvf_xstats_get(struct rte_eth_dev *dev,
 				struct rte_eth_xstat *xstats, unsigned n);
@@ -1830,7 +1830,7 @@ static int eth_igbvf_pci_remove(struct rte_pci_device *pci_dev)
 	stats->tsctfc += E1000_READ_REG(hw, E1000_TSCTFC);
 }
 
-static void
+static int
 eth_igb_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)
 {
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1840,7 +1840,7 @@ static int eth_igbvf_pci_remove(struct rte_pci_device *pci_dev)
 	igb_read_stats_registers(hw, stats);
 
 	if (rte_stats == NULL)
-		return;
+		return -EINVAL;
 
 	/* Rx Errors */
 	rte_stats->imissed = stats->mpc;
@@ -1855,6 +1855,7 @@ static int eth_igbvf_pci_remove(struct rte_pci_device *pci_dev)
 	rte_stats->opackets = stats->gptc;
 	rte_stats->ibytes   = stats->gorc;
 	rte_stats->obytes   = stats->gotc;
+	return 0;
 }
 
 static void
@@ -2095,7 +2096,7 @@ static int eth_igbvf_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	return IGBVF_NB_XSTATS;
 }
 
-static void
+static int
 eth_igbvf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)
 {
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -2105,12 +2106,13 @@ static int eth_igbvf_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	igbvf_read_stats_registers(hw, hw_stats);
 
 	if (rte_stats == NULL)
-		return;
+		return -EINVAL;
 
 	rte_stats->ipackets = hw_stats->gprc;
 	rte_stats->ibytes = hw_stats->gorc;
 	rte_stats->opackets = hw_stats->gptc;
 	rte_stats->obytes = hw_stats->gotc;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index 80ce1f3..a62c398 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -205,7 +205,7 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue,
 static int ena_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
 static int ena_start(struct rte_eth_dev *dev);
 static void ena_close(struct rte_eth_dev *dev);
-static void ena_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);
+static int ena_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);
 static void ena_rx_queue_release_all(struct rte_eth_dev *dev);
 static void ena_tx_queue_release_all(struct rte_eth_dev *dev);
 static void ena_rx_queue_release(void *queue);
@@ -811,7 +811,7 @@ static void ena_stats_restart(struct rte_eth_dev *dev)
 	rte_atomic64_init(&adapter->drv_stats->rx_nombuf);
 }
 
-static void ena_stats_get(struct rte_eth_dev *dev,
+static int ena_stats_get(struct rte_eth_dev *dev,
 			  struct rte_eth_stats *stats)
 {
 	struct ena_admin_basic_stats ena_stats;
@@ -821,13 +821,13 @@ static void ena_stats_get(struct rte_eth_dev *dev,
 	int rc;
 
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-		return;
+		return -ENOTSUP;
 
 	memset(&ena_stats, 0, sizeof(ena_stats));
 	rc = ena_com_get_dev_basic_stats(ena_dev, &ena_stats);
 	if (unlikely(rc)) {
 		RTE_LOG(ERR, PMD, "Could not retrieve statistics from ENA");
-		return;
+		return rc;
 	}
 
 	/* Set of basic statistics from ENA */
@@ -846,6 +846,7 @@ static void ena_stats_get(struct rte_eth_dev *dev,
 	stats->ierrors = rte_atomic64_read(&adapter->drv_stats->ierrors);
 	stats->oerrors = rte_atomic64_read(&adapter->drv_stats->oerrors);
 	stats->rx_nombuf = rte_atomic64_read(&adapter->drv_stats->rx_nombuf);
+	return 0;
 }
 
 static int ena_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h
index e28f223..da0c176 100644
--- a/drivers/net/enic/enic.h
+++ b/drivers/net/enic/enic.h
@@ -287,7 +287,7 @@ extern int enic_alloc_rq(struct enic *enic, uint16_t queue_idx,
 extern int enic_disable(struct enic *enic);
 extern void enic_remove(struct enic *enic);
 extern int enic_get_link_status(struct enic *enic);
-extern void enic_dev_stats_get(struct enic *enic,
+extern int enic_dev_stats_get(struct enic *enic,
 	struct rte_eth_stats *r_stats);
 extern void enic_dev_stats_clear(struct enic *enic);
 extern void enic_add_packet_filter(struct enic *enic);
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index 33a3f87..5386b2a 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -468,13 +468,13 @@ static int enicpmd_dev_link_update(struct rte_eth_dev *eth_dev,
 	return enic_link_update(enic);
 }
 
-static void enicpmd_dev_stats_get(struct rte_eth_dev *eth_dev,
+static int enicpmd_dev_stats_get(struct rte_eth_dev *eth_dev,
 	struct rte_eth_stats *stats)
 {
 	struct enic *enic = pmd_priv(eth_dev);
 
 	ENICPMD_FUNC_TRACE();
-	enic_dev_stats_get(enic, stats);
+	return enic_dev_stats_get(enic, stats);
 }
 
 static void enicpmd_dev_stats_reset(struct rte_eth_dev *eth_dev)
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index 9b0439b..48cfb82 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -156,16 +156,17 @@ void enic_dev_stats_clear(struct enic *enic)
 	enic_clear_soft_stats(enic);
 }
 
-void enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
+int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
 {
 	struct vnic_stats *stats;
 	struct enic_soft_stats *soft_stats = &enic->soft_stats;
 	int64_t rx_truncated;
 	uint64_t rx_packet_errors;
+	int ret = vnic_dev_stats_dump(enic->vdev, &stats);
 
-	if (vnic_dev_stats_dump(enic->vdev, &stats)) {
+	if (ret) {
 		dev_err(enic, "Error in getting stats\n");
-		return;
+		return ret;
 	}
 
 	/* The number of truncated packets can only be calculated by
@@ -191,6 +192,7 @@ void enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
 	r_stats->imissed = stats->rx.rx_no_bufs + rx_truncated;
 
 	r_stats->rx_nombuf = rte_atomic64_read(&soft_stats->rx_nombuf);
+	return 0;
 }
 
 void enic_del_mac_address(struct enic *enic, int mac_index)
diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c
index e0f1b0b..d360965 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -582,18 +582,25 @@
 	return -1;
 }
 
-static void
+static int
 fs_stats_get(struct rte_eth_dev *dev,
 	     struct rte_eth_stats *stats)
 {
 	struct sub_device *sdev;
 	uint8_t i;
+	int ret;
 
 	rte_memcpy(stats, &PRIV(dev)->stats_accumulator, sizeof(*stats));
 	FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
-		rte_eth_stats_get(PORT_ID(sdev), &sdev->stats_snapshot);
+		ret = rte_eth_stats_get(PORT_ID(sdev), &sdev->stats_snapshot);
+		if (ret) {
+			ERROR("Operation rte_eth_stats_get failed for sub_device %d with error %d",
+				  i, ret);
+			return ret;
+		}
 		failsafe_stats_increment(stats, &sdev->stats_snapshot);
 	}
+	return 0;
 }
 
 static void
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index 15ea2a5..2d351c1 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -1346,7 +1346,7 @@ static int fm10k_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	return FM10K_NB_XSTATS;
 }
 
-static void
+static int
 fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	uint64_t ipackets, opackets, ibytes, obytes;
@@ -1376,6 +1376,7 @@ static int fm10k_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	stats->opackets = opackets;
 	stats->ibytes = ibytes;
 	stats->obytes = obytes;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 536365d..f7dfb97 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -258,7 +258,7 @@
 static void i40e_dev_allmulticast_disable(struct rte_eth_dev *dev);
 static int i40e_dev_set_link_up(struct rte_eth_dev *dev);
 static int i40e_dev_set_link_down(struct rte_eth_dev *dev);
-static void i40e_dev_stats_get(struct rte_eth_dev *dev,
+static int i40e_dev_stats_get(struct rte_eth_dev *dev,
 			       struct rte_eth_stats *stats);
 static int i40e_dev_xstats_get(struct rte_eth_dev *dev,
 			       struct rte_eth_xstat *xstats, unsigned n);
@@ -2728,7 +2728,7 @@ static inline void i40e_GLQF_reg_init(struct i40e_hw *hw)
 }
 
 /* Get all statistics of a port */
-static void
+static int
 i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
@@ -2828,6 +2828,7 @@ static inline void i40e_GLQF_reg_init(struct i40e_hw *hw)
 		    ns->checksum_error);
 	PMD_DRV_LOG(DEBUG, "fdir_match:               %"PRIu64"", ns->fd_sb_match);
 	PMD_DRV_LOG(DEBUG, "***************** PF stats end ********************");
+	return 0;
 }
 
 /* Reset the statistics */
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 111ac39..a52321a 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -108,7 +108,7 @@ static void i40evf_dev_info_get(struct rte_eth_dev *dev,
 				struct rte_eth_dev_info *dev_info);
 static int i40evf_dev_link_update(struct rte_eth_dev *dev,
 				  int wait_to_complete);
-static void i40evf_dev_stats_get(struct rte_eth_dev *dev,
+static int i40evf_dev_stats_get(struct rte_eth_dev *dev,
 				struct rte_eth_stats *stats);
 static int i40evf_dev_xstats_get(struct rte_eth_dev *dev,
 				 struct rte_eth_xstat *xstats, unsigned n);
@@ -2230,7 +2230,7 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)
 	};
 }
 
-static void
+static int
 i40evf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	int ret;
@@ -2253,6 +2253,7 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)
 	} else {
 		PMD_DRV_LOG(ERR, "Get statistics failed");
 	}
+	return ret;
 }
 
 static void
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index a7d7acc..d22d7ac 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -176,7 +176,7 @@
 static void ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev);
 static int ixgbe_dev_link_update(struct rte_eth_dev *dev,
 				int wait_to_complete);
-static void ixgbe_dev_stats_get(struct rte_eth_dev *dev,
+static int ixgbe_dev_stats_get(struct rte_eth_dev *dev,
 				struct rte_eth_stats *stats);
 static int ixgbe_dev_xstats_get(struct rte_eth_dev *dev,
 				struct rte_eth_xstat *xstats, unsigned n);
@@ -269,7 +269,7 @@ static int ixgbevf_dev_link_update(struct rte_eth_dev *dev,
 static int  ixgbevf_dev_reset(struct rte_eth_dev *dev);
 static void ixgbevf_intr_disable(struct ixgbe_hw *hw);
 static void ixgbevf_intr_enable(struct ixgbe_hw *hw);
-static void ixgbevf_dev_stats_get(struct rte_eth_dev *dev,
+static int ixgbevf_dev_stats_get(struct rte_eth_dev *dev,
 		struct rte_eth_stats *stats);
 static void ixgbevf_dev_stats_reset(struct rte_eth_dev *dev);
 static int ixgbevf_vlan_filter_set(struct rte_eth_dev *dev,
@@ -3104,7 +3104,7 @@ static int eth_ixgbevf_pci_remove(struct rte_pci_device *pci_dev)
 /*
  * This function is based on ixgbe_update_stats_counters() in ixgbe/ixgbe.c
  */
-static void
+static int
 ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct ixgbe_hw *hw =
@@ -3126,7 +3126,7 @@ static int eth_ixgbevf_pci_remove(struct rte_pci_device *pci_dev)
 			&total_qbrc, &total_qprc, &total_qprdc);
 
 	if (stats == NULL)
-		return;
+		return -EINVAL;
 
 	/* Fill out the rte_eth_stats statistics structure */
 	stats->ipackets = total_qprc;
@@ -3157,6 +3157,7 @@ static int eth_ixgbevf_pci_remove(struct rte_pci_device *pci_dev)
 
 	/* Tx Errors */
 	stats->oerrors  = 0;
+	return 0;
 }
 
 static void
@@ -3568,7 +3569,7 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	return IXGBEVF_NB_XSTATS;
 }
 
-static void
+static int
 ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct ixgbevf_hw_stats *hw_stats = (struct ixgbevf_hw_stats *)
@@ -3577,12 +3578,13 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 	ixgbevf_update_stats(dev);
 
 	if (stats == NULL)
-		return;
+		return -EINVAL;
 
 	stats->ipackets = hw_stats->vfgprc;
 	stats->ibytes = hw_stats->vfgorc;
 	stats->opackets = hw_stats->vfgptc;
 	stats->obytes = hw_stats->vfgotc;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c
index 72a2733..d290c79 100644
--- a/drivers/net/kni/rte_eth_kni.c
+++ b/drivers/net/kni/rte_eth_kni.c
@@ -283,7 +283,7 @@ struct pmd_internals {
 	return 0;
 }
 
-static void
+static int
 eth_kni_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	unsigned long rx_packets_total = 0, rx_bytes_total = 0;
@@ -320,6 +320,8 @@ struct pmd_internals {
 	stats->opackets = tx_packets_total;
 	stats->obytes = tx_bytes_total;
 	stats->oerrors = tx_packets_err_total;
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c
index a3c8e67..5407e39 100644
--- a/drivers/net/liquidio/lio_ethdev.c
+++ b/drivers/net/liquidio/lio_ethdev.c
@@ -311,7 +311,7 @@ struct rte_lio_xstats_name_off {
 }
 
 /* Retrieve the device statistics (# packets in/out, # bytes in/out, etc */
-static void
+static int
 lio_dev_stats_get(struct rte_eth_dev *eth_dev,
 		  struct rte_eth_stats *stats)
 {
@@ -359,6 +359,8 @@ struct rte_lio_xstats_name_off {
 	stats->ibytes = bytes;
 	stats->ipackets = pkts;
 	stats->ierrors = drop;
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index 93e5502..9bd2acc 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -117,7 +117,7 @@ struct priv {
 int mlx4_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
 int mlx4_dev_set_link_down(struct rte_eth_dev *dev);
 int mlx4_dev_set_link_up(struct rte_eth_dev *dev);
-void mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);
+int mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);
 void mlx4_stats_reset(struct rte_eth_dev *dev);
 void mlx4_dev_infos_get(struct rte_eth_dev *dev,
 			struct rte_eth_dev_info *info);
diff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c
index a9e8059..8962be1 100644
--- a/drivers/net/mlx4/mlx4_ethdev.c
+++ b/drivers/net/mlx4/mlx4_ethdev.c
@@ -571,7 +571,7 @@
  * @param[out] stats
  *   Stats structure output buffer.
  */
-void
+int
 mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct rte_eth_stats tmp;
@@ -613,6 +613,7 @@
 		tmp.oerrors += txq->stats.odropped;
 	}
 	*stats = tmp;
+	return 0;
 }
 
 /**
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 643bab6..bcdcc26 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -236,7 +236,7 @@ int mlx5_dev_rss_reta_update(struct rte_eth_dev *,
 /* mlx5_stats.c */
 
 void priv_xstats_init(struct priv *);
-void mlx5_stats_get(struct rte_eth_dev *, struct rte_eth_stats *);
+int mlx5_stats_get(struct rte_eth_dev *, struct rte_eth_stats *);
 void mlx5_stats_reset(struct rte_eth_dev *);
 int mlx5_xstats_get(struct rte_eth_dev *,
 		    struct rte_eth_xstat *, unsigned int);
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
index 6b4772c..5e225d3 100644
--- a/drivers/net/mlx5/mlx5_stats.c
+++ b/drivers/net/mlx5/mlx5_stats.c
@@ -318,7 +318,7 @@ struct mlx5_counter_ctrl {
  * @param[out] stats
  *   Stats structure output buffer.
  */
-void
+int
 mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct priv *priv = mlx5_get_priv(dev);
@@ -373,6 +373,7 @@ struct mlx5_counter_ctrl {
 #endif
 	*stats = tmp;
 	priv_unlock(priv);
+	return 0;
 }
 
 /**
diff --git a/drivers/net/mrvl/mrvl_ethdev.c b/drivers/net/mrvl/mrvl_ethdev.c
index 46879a4..4beaa1d 100644
--- a/drivers/net/mrvl/mrvl_ethdev.c
+++ b/drivers/net/mrvl/mrvl_ethdev.c
@@ -845,8 +845,11 @@ struct mrvl_txq {
  *   Pointer to Ethernet device structure.
  * @param stats
  *   Stats structure output buffer.
+ *
+ * @return
+ *   0 on success, negative error value otherwise.
  */
-static void
+static int
 mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct mrvl_priv *priv = dev->data->dev_private;
@@ -919,7 +922,7 @@ struct mrvl_txq {
 	ret = pp2_ppio_get_statistics(priv->ppio, &ppio_stats, 0);
 	if (unlikely(ret)) {
 		RTE_LOG(ERR, PMD, "Failed to update port statistics\n");
-		return;
+		return ret;
 	}
 
 	stats->ipackets += ppio_stats.rx_packets - drop_mac;
@@ -930,6 +933,8 @@ struct mrvl_txq {
 			  ppio_stats.rx_fifo_dropped +
 			  ppio_stats.rx_cls_dropped;
 	stats->ierrors = drop_mac;
+
+	return 0;
 }
 
 /**
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 4ef9d2b..0917b9c 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -88,7 +88,7 @@ static int nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 				  uint16_t nb_desc, unsigned int socket_id,
 				  const struct rte_eth_txconf *tx_conf);
 static int nfp_net_start(struct rte_eth_dev *dev);
-static void nfp_net_stats_get(struct rte_eth_dev *dev,
+static int nfp_net_stats_get(struct rte_eth_dev *dev,
 			      struct rte_eth_stats *stats);
 static void nfp_net_stats_reset(struct rte_eth_dev *dev);
 static void nfp_net_stop(struct rte_eth_dev *dev);
@@ -1027,7 +1027,7 @@ enum nfp_qcp_ptr {
 	return -1;
 }
 
-static void
+static int
 nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	int i;
@@ -1113,8 +1113,11 @@ enum nfp_qcp_ptr {
 
 	nfp_dev_stats.imissed -= hw->eth_stats_base.imissed;
 
-	if (stats)
+	if (stats) {
 		memcpy(stats, &nfp_dev_stats, sizeof(*stats));
+		return 0;
+	}
+	return -EINVAL;
 }
 
 static void
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c
index fa9313d..47c7b14 100644
--- a/drivers/net/null/rte_eth_null.c
+++ b/drivers/net/null/rte_eth_null.c
@@ -298,7 +298,7 @@ struct pmd_internals {
 	dev_info->flow_type_rss_offloads = internals->flow_type_rss_offloads;
 }
 
-static void
+static int
 eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *igb_stats)
 {
 	unsigned i, num_stats;
@@ -306,7 +306,7 @@ struct pmd_internals {
 	const struct pmd_internals *internal;
 
 	if ((dev == NULL) || (igb_stats == NULL))
-		return;
+		return -EINVAL;
 
 	internal = dev->data->dev_private;
 	num_stats = RTE_MIN((unsigned)RTE_ETHDEV_QUEUE_STAT_CNTRS,
@@ -333,6 +333,8 @@ struct pmd_internals {
 	igb_stats->ipackets = rx_total;
 	igb_stats->opackets = tx_total;
 	igb_stats->oerrors = tx_err_total;
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c
index d41904f..d5f236e 100644
--- a/drivers/net/octeontx/octeontx_ethdev.c
+++ b/drivers/net/octeontx/octeontx_ethdev.c
@@ -199,7 +199,7 @@ enum octeontx_link_speed {
 			nic->port_id, en ? "set" : "unset");
 }
 
-static void
+static int
 octeontx_port_stats(struct octeontx_nic *nic, struct rte_eth_stats *stats)
 {
 	octeontx_mbox_bgx_port_stats_t bgx_stats;
@@ -208,8 +208,10 @@ enum octeontx_link_speed {
 	PMD_INIT_FUNC_TRACE();
 
 	res = octeontx_bgx_port_stats(nic->port_id, &bgx_stats);
-	if (res < 0)
+	if (res < 0) {
 		octeontx_log_err("failed to get port stats %d", nic->port_id);
+		return res;
+	}
 
 	stats->ipackets = bgx_stats.rx_packets;
 	stats->ibytes = bgx_stats.rx_bytes;
@@ -221,6 +223,8 @@ enum octeontx_link_speed {
 
 	octeontx_log_dbg("port %d get stats done inpkts=%ld outpkts=%ld",
 			nic->port_id, stats->ipackets, stats->opackets);
+
+	return 0;
 }
 
 static void
@@ -574,13 +578,13 @@ enum octeontx_link_speed {
 	return octeontx_atomic_write_link_status(dev, &link);
 }
 
-static void
+static int
 octeontx_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct octeontx_nic *nic = octeontx_pmd_priv(dev);
 
 	PMD_INIT_FUNC_TRACE();
-	octeontx_port_stats(nic, stats);
+	return octeontx_port_stats(nic, stats);
 }
 
 static void
diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index b51f16c..1b8a74e 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -560,7 +560,7 @@ struct pmd_devargs {
 	dev_info->min_rx_bufsize = 0;
 }
 
-static void
+static int
 eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	unsigned int i;
@@ -592,6 +592,8 @@ struct pmd_devargs {
 	stats->opackets = tx_packets_total;
 	stats->obytes = tx_bytes_total;
 	stats->oerrors = tx_packets_err_total;
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index fe130d4..a238781 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1460,7 +1460,7 @@ static void qede_dev_close(struct rte_eth_dev *eth_dev)
 		rte_eal_alarm_cancel(qede_poll_sp_sb_cb, (void *)eth_dev);
 }
 
-static void
+static int
 qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)
 {
 	struct qede_dev *qdev = eth_dev->data->dev_private;
@@ -1544,6 +1544,8 @@ static void qede_dev_close(struct rte_eth_dev *eth_dev)
 		if (j == txq_stat_cntrs)
 			break;
 	}
+
+	return 0;
 }
 
 static unsigned
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index e3fa7b0..61473ca 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -190,7 +190,7 @@ struct pmd_internals {
 	dev_info->min_rx_bufsize = 0;
 }
 
-static void
+static int
 eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	unsigned i;
@@ -214,6 +214,8 @@ struct pmd_internals {
 	stats->ipackets = rx_total;
 	stats->opackets = tx_total;
 	stats->oerrors = tx_err_total;
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 7a57472..5b089dc 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -521,16 +521,18 @@
 	sfc_adapter_unlock(sa);
 }
 
-static void
+static int
 sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_port *port = &sa->port;
 	uint64_t *mac_stats;
+	int ret;
 
 	rte_spinlock_lock(&port->mac_stats_lock);
 
-	if (sfc_port_update_mac_stats(sa) != 0)
+	ret = sfc_port_update_mac_stats(sa);
+	if (ret != 0)
 		goto unlock;
 
 	mac_stats = port->mac_stats_buf;
@@ -587,6 +589,7 @@
 
 unlock:
 	rte_spinlock_unlock(&port->mac_stats_lock);
+	return ret;
 }
 
 static void
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index d141acf..c5486b7 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -1042,7 +1042,7 @@ struct pmd_internals {
 	dev_info->speed_capa = ETH_LINK_SPEED_100G;
 }
 
-static void
+static int
 eth_stats_get(struct rte_eth_dev *dev,
 		struct rte_eth_stats *stats)
 {
@@ -1077,6 +1077,8 @@ struct pmd_internals {
 	stats->ibytes = rx_total_bytes;
 	stats->obytes = tx_total_bytes;
 	stats->oerrors = tx_err_total;
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index 52380b4..61c6774 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -687,7 +687,7 @@ enum ioctl_mode {
 		 DEV_TX_OFFLOAD_TCP_CKSUM);
 }
 
-static void
+static int
 tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats)
 {
 	unsigned int i, imax;
@@ -728,6 +728,7 @@ enum ioctl_mode {
 	tap_stats->opackets = tx_total;
 	tap_stats->oerrors = tx_err_total;
 	tap_stats->obytes = tx_bytes_total;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
index 4654a4c..551b371 100644
--- a/drivers/net/thunderx/nicvf_ethdev.c
+++ b/drivers/net/thunderx/nicvf_ethdev.c
@@ -242,7 +242,7 @@ static void nicvf_vf_stop(struct rte_eth_dev *dev, struct nicvf *nic,
 	return -ENOTSUP;
 }
 
-static void
+static int
 nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	uint16_t qidx;
@@ -332,6 +332,8 @@ static void nicvf_vf_stop(struct rte_eth_dev *dev, struct nicvf *nic,
 	stats->opackets += port_stats.tx_bcast_frames_ok;
 	stats->opackets += port_stats.tx_mcast_frames_ok;
 	stats->oerrors = port_stats.tx_drops;
+
+	return 0;
 }
 
 static const uint32_t *
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 04179b4..3534649 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -890,7 +890,7 @@ struct vhost_xstats_name_off {
 	dev_info->min_rx_bufsize = 0;
 }
 
-static void
+static int
 eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	unsigned i;
@@ -928,6 +928,8 @@ struct vhost_xstats_name_off {
 	stats->oerrors = tx_missed_total;
 	stats->ibytes = rx_total_bytes;
 	stats->obytes = tx_total_bytes;
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index e320811..8660074 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -76,7 +76,7 @@ static int virtio_dev_link_update(struct rte_eth_dev *dev,
 static void virtio_set_hwaddr(struct virtio_hw *hw);
 static void virtio_get_hwaddr(struct virtio_hw *hw);
 
-static void virtio_dev_stats_get(struct rte_eth_dev *dev,
+static int virtio_dev_stats_get(struct rte_eth_dev *dev,
 				 struct rte_eth_stats *stats);
 static int virtio_dev_xstats_get(struct rte_eth_dev *dev,
 				 struct rte_eth_xstat *xstats, unsigned n);
@@ -964,10 +964,12 @@ static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,
 	return count;
 }
 
-static void
+static int
 virtio_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	virtio_update_stats(dev, stats);
+
+	return 0;
 }
 
 static void
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 1cc3ffd..58bc4f2 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -87,7 +87,7 @@ static int __vmxnet3_dev_link_update(struct rte_eth_dev *dev,
 static int vmxnet3_dev_link_update(struct rte_eth_dev *dev,
 				   int wait_to_complete);
 static void vmxnet3_hw_stats_save(struct vmxnet3_hw *hw);
-static void vmxnet3_dev_stats_get(struct rte_eth_dev *dev,
+static int vmxnet3_dev_stats_get(struct rte_eth_dev *dev,
 				  struct rte_eth_stats *stats);
 static int vmxnet3_dev_xstats_get_names(struct rte_eth_dev *dev,
 					struct rte_eth_xstat_name *xstats,
@@ -1034,7 +1034,7 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)
 	return count;
 }
 
-static void
+static int
 vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	unsigned int i;
@@ -1080,6 +1080,8 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)
 		stats->ierrors += rxStats.pktsRxError;
 		stats->rx_nombuf += rxStats.pktsRxOutOfBuf;
 	}
+
+	return 0;
 }
 
 static void
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 3c5441e..d88f734 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1531,8 +1531,7 @@ struct rte_eth_dev *
 
 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_get, -ENOTSUP);
 	stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
-	(*dev->dev_ops->stats_get)(dev, stats);
-	return 0;
+	return (*dev->dev_ops->stats_get)(dev, stats);
 }
 
 int
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 8e928da..71e6b33 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1207,7 +1207,7 @@ typedef int (*eth_link_update_t)(struct rte_eth_dev *dev,
 				int wait_to_complete);
 /**< @internal Get link speed, duplex mode and state (up/down) of an Ethernet device. */
 
-typedef void (*eth_stats_get_t)(struct rte_eth_dev *dev,
+typedef int (*eth_stats_get_t)(struct rte_eth_dev *dev,
 				struct rte_eth_stats *igb_stats);
 /**< @internal Get global I/O statistics of an Ethernet device. */
 
-- 
1.8.3.1

^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH] eal: bus scan and probe never fail
  @ 2017-10-10 16:00  3%               ` Aaron Conole
  2017-10-11 22:34  0%                 ` Thomas Monjalon
  2017-10-12  5:39  0%                 ` Shreyansh Jain
  0 siblings, 2 replies; 200+ results
From: Aaron Conole @ 2017-10-10 16:00 UTC (permalink / raw)
  To: Shreyansh Jain
  Cc: Don Provan, Jan Blunck, Thomas Monjalon, dev, Hemant Agrawal

Shreyansh Jain <shreyansh.jain@nxp.com> writes:

> Hello Don,
>
> On Monday 09 October 2017 11:51 PM, Don Provan wrote:
>>> -----Original Message-----
>>> From: Shreyansh Jain [mailto:shreyansh.jain@nxp.com]
>>> Sent: Monday, October 09, 2017 4:10 AM
>>> To: Jan Blunck <jblunck@infradead.org>; Thomas Monjalon
>>> <thomas@monjalon.net>
>>> Cc: dev <dev@dpdk.org>; Hemant Agrawal <hemant.agrawal@nxp.com>
>>> Subject: Re: [dpdk-dev] [PATCH] eal: bus scan and probe never fail
>>>
>>> ...
>>> This is where I have disagreement/doubt.
>>> Reporting error code from rte_bus_scan would do two things:
>>>
>>> 1. rte_eal_init is not designed to ignore/log-only these errors - it
>>> would quit initialization. (But, this can be changed)
>>> 2. What should rte_eal_init do with this error? rte_bus_scan would have
>>> already printed the problematic bus->scan() failure.
>>
>> These practical problems confirm to me that the failure of a bus
>> scan is more of a strategic issue: when asking "which devices can
>> I use?", "none" is a perfectly valid answer that does not seem
>> like an error to me even when a failed bus scan is the reason for
>> that answer.
>
> I agree with this.
>
>>
>>  From the application's point of view, the potential error here
>> is that the device it wants to use isn't available. I don't see that
>> either the init function or the probe function will have enough
>> information to understand that application-level problem, so
>> they should leave it to the application to detect it.
>
> I think I understand you comment but just want to cross check again:
> Scan or probe error should simply be ignored by EAL layer and let the
> application take stance when it detects that the device it was looking
> for is missing. Is my understanding correct?
>
> I am trying to come a conclusion so that this patch can either be
> modified or pushed as it is. If the above understanding is correct, I
> don't see any changes required in the patch.

Does it make sense to introduce a way to query the results of the
various bus types for their status?  That way we can give the relevant
information to the application if it wants, and make the bus scanning
code *always* succeed?  This version shouldn't be an ABI breakage,
either (confirm?).

half-baked below (not tested or suitable - just an example):

---
diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c
index a30a898..cd1ef1e 100644
--- a/lib/librte_eal/common/eal_common_bus.c
+++ b/lib/librte_eal/common/eal_common_bus.c
@@ -38,9 +38,23 @@
 
 #include "eal_private.h"
 
+struct rte_bus_failure {
+	struct rte_bus *bus;
+	int err;
+};
+
 struct rte_bus_list rte_bus_list =
 	TAILQ_HEAD_INITIALIZER(rte_bus_list);
 
+TAILQ_HEAD(rte_bus_scan_failure_list, rte_bus_failure);
+struct rte_bus_scan_failure_list rte_bus_scan_failure_list =
+	TAILQ_HEAD_INITIALIZER(rte_bus_failure);
+
+TAILQ_HEAD(rte_bus_probe_failure_list, rte_bus_failure);
+struct rte_bus_probe_failure_list rte_bus_probe_failure_list =
+	TAILQ_HEAD_INITIALIZER(rte_bus_failure);
+
+
 void
 rte_bus_register(struct rte_bus *bus)
 {
@@ -64,6 +78,26 @@ rte_bus_unregister(struct rte_bus *bus)
 	RTE_LOG(DEBUG, EAL, "Unregistered [%s] bus.\n", bus->name);
 }
 
+static void
+rte_bus_append_failed_scan(struct rte_bus *bus, int ret)
+{
+	struct rte_bus_failure *f = malloc(sizeof(struct rte_bus_failure));
+	if (!f) abort();
+	f->bus = bus;
+	f->ret = ret;
+	TAILQ_INSERT_TAIL(&rte_bus_scan_failure_list, f, next);
+}
+
+static void
+rte_bus_append_failed_scan(struct rte_bus *bus, int ret)
+{
+	struct rte_bus_failure *f = malloc(sizeof(struct rte_bus_failure));
+	if (!f) abort();
+	f->bus = bus;
+	f->ret = ret;
+	TAILQ_INSERT_TAIL(&rte_bus_probe_failure_list, f, next);
+}
+
 /* Scan all the buses for registered devices */
 int
 rte_bus_scan(void)
@@ -76,13 +110,33 @@ rte_bus_scan(void)
 		if (ret) {
 			RTE_LOG(ERR, EAL, "Scan for (%s) bus failed.\n",
 				bus->name);
-			return ret;
+			rte_bus_append_failed_scan(bus, ret);
 		}
 	}
 
 	return 0;
 }
 
+/* Seek through scan failures */
+void
+rte_bus_scan_errors(rte_bus_error_callback cb)
+{
+	struct rte_bus_failure *f = NULL;
+	TAILQ_FOREACH(f, &rte_bus_scan_failure_list, next) {
+		cb(f->bus, f->ret);
+	}
+}
+
+/* Seek through probe failures */
+void
+rte_bus_probe_errors(rte_bus_error_callback cb)
+{
+	struct rte_bus_failure *f = NULL;
+	TAILQ_FOREACH(f, &rte_bus_probe_failure_list, next) {
+		cb(f->bus, f->ret);
+	}
+}
+
 /* Probe all devices of all buses */
 int
 rte_bus_probe(void)
@@ -100,7 +154,7 @@ rte_bus_probe(void)
 		if (ret) {
 			RTE_LOG(ERR, EAL, "Bus (%s) probe failed.\n",
 				bus->name);
-			return ret;
+            rte_bus_append_failed_probe(bus, ret);
 		}
 	}
 
@@ -109,7 +163,7 @@ rte_bus_probe(void)
 		if (ret) {
 			RTE_LOG(ERR, EAL, "Bus (%s) probe failed.\n",
 				vbus->name);
-			return ret;
+            rte_bus_append_failed_probe(bus, ret);
 		}
 	}
 
diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h
index 6fb0834..daddb28 100644
--- a/lib/librte_eal/common/include/rte_bus.h
+++ b/lib/librte_eal/common/include/rte_bus.h
@@ -231,6 +231,20 @@ void rte_bus_register(struct rte_bus *bus);
  */
 void rte_bus_unregister(struct rte_bus *bus);
 
+typedef void (*rte_bus_error_callback)(struct rte_bus *bus, int err);
+
+/**
+ * Search through all buses, invoking cb for each bus which reports scan
+ * error.
+ */
+void rte_bus_scan_errors(rte_bus_error_callback cb);
+
+/**
+ * Search through all buses, invoking cb for each bus which reports scan
+ * error.
+ */
+void rte_bus_probe_errors(rte_bus_error_callback cb);
+
 /**
  * Scan all the buses.
  *
-- 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] drivers: update DPAA2 libs ABIVER and build reproducibility
  @ 2017-10-10 15:48  5% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-10 15:48 UTC (permalink / raw)
  To: Hemant Agrawal; +Cc: dev, ferruh.yigit

10/10/2017 16:15, Hemant Agrawal:
> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> ---
>  drivers/bus/fslmc/Makefile        | 3 ++-
>  drivers/crypto/dpaa2_sec/Makefile | 3 ++-
>  drivers/event/dpaa2/Makefile      | 3 ++-
>  drivers/mempool/dpaa2/Makefile    | 3 ++-
>  drivers/net/dpaa2/Makefile        | 3 ++-
>  5 files changed, 10 insertions(+), 5 deletions(-)

Why are you changing LIBABIVER in all these libs?
Generally speaking, a driver should not upgrade its ABI version,
because it should have no interface.

The ABI version must be changed in the patch breaking the ABI.
If you do it later, it must be a fix with Fixes line.
This way we will have the reference to the code breaking the ABI.

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v3] rte_vhost: added user callbacks for socket open/close
  @ 2017-10-10  3:14  0%   ` Yuanhan Liu
  0 siblings, 0 replies; 200+ results
From: Yuanhan Liu @ 2017-10-10  3:14 UTC (permalink / raw)
  To: Dariusz Stojaczyk; +Cc: dev, Pawel Wodkowski, jfreimann, maxime.coquelin

On Wed, Aug 30, 2017 at 12:50:58PM +0200, Dariusz Stojaczyk wrote:
> Added new callbacks to notify about socket connection status.
> As destroy_device is used for virtqueue processing *pause* as well as
> connection close, the user has no distinction between those.
> 
> Consider the following scenario:
> rte_vhost: received SET_VRING_BASE message,
>            calling destroy_device() as usual
> 
> user:  end-user asks to remove the device (together with socket file),
>        OK, device is not *in use* - that's NOT the behavior we want
>        calling rte_vhost_driver_unregister() etc.
> 
> Instead of changing new_device/destroy_device callbacks and breaking
> the ABI, a set of new functions new_connection/destroy_connection
> has been added.
> 
> Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
> ---
> v3: improved err-handling path and updated commit msg
> v2: also updated vhost_lib.rst

The doc update is missing. I have cherry-picked it from v2.

Applied to dpdk-next-virtio.

Thanks.

	--yliu

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 0/9] Policy Based Power Control for Guest
  2017-10-05 14:34  2%         ` [dpdk-dev] [PATCH v8 " David Hunt
@ 2017-10-09 22:34  0%           ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-10-09 22:34 UTC (permalink / raw)
  To: David Hunt, dev; +Cc: konstantin.ananyev, jingjing.wu, santosh.shukla

On 10/5/2017 3:34 PM, David Hunt wrote:
> Policy Based Power Control for Guest
> 
> This patchset adds the facility for a guest VM to send a policy down to the
> host that will allow the host to scale up/down cpu frequencies
> depending on the policy criteria independently of the DPDK app running in
> the guest.  This differs from the previous vm_power implementation where
> individual scale up/down requests were send from the guest to the host via
> virtio-serial.
> 
> V8 patchset changes:
>   * Added Ack's and Reviewed-by's to individual patches in the set so as to
>     keep patchwork A/R/T flags properly in sync.
> 
> V7 patchset changes:
>   * Changed return code of rte_pmd_i40e_query_vfid_by_mac() from an
>     int64_t to int
> 
> V6 patchset changes:
>   * Fixed comments in header for rte_pmd_i40e_query_vfid_by_mac.
>   * changed rte_pmd_i40e_query_vfid_by_mac return code from uint to int
>     as it can return negative error codes.
>   * Removed bool enum from channel_commands.h, including stdbool.h instead.
>   * Added #define VM_MAX_NAME_SZ 32 to channel_commands.h
>   * Renamed a few variables to be more readable.
>   * Added returns in a few places if failed to get info on domain.
>   * Fixed power_manager_init to keep track of num_freqs for each core.
>   * In power_manager_scale_core_med(), changed a hardcoded '5' to instead
>     be calculated from the centre of the frequency list
>     (global_core_freq_info[core_num].num_freqs / 2)
> 
> V5 patchset changes:
>   * Removed most of the #ifdef I40_PMD as it will be applicable to
>     other PMDs in the future.
>   * Changed the parameter of rte_pmd_i40e_query_vfid_by_mac from a uint64
>     to a const struct ether_addr *, rather than casting it later in the
>     function.
> 
> V4 patchset changes:
>   * None, re-post to mailing list under the correct email thread.
> 
> V3 patchset changes:
>   * Changed to using is_same_ether_addr() instead of looping through
>     the mac address bytes to compare them.
>   * Tweaked some comments and working in the i40e patch after review.
>   * Added a patch to the set to add new i40e function to map file, so
>     as to allow shared library builds. The power library API needs a cleanup
>     in next release, so will add API/ABI warning for this cleanup in a
>     separate patch.
> 
> V2 patchset changes:
>   * Removed API's in ethdev layer.
>   * Now just a single new API in the i40e driver for mapping VF MAC to
>     VF index.
>   * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
>   * Removed function for reading i40e register, moved to using the
>     standard stats API.
>   * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
>   * Cleaned up policy generation code.
> 
> It's a modification of the vm_power_manager app that runs in the host, and
> the guest_vm_power_app example app that runs in the guest. This allows the
> guest to send down a policy to the host via virtio-serial, which then allows
> the host to scale up/down based on the criteria in the policy, resulting in
> quicker scale up/down than individual requests coming from the guest.
> It also means that the DPDK application running in the guest does not need
> to be modified in any way, it is unaware that it's cores are being scaled
> up/down, reducing the effort in implementing a power-aware infrastructure.
> 
> The usage model is as follows:
> 1. Set up the VF's and assign to the guest in the usual way.
> 2. run vm_power_manager on the host, creating a channel to the guest.
> 3. Start the guest_vm_power_mgr app on the guest, which establishes
>    a virtio-serial channel to the host.
> 4. Send down the profile for the guest using the "send_profile now" command.
>    There is an example profile hard-coded into guest_vm_power_mgr.
> 5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
> 6. Send traffic into the VFs at varying traffic rates.
>    Observe the frequency change on the host (turbostat -i 1)
> 
> The sequence of code changes are as follows:
> 
> A new function has been aded to the i40e driver to allow mapping of
> a VF MAC to VF index.
> 
> Next we make an addition to librte_power that adds an extra command to allow
> the passing of a policy structure from the guest to the host. This struct
> contains information like busy/quiet hour, packet throughput thresholds, etc.
> 
> The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
> physical CPU (pcpu) IDs so that the host can scale up/down the cores used
> in the guest.
> 
> The remaining patches are functionality to process the policy, and take action
> when the relevant trigger occurs to cause a frequency change.

Hi Dave,

Can you please rebase the set on top of latest main repo?
There are two set of changes:

1- There are more i40e updates in main repo, conflicts with this one.
2- Port id increased to 16 bits, there are some code still using uint8_t
in this patch

Thanks,
ferruh

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH 2/2] doc: update stats get API change
  @ 2017-10-09 16:12  4% ` Matan Azrad
  2017-10-10 20:20  1% ` [dpdk-dev] [PATCH v2] ethdev: add return value to stats get dev op Matan Azrad
  1 sibling, 0 replies; 200+ results
From: Matan Azrad @ 2017-10-09 16:12 UTC (permalink / raw)
  To: dev; +Cc: Ferruh Yigit

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=y, Size: 1410 bytes --]

Updated change info in release_17.11.

Signed-off-by: Matan Azrad <matan@mellanox.com>
---
 doc/guides/rel_notes/release_17_11.rst | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 36139e5..b62083d 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -75,7 +75,7 @@ New Features
   The Membership Library is an extension and generalization of a traditional
   filter (for example Bloom Filter) structure that has multiple usages in a wide
   variety of workloads and applications. In general, the Membership Library is a
-  data structure that provides a “set-summary” and responds to set-membership
+  data structure that provides a ���set-summary��� and responds to set-membership
   queries whether a certain member belongs to a set(s).
 
   See the :ref:`Membership Library <Member_Library>` documentation in
@@ -199,6 +199,12 @@ API Changes
 * ``rte_mem_phy2mch`` was used in Xen dom0 to obtain the physical address;
   remove this API as Xen dom0 support was removed.
 
+* **Add return value to stats_get dev op API**
+
+  The stats_get dev op API return value has been changed to be int.
+  By this way PMDs can return an error value in case of failure at stats
+  getting process time.
+
 
 ABI Changes
 -----------
-- 
1.8.3.1

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2 03/12] cryptodev: avoid dependency on rte_vdev.h
  2017-10-05 13:13  0%     ` Jan Blunck
@ 2017-10-09  1:04  0%       ` Tan, Jianfeng
  0 siblings, 0 replies; 200+ results
From: Tan, Jianfeng @ 2017-10-09  1:04 UTC (permalink / raw)
  To: Jan Blunck
  Cc: dev, Richardson, Bruce, Ananyev, Konstantin, De Lara Guarch,
	Pablo, Thomas Monjalon, yliu, Maxime Coquelin, Tetsuya Mukawa,
	Yigit, Ferruh

Hi Jan,

> -----Original Message-----
> From: jblunck@gmail.com [mailto:jblunck@gmail.com] On Behalf Of Jan
> Blunck
> Sent: Thursday, October 5, 2017 9:14 PM
> To: Tan, Jianfeng
> Cc: dev; Richardson, Bruce; Ananyev, Konstantin; De Lara Guarch, Pablo;
> Thomas Monjalon; yliu@fridaylinux.org; Maxime Coquelin; Tetsuya Mukawa;
> Yigit, Ferruh
> Subject: Re: [dpdk-dev] [PATCH v2 03/12] cryptodev: avoid dependency on
> rte_vdev.h
> 
> On Thu, Sep 28, 2017 at 3:55 PM, Jianfeng Tan <jianfeng.tan@intel.com>
> wrote:
> > The helper API, rte_cryptodev_vdev_pmd_init(), has a parameter of
> > struct rte_vdev_device *, which needs to include rte_vdev.h.
> >
> > We will move vdev into drivers/bus, so we need to avoid such
> > dependency. And also, we cannot break the ABI.
> >
> > This patch changes that pointer to void *, and defines an internal
> > structure same with struct rte_vdev_device.
> >
> 
> This code duplication is unnecessary. Also you are doing evil thinks
> and define a type with the same name in multiple places. Look at my
> series how to do this properly.
> 

Moving related things into header file is also my plan. Thank for doing that, I'll rebase on your patchset.

Thanks,
Jianfeng

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
  2017-10-06 23:27  0%           ` Mokhtar, Amr
@ 2017-10-07 11:42  0%             ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-07 11:42 UTC (permalink / raw)
  To: Mokhtar, Amr; +Cc: dev, fbl, aconole, bluca

07/10/2017 01:27, Mokhtar, Amr:
> 
> > -----Original Message-----
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > Sent: Thursday 5 October 2017 23:23
> > To: Mokhtar, Amr <amr.mokhtar@intel.com>
> > Cc: dev@dpdk.org; fbl@redhat.com; aconole@redhat.com; bluca@debian.org
> > Subject: Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
> > 
> > 05/10/2017 23:55, Mokhtar, Amr:
> > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > > 03/10/2017 16:29, Mokhtar, Amr:
> > > > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > > > > 25/08/2017 15:46, Amr Mokhtar:
> > > > > > > +int
> > > > > > > +rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues,
> > > > > > > +		const struct rte_bbdev_conf *conf);
> > > > > >
> > > > > > I am not convinced by the "configure all" function in ethdev.
> > > > > > We break the ABI each time we add a new feature to configure.
> > > > > > And it does not really help to have all configurations in one struct.
> > > > > > Would you mind to split the struct rte_bbdev_conf and split the
> > > > > > function accordingly?
> > > > >
> > > > > There is nothing to split tbh. The only parameter it has is the socket_id.
> > > > > And in fact, it's optional, can be null. The only config we need is
> > num_queues.
> > > >
> > > > Indeed, there is nothing in this struct.
> > > > If you need only to allocate queues, you just have to rename this function.
> > > >
> > > > > I don't see in the near future that we may need to add more config params.
> > > > > As a side, in the time of the implementation we were trying to
> > > > > avoid any diversions from the current design ideology of ethdev and
> > cryptodev.
> > > >
> > > > There is no ideology in ethdev, just some mistakes ;)
> > > >
> > > > > Can we leave it for consideration with future releases?
> > > >
> > > > No it should be addressed from the beginning.
> > > >
> > > > When you will need to add something more to configure port-wise, you
> > > > should add a new function instead of breaking the ABI of the global conf
> > struct.
> > > > That's why the configure option should be more specialized.
> > > >
> > > > Distro people were complaining about ABI breakage last week.
> > > > This is exactly an example of how to avoid it from the beginning.
> > > >
> > >
> > > Ok, got your point. I was looking at it from an API-only standpoint.
> > > How about modifying it into?
> > > int
> > > rte_bbdev_setup_queues(uint16_t dev_id, uint16_t num_queues, int
> > > socket_id);
> > 
> > Yes OK
> > 
> > [...]
> > > > > > > +struct __rte_cache_aligned rte_bbdev {
> > > > > > > +	rte_bbdev_enqueue_ops_t enqueue_ops; /**< Enqueue
> > function */
> > > > > > > +	rte_bbdev_dequeue_ops_t dequeue_ops;  /**< Dequeue
> > function */
> > > > > > > +	const struct rte_bbdev_ops *dev_ops;  /**< Functions
> > > > > > > +exported by PMD
> > > > > > */
> > > > > > > +	struct rte_bbdev_data *data;  /**< Pointer to device data */
> > > > > > > +	bool attached;  /**< If device is currently attached or not
> > > > > > > +*/
> > > > > >
> > > > > > What "attached" means?
> > > > > > I'm afraid you are trying to manage hotplug in the wrong layer.
> > > > >
> > > > > Hotplug is not supported in the current release.
> > > >
> > > > It is not answering the question.
> > > > What is an "attached" device?
> > >
> > > "Attached" means that the PCI device was probed and the bbdev device slot is
> > allocated.
> > > For software devices, means that a virtual bbdev device (vdev) is allocated for
> > bbdev.
> > > Same way the "attached" approach used in cryptodev.
> > 
> > Not sure to understand.
> > If "attached" means "allocated", when is it false?
> 
> Currently in bbdev, it is set to true and never goes false.
> As I said the Hotplug feature is not fully supported in the current version. I can remove that flag for now.
> 
> But generally, it should be cleared to false when rte_pci_driver->remove function is called. (Hotplug?)

Hotplug is still a work in progress in DPDK.
Please remove this flag if it is useless.
We will add something if needed when hotplug support will be better designed.

> > [...]
> > > > > > > +/** Structure specifying a single operation */ struct rte_bbdev_op {
> > > > > > > +	enum rte_bbdev_op_type type;  /**< Type of this operation */
> > > > > > > +	int status;  /**< Status of operation that was performed */
> > > > > > > +	struct rte_mempool *mempool;  /**< Mempool which op
> > instance
> > > > > > > +is in
> > > > > > */
> > > > > > > +	void *opaque_data;  /**< Opaque pointer for user data */
> > > > > > > +	/**
> > > > > > > +	 * Anonymous union of operation-type specific parameters.
> > > > > > > +When
> > > > > > allocated
> > > > > > > +	 * using rte_bbdev_op_pool_create(), space is allocated for the
> > > > > > > +	 * parameters at the end of each rte_bbdev_op structure, and
> > the
> > > > > > > +	 * pointers here point to it.
> > > > > > > +	 */
> > > > > > > +	RTE_STD_C11
> > > > > > > +	union {
> > > > > > > +		void *generic;
> > > > > > > +		struct rte_bbdev_op_turbo_dec *turbo_dec;
> > > > > > > +		struct rte_bbdev_op_turbo_enc *turbo_enc;
> > > > > > > +	};
> > > > > > > +};
> > > > > >
> > > > > > I am not sure it is a good idea to fit every operations in the
> > > > > > same struct and the same functions.
> > > > >
> > > > > Due to the fact that our design adopts this idea that a device can
> > > > > support both the encode and decode operations.
> > > > > Then, at the time of PMD registration, the enqueue functions is allocated.
> > > > > This enqueue() function is common for both operations.
> > > > > This fitted operation structure is essential for the driver to
> > > > > decide on the
> > > > operation.
> > > >
> > > > Sorry I do not understand why you must have a "generic operation".
> > > > Please, could you try again to explain this design to someone not
> > > > fully understanding how turbo enc/dec works?
> > >
> > > Oh, sorry, I was not paying attention that you're referring to "void *generic"
> > > It is just a place-holder for any other operation types. Can be removed if you
> > like.
> > 
> > No I was not referring to void *generic.
> > It is the same question as in the RFC.
> > I don't understand the benefit of grouping different things in an union.
> 
> There is no benefit, this is a restriction because there is only one function pointer
> for enq and another one for deq in the ops structure. Again for the same reason
> of trying to keep things in sync with ethdev and cryptodev.
> I've always wanted to make it as you proposed, that way it is more performant
> (no checking for the type of operation.) If this is agreed, I will do it with all my pleasure :)
> 
> The optimum solution though IMHO would be to make the generic enq/deq function pointers
> per queue, instead of being per device; that way every enqueue goes straight to
> the queue-specific function that matches its operation type.
> Notice that currently we have turbo_enc/turbo_dec, but in the future we may have more..

Please do not impose some restrictions to your API just because you want
to mimic ethdev.
Feel free to innovate :)

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
  2017-10-05 22:22  0%         ` Thomas Monjalon
@ 2017-10-06 23:27  0%           ` Mokhtar, Amr
  2017-10-07 11:42  0%             ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Mokhtar, Amr @ 2017-10-06 23:27 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, fbl, aconole, bluca



> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Thursday 5 October 2017 23:23
> To: Mokhtar, Amr <amr.mokhtar@intel.com>
> Cc: dev@dpdk.org; fbl@redhat.com; aconole@redhat.com; bluca@debian.org
> Subject: Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
> 
> 05/10/2017 23:55, Mokhtar, Amr:
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > 03/10/2017 16:29, Mokhtar, Amr:
> > > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > > > 25/08/2017 15:46, Amr Mokhtar:
> > > > > > +int
> > > > > > +rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues,
> > > > > > +		const struct rte_bbdev_conf *conf);
> > > > >
> > > > > I am not convinced by the "configure all" function in ethdev.
> > > > > We break the ABI each time we add a new feature to configure.
> > > > > And it does not really help to have all configurations in one struct.
> > > > > Would you mind to split the struct rte_bbdev_conf and split the
> > > > > function accordingly?
> > > >
> > > > There is nothing to split tbh. The only parameter it has is the socket_id.
> > > > And in fact, it's optional, can be null. The only config we need is
> num_queues.
> > >
> > > Indeed, there is nothing in this struct.
> > > If you need only to allocate queues, you just have to rename this function.
> > >
> > > > I don't see in the near future that we may need to add more config params.
> > > > As a side, in the time of the implementation we were trying to
> > > > avoid any diversions from the current design ideology of ethdev and
> cryptodev.
> > >
> > > There is no ideology in ethdev, just some mistakes ;)
> > >
> > > > Can we leave it for consideration with future releases?
> > >
> > > No it should be addressed from the beginning.
> > >
> > > When you will need to add something more to configure port-wise, you
> > > should add a new function instead of breaking the ABI of the global conf
> struct.
> > > That's why the configure option should be more specialized.
> > >
> > > Distro people were complaining about ABI breakage last week.
> > > This is exactly an example of how to avoid it from the beginning.
> > >
> >
> > Ok, got your point. I was looking at it from an API-only standpoint.
> > How about modifying it into?
> > int
> > rte_bbdev_setup_queues(uint16_t dev_id, uint16_t num_queues, int
> > socket_id);
> 
> Yes OK
> 
> [...]
> > > > > > +struct __rte_cache_aligned rte_bbdev {
> > > > > > +	rte_bbdev_enqueue_ops_t enqueue_ops; /**< Enqueue
> function */
> > > > > > +	rte_bbdev_dequeue_ops_t dequeue_ops;  /**< Dequeue
> function */
> > > > > > +	const struct rte_bbdev_ops *dev_ops;  /**< Functions
> > > > > > +exported by PMD
> > > > > */
> > > > > > +	struct rte_bbdev_data *data;  /**< Pointer to device data */
> > > > > > +	bool attached;  /**< If device is currently attached or not
> > > > > > +*/
> > > > >
> > > > > What "attached" means?
> > > > > I'm afraid you are trying to manage hotplug in the wrong layer.
> > > >
> > > > Hotplug is not supported in the current release.
> > >
> > > It is not answering the question.
> > > What is an "attached" device?
> >
> > "Attached" means that the PCI device was probed and the bbdev device slot is
> allocated.
> > For software devices, means that a virtual bbdev device (vdev) is allocated for
> bbdev.
> > Same way the "attached" approach used in cryptodev.
> 
> Not sure to understand.
> If "attached" means "allocated", when is it false?

Currently in bbdev, it is set to true and never goes false.
As I said the Hotplug feature is not fully supported in the current version. I can remove that flag for now.

But generally, it should be cleared to false when rte_pci_driver->remove function is called. (Hotplug?)

> 
> [...]
> > > > > > +/** Structure specifying a single operation */ struct rte_bbdev_op {
> > > > > > +	enum rte_bbdev_op_type type;  /**< Type of this operation */
> > > > > > +	int status;  /**< Status of operation that was performed */
> > > > > > +	struct rte_mempool *mempool;  /**< Mempool which op
> instance
> > > > > > +is in
> > > > > */
> > > > > > +	void *opaque_data;  /**< Opaque pointer for user data */
> > > > > > +	/**
> > > > > > +	 * Anonymous union of operation-type specific parameters.
> > > > > > +When
> > > > > allocated
> > > > > > +	 * using rte_bbdev_op_pool_create(), space is allocated for the
> > > > > > +	 * parameters at the end of each rte_bbdev_op structure, and
> the
> > > > > > +	 * pointers here point to it.
> > > > > > +	 */
> > > > > > +	RTE_STD_C11
> > > > > > +	union {
> > > > > > +		void *generic;
> > > > > > +		struct rte_bbdev_op_turbo_dec *turbo_dec;
> > > > > > +		struct rte_bbdev_op_turbo_enc *turbo_enc;
> > > > > > +	};
> > > > > > +};
> > > > >
> > > > > I am not sure it is a good idea to fit every operations in the
> > > > > same struct and the same functions.
> > > >
> > > > Due to the fact that our design adopts this idea that a device can
> > > > support both the encode and decode operations.
> > > > Then, at the time of PMD registration, the enqueue functions is allocated.
> > > > This enqueue() function is common for both operations.
> > > > This fitted operation structure is essential for the driver to
> > > > decide on the
> > > operation.
> > >
> > > Sorry I do not understand why you must have a "generic operation".
> > > Please, could you try again to explain this design to someone not
> > > fully understanding how turbo enc/dec works?
> >
> > Oh, sorry, I was not paying attention that you're referring to "void *generic"
> > It is just a place-holder for any other operation types. Can be removed if you
> like.
> 
> No I was not referring to void *generic.
> It is the same question as in the RFC.
> I don't understand the benefit of grouping different things in an union.

There is no benefit, this is a restriction because there is only one function pointer
for enq and another one for deq in the ops structure. Again for the same reason
of trying to keep things in sync with ethdev and cryptodev.
I've always wanted to make it as you proposed, that way it is more performant
(no checking for the type of operation.) If this is agreed, I will do it with all my pleasure :)

The optimum solution though IMHO would be to make the generic enq/deq function pointers
per queue, instead of being per device; that way every enqueue goes straight to
the queue-specific function that matches its operation type.
Notice that currently we have turbo_enc/turbo_dec, but in the future we may have more..

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] ABI/API stability in DPDK
  2017-10-06 16:21  9% [dpdk-dev] ABI/API stability in DPDK Mcnamara, John
  2017-10-06 16:27  4% ` Ferruh Yigit
@ 2017-10-06 17:15  4% ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-06 17:15 UTC (permalink / raw)
  To: Mcnamara, John
  Cc: dev, Kevin Traynor, Stokes, Ian, Luca Boccassi, techboard,
	aconole, ktraynor

06/10/2017 18:21, Mcnamara, John:
> Hi,
> 
> At the recent DPDK 2017 Userspace in Dublin we had a discussion about API/ABI stability with representation from Intel, OVS-DPDK, Debian, Red Hat and plenty of input from the floor.
> 
> The main consensus after looking at different proposals was to maintain the current process (http://dpdk.org/doc/guides/contributing/versioning.html) but to try enforce it more rigidly.
> 
> The main points to come out of this discussion were:
> 
> 1. That 3 Acks are still needed for deprecation and they should come from different companies.
> 
> 2. ABI checks to be run as part of the CI/testing so that patches that break ABI are flagged early. Note, ABI checks can be run manually as follows: http://dpdk.org/doc/guides/contributing/versioning.html#running-the-abi-validator
> 
> 3. New API's will be marked as experimental by default for 1 release minimum. This is to address the most common case for breakage which is in new APIs.

Thanks for the summary, John.

The points 1 and 3 must be approved by the technical board.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] ABI/API stability in DPDK
  2017-10-06 16:21  9% [dpdk-dev] ABI/API stability in DPDK Mcnamara, John
@ 2017-10-06 16:27  4% ` Ferruh Yigit
  2017-10-06 17:15  4% ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-10-06 16:27 UTC (permalink / raw)
  To: Mcnamara, John, dev; +Cc: Kevin Traynor, Stokes, Ian, Luca Boccassi

On 10/6/2017 5:21 PM, Mcnamara, John wrote:
> Hi,
> 
> At the recent DPDK 2017 Userspace in Dublin we had a discussion about API/ABI stability with representation from Intel, OVS-DPDK, Debian, Red Hat and plenty of input from the floor.
> 
> 
> The main consensus after looking at different proposals was to maintain the current process (http://dpdk.org/doc/guides/contributing/versioning.html) but to try enforce it more rigidly.
> 
> 
> 
> 
> 
> The main points to come out of this discussion were:
> 
> 
> 
> 1. That 3 Acks are still needed for deprecation and they should come from different companies.
> 
> 
> 
> 2. ABI checks to be run as part of the CI/testing so that patches that break ABI are flagged early. Note, ABI checks can be run manually as follows: http://dpdk.org/doc/guides/contributing/versioning.html#running-the-abi-validator
> 
> 
> 
> 3. New API's will be marked as experimental by default for 1 release minimum. This is to address the most common case for breakage which is in new APIs.

Do we have data for this? Is it really new APIs get broken?

> 
> 
> If I missed, or misrepresented, anything please update in a reply.
> 
> John
> 
> 

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] ABI/API stability in DPDK
@ 2017-10-06 16:21  9% Mcnamara, John
  2017-10-06 16:27  4% ` Ferruh Yigit
  2017-10-06 17:15  4% ` Thomas Monjalon
  0 siblings, 2 replies; 200+ results
From: Mcnamara, John @ 2017-10-06 16:21 UTC (permalink / raw)
  To: dev; +Cc: Kevin Traynor, Stokes, Ian, Luca Boccassi

Hi,

At the recent DPDK 2017 Userspace in Dublin we had a discussion about API/ABI stability with representation from Intel, OVS-DPDK, Debian, Red Hat and plenty of input from the floor.


The main consensus after looking at different proposals was to maintain the current process (http://dpdk.org/doc/guides/contributing/versioning.html) but to try enforce it more rigidly.





The main points to come out of this discussion were:



1. That 3 Acks are still needed for deprecation and they should come from different companies.



2. ABI checks to be run as part of the CI/testing so that patches that break ABI are flagged early. Note, ABI checks can be run manually as follows: http://dpdk.org/doc/guides/contributing/versioning.html#running-the-abi-validator



3. New API's will be marked as experimental by default for 1 release minimum. This is to address the most common case for breakage which is in new APIs.


If I missed, or misrepresented, anything please update in a reply.

John

^ permalink raw reply	[relevance 9%]

* Re: [dpdk-dev] [PATCH v6 0/5] increase port_id range
  2017-10-06  2:15  0%         ` [dpdk-dev] [PATCH v6 0/5] " Ferruh Yigit
  2017-10-06 13:31  0%           ` Gaëtan Rivet
  2017-10-06 14:29  0%           ` Thomas Monjalon
@ 2017-10-06 16:02  0%           ` Thomas Monjalon
  2017-10-11 21:21  0%           ` Ferruh Yigit
  3 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-06 16:02 UTC (permalink / raw)
  To: Ferruh Yigit, Nelio Laranjeiro
  Cc: dev, Zhiyong Yang, Gaetan Rivet, Declan Doherty

06/10/2017 04:15, Ferruh Yigit:
> On 9/29/2017 8:17 AM, Zhiyong Yang wrote:
> > Zhiyong Yang (5):
> >   net/bonding: remove bonding APIs using ABI versioning
> >   ethdev: increase port_id range
> >   examples: increase port_id range
> >   test: increase port_id range
> >   librte_mbuf: modify port initialization value
> 
> Series applied to dpdk-next-net/master, thanks.
> 
> There was merge conflict for:
> rte_eth_bond_pmd.c
> failsafe_private.h
> mlx5_rxtx.h
> 
> Maintainers of these files cc'ed, can you please double check latest
> files in next-net?

I have re-done the merge of this series in master because
it was wrong for mlx5, as notified by Nelio.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH V3 3/5] ethdev: add new api for traffic metering and policing
  @ 2017-10-06 14:45  1%   ` Cristian Dumitrescu
  0 siblings, 0 replies; 200+ results
From: Cristian Dumitrescu @ 2017-10-06 14:45 UTC (permalink / raw)
  To: dev
  Cc: thomas, adrien.mazarguil, jingjing.wu, hemant.agrawal,
	jerin.jacob, jasvinder.singh

This patch introduces new ethdev generic API for Traffic Metering and
Policing (MTR), which is yet another standard RX offload for Ethernet
devices.

Similar to rte_flow and rte_tm APIs, the configuration of MTR objects is
done in their own namespace (rte_mtr) within the librte_ether library.

Main features:
1. Traffic metering: determine the color for the current packet (green,
   yellow, red) based on history maintained by the MTR object. Supported
   algorithms: srTCM (RFC 2697), trTCM (RFC 2698 and RFC 4115).
2. Policing (per meter output color actions): re-color the packet (keep
   or change the meter output color) or drop the packet.
3. Statistics
4. Capability API

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
Changes in v3:
- None

Changes in v2:
- Implemented input from Hemant:
     - Added support for RFC 4115 trTCM algorithm
     - Added support for meter pass-through mode: see API functions
       rte_mtr_meter_enable() and rte_mtr_meter_disable()
- Implemented input from Jerin:
     - Added capability API
- Implemented input from Thomas:
     - Added new API functions under the EXPERIMENTAL section in map file
- Improved the mechanism for MTR object chaining: each MTR object can be
  configured whther to read input color from a previous MTR object in the
  same flow (if any) of from DSCP traslation table
- Improved run-time update functions
- Doxygen: added more descriptions, small fixes

Changes in v1 (from RFC [1]):
- Implemented input from Thomas:
     - Added EXPERIMENTAL tag in rte_mtr.h and MANTAINERS for this new API
- Implemented input from Adrien:
     - Added more Doxygen comments to re-inforce relationship between MTR and
       flow
- Doxygen: added hook in doxy-api-index.md

[1] RFC: http://www.dpdk.org/ml/archives/dev/2017-May/066888.html

 MAINTAINERS                             |   4 +
 doc/api/doxy-api-index.md               |   1 +
 lib/librte_ether/Makefile               |   3 +
 lib/librte_ether/rte_ethdev_version.map |  18 +
 lib/librte_ether/rte_mtr.c              | 229 ++++++++++
 lib/librte_ether/rte_mtr.h              | 723 ++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_mtr_driver.h       | 221 ++++++++++
 7 files changed, 1199 insertions(+)
 create mode 100644 lib/librte_ether/rte_mtr.c
 create mode 100644 lib/librte_ether/rte_mtr.h
 create mode 100644 lib/librte_ether/rte_mtr_driver.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 5c3abf9..bce6b6f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -260,6 +260,10 @@ M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
 T: git://dpdk.org/next/dpdk-next-tm
 F: lib/librte_ether/rte_tm*
 
+Traffic Metering and Policing API - EXPERIMENTAL
+M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+F: lib/librte_ether/rte_mtr*
+
 Crypto API
 M: Declan Doherty <declan.doherty@intel.com>
 F: lib/librte_cryptodev/
diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index 19e0d4f..b2342a9 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -41,6 +41,7 @@ The public API headers are grouped by topics:
   [ethctrl]            (@ref rte_eth_ctrl.h),
   [rte_flow]           (@ref rte_flow.h),
   [rte_tm]             (@ref rte_tm.h),
+  [rte_mtr]            (@ref rte_mtr.h),
   [cryptodev]          (@ref rte_cryptodev.h),
   [eventdev]           (@ref rte_eventdev.h),
   [metrics]            (@ref rte_metrics.h),
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 201cb96..35ba5d9 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -46,6 +46,7 @@ LIBABIVER := 7
 SRCS-y += rte_ethdev.c
 SRCS-y += rte_flow.c
 SRCS-y += rte_tm.c
+SRCS-y += rte_mtr.c
 SRCS-y += ethdev_profile.c
 
 #
@@ -60,5 +61,7 @@ SYMLINK-y-include += rte_flow.h
 SYMLINK-y-include += rte_flow_driver.h
 SYMLINK-y-include += rte_tm.h
 SYMLINK-y-include += rte_tm_driver.h
+SYMLINK-y-include += rte_mtr.h
+SYMLINK-y-include += rte_mtr_driver.h
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map
index 07f9e17..c8f59a0 100644
--- a/lib/librte_ether/rte_ethdev_version.map
+++ b/lib/librte_ether/rte_ethdev_version.map
@@ -194,3 +194,21 @@ DPDK_17.11 {
 	rte_eth_dev_reset;
 
 } DPDK_17.08;
+
+EXPERIMENTAL {
+	global:
+
+	rte_mtr_capabilities_get;
+	rte_mtr_meter_profile_add;
+	rte_mtr_meter_profile_delete;
+	rte_mtr_create;
+	rte_mtr_destroy;
+	rte_mtr_meter_enable;
+	rte_mtr_meter_disable;
+	rte_mtr_meter_profile_update;
+	rte_mtr_meter_dscp_table_update;
+	rte_mtr_policer_actions_update;
+	rte_mtr_stats_update;
+	rte_mtr_stats_read;
+
+} DPDK_17.11;
diff --git a/lib/librte_ether/rte_mtr.c b/lib/librte_ether/rte_mtr.c
new file mode 100644
index 0000000..6526a97
--- /dev/null
+++ b/lib/librte_ether/rte_mtr.c
@@ -0,0 +1,229 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdint.h>
+
+#include <rte_errno.h>
+#include "rte_ethdev.h"
+#include "rte_mtr_driver.h"
+#include "rte_mtr.h"
+
+/* Get generic traffic metering & policing operations structure from a port. */
+const struct rte_mtr_ops *
+rte_mtr_ops_get(uint8_t port_id, struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	const struct rte_mtr_ops *ops;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		rte_mtr_error_set(error,
+			ENODEV,
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+			NULL,
+			rte_strerror(ENODEV));
+		return NULL;
+	}
+
+	if ((dev->dev_ops->mtr_ops_get == NULL) ||
+		(dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
+		(ops == NULL)) {
+		rte_mtr_error_set(error,
+			ENOSYS,
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+			NULL,
+			rte_strerror(ENOSYS));
+		return NULL;
+	}
+
+	return ops;
+}
+
+#define RTE_MTR_FUNC(port_id, func)			\
+({							\
+	const struct rte_mtr_ops *ops =			\
+		rte_mtr_ops_get(port_id, error);		\
+	if (ops == NULL)					\
+		return -rte_errno;			\
+							\
+	if (ops->func == NULL)				\
+		return -rte_mtr_error_set(error,		\
+			ENOSYS,				\
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,	\
+			NULL,				\
+			rte_strerror(ENOSYS));		\
+							\
+	ops->func;					\
+})
+
+/* MTR capabilities get */
+int
+rte_mtr_capabilities_get(uint8_t port_id,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
+		cap, error);
+}
+
+/* MTR meter profile add */
+int
+rte_mtr_meter_profile_add(uint8_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
+		meter_profile_id, profile, error);
+}
+
+/** MTR meter profile delete */
+int
+rte_mtr_meter_profile_delete(uint8_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
+		meter_profile_id, error);
+}
+
+/** MTR object create */
+int
+rte_mtr_create(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, create)(dev,
+		mtr_id, params, shared, error);
+}
+
+/** MTR object destroy */
+int
+rte_mtr_destroy(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, destroy)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter enable */
+int
+rte_mtr_meter_enable(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_enable)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter disable */
+int
+rte_mtr_meter_disable(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_disable)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter profile update */
+int
+rte_mtr_meter_profile_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
+		mtr_id, meter_profile_id, error);
+}
+
+/** MTR object meter DSCP table update */
+int
+rte_mtr_meter_dscp_table_update(uint8_t port_id,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
+		mtr_id, dscp_table, error);
+}
+
+/** MTR object policer action update */
+int
+rte_mtr_policer_actions_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, policer_actions_update)(dev,
+		mtr_id, action_mask, actions, error);
+}
+
+/** MTR object enabled stats update */
+int
+rte_mtr_stats_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, stats_update)(dev,
+		mtr_id, stats_mask, error);
+}
+
+/** MTR object stats read */
+int
+rte_mtr_stats_read(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, stats_read)(dev,
+		mtr_id, stats, stats_mask, clear, error);
+}
diff --git a/lib/librte_ether/rte_mtr.h b/lib/librte_ether/rte_mtr.h
new file mode 100644
index 0000000..f0f897f
--- /dev/null
+++ b/lib/librte_ether/rte_mtr.h
@@ -0,0 +1,723 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation.
+ *   Copyright(c) 2017 NXP.
+ *   Copyright(c) 2017 Cavium.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INCLUDE_RTE_MTR_H__
+#define __INCLUDE_RTE_MTR_H__
+
+/**
+ * @file
+ * RTE Generic Traffic Metering and Policing API
+ *
+ * This interface provides the ability to configure the traffic metering and
+ * policing (MTR) in a generic way.
+ *
+ * The processing done for each input packet hitting a MTR object is:
+ *    A) Traffic metering: The packet is assigned a color (the meter output
+ *       color), based on the previous history of the flow reflected in the
+ *       current state of the MTR object, according to the specific traffic
+ *       metering algorithm. The traffic metering algorithm can typically work
+ *       in color aware mode, in which case the input packet already has an
+ *       initial color (the input color), or in color blind mode, which is
+ *       equivalent to considering all input packets initially colored as green.
+ *    B) Policing: There is a separate policer action configured for each meter
+ *       output color, which can:
+ *          a) Drop the packet.
+ *          b) Keep the same packet color: the policer output color matches the
+ *             meter output color (essentially a no-op action).
+ *          c) Recolor the packet: the policer output color is different than
+ *             the meter output color.
+ *       The policer output color is the output color of the packet, which is
+ *       set in the packet meta-data (i.e. struct rte_mbuf::sched::color).
+ *    C) Statistics: The set of counters maintained for each MTR object is
+ *       configurable and subject to the implementation support. This set
+ *       includes the number of packets and bytes dropped or passed for each
+ *       output color.
+ *
+ * Once successfully created, an MTR object is linked to one or several flows
+ * through the meter action of the flow API.
+ *    A) Whether an MTR object is private to a flow or potentially shared by
+ *       several flows has to be specified at creation time.
+ *    B) Several meter actions can be potentially registered for the same flow.
+ *
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ */
+#include <stdint.h>
+
+#include <rte_common.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Color
+ */
+enum rte_mtr_color {
+	RTE_MTR_GREEN = 0, /**< Green */
+	RTE_MTR_YELLOW, /**< Yellow */
+	RTE_MTR_RED, /**< Red */
+	RTE_MTR_COLORS /**< Number of colors. */
+};
+
+/**
+ * Statistics counter type
+ */
+enum rte_mtr_stats_type {
+	/** Number of packets passed as green by the policer. */
+	RTE_MTR_STATS_N_PKTS_GREEN = 1 << 0,
+
+	/** Number of bytes passed as green by the policer. */
+	RTE_MTR_STATS_N_BYTES_GREEN = 1 << 1,
+
+	/** Number of packets passed as yellow by the policer. */
+	RTE_MTR_STATS_N_PKTS_YELLOW = 1 << 2,
+
+	/** Number of bytes passed as yellow by the policer. */
+	RTE_MTR_STATS_N_BYTES_YELLOW = 1 << 3,
+
+	/** Number of packets passed as red by the policer. */
+	RTE_MTR_STATS_N_PKTS_RED = 1 << 4,
+
+	/** Number of bytes passed as red by the policer. */
+	RTE_MTR_STATS_N_BYTES_RED = 1 << 5,
+
+	/** Number of packets dropped by the policer. */
+	RTE_MTR_STATS_N_PKTS_DROPPED = 1 << 6,
+
+	/** Number of bytes dropped by the policer. */
+	RTE_MTR_STATS_N_BYTES_DROPPED = 1 << 7,
+};
+
+/**
+ * Statistics counters
+ */
+struct rte_mtr_stats {
+	/** Number of packets passed by the policer (per color). */
+	uint64_t n_pkts[RTE_MTR_COLORS];
+
+	/** Number of bytes passed by the policer (per color). */
+	uint64_t n_bytes[RTE_MTR_COLORS];
+
+	/** Number of packets dropped by the policer. */
+	uint64_t n_pkts_dropped;
+
+	/** Number of bytes passed by the policer. */
+	uint64_t n_bytes_dropped;
+};
+
+/**
+ * Traffic metering algorithms
+ */
+enum rte_mtr_algorithm {
+	/** Single Rate Three Color Marker (srTCM) - IETF RFC 2697. */
+	RTE_MTR_SRTCM_RFC2697,
+
+	/** Two Rate Three Color Marker (trTCM) - IETF RFC 2698. */
+	RTE_MTR_TRTCM_RFC2698,
+
+	/** Two Rate Three Color Marker (trTCM) - IETF RFC 4115. */
+	RTE_MTR_TRTCM_RFC4115,
+};
+
+/**
+ * Meter profile
+ */
+struct rte_mtr_meter_profile {
+	/** Traffic metering algorithm. */
+	enum rte_mtr_algorithm alg;
+
+	RTE_STD_C11
+	union {
+		/** Items only valid when *alg* is set to srTCM - RFC 2697. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Committed Burst Size (CBS) (bytes). */
+			uint64_t cbs;
+
+			/** Excess Burst Size (EBS) (bytes). */
+			uint64_t ebs;
+		} srtcm_rfc2697;
+
+		/** Items only valid when *alg* is set to trTCM - RFC 2698. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Peak Information Rate (PIR) (bytes/second). */
+			uint64_t pir;
+
+			/** Committed Burst Size (CBS) (byes). */
+			uint64_t cbs;
+
+			/** Peak Burst Size (PBS) (bytes). */
+			uint64_t pbs;
+		} trtcm_rfc2698;
+
+		/** Items only valid when *alg* is set to trTCM - RFC 4115. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Excess Information Rate (EIR) (bytes/second). */
+			uint64_t eir;
+
+			/** Committed Burst Size (CBS) (byes). */
+			uint64_t cbs;
+
+			/** Excess Burst Size (EBS) (bytes). */
+			uint64_t ebs;
+		} trtcm_rfc4115;
+	};
+};
+
+/**
+ * Policer actions
+ */
+enum rte_mtr_policer_action {
+	/** Recolor the packet as green. */
+	MTR_POLICER_ACTION_COLOR_GREEN = 0,
+
+	/** Recolor the packet as yellow. */
+	MTR_POLICER_ACTION_COLOR_YELLOW,
+
+	/** Recolor the packet as red. */
+	MTR_POLICER_ACTION_COLOR_RED,
+
+	/** Drop the packet. */
+	MTR_POLICER_ACTION_DROP,
+};
+
+/**
+ * Parameters for each traffic metering & policing object
+ *
+ * @see enum rte_mtr_stats_type
+ */
+struct rte_mtr_params {
+	/** Meter profile ID. */
+	uint32_t meter_profile_id;
+
+	/** Meter input color in case of MTR object chaining. When non-zero: if
+	 * a previous MTR object is enabled in the same flow, then the color
+	 * determined by the latest MTR object in the same flow is used as the
+	 * input color by the current MTR object, otherwise the current MTR
+	 * object uses the *dscp_table* to determine the input color. When zero:
+	 * the color determined by any previous MTR object in same flow is
+	 * ignored by the current MTR object, which uses the *dscp_table* to
+	 * determine the input color.
+	 */
+	int use_prev_mtr_color;
+
+	/** Meter input color. When non-NULL: it points to a pre-allocated and
+	 * pre-populated table with exactly 64 elements providing the input
+	 * color for each value of the IPv4/IPv6 Differentiated Services Code
+	 * Point (DSCP) input packet field. When NULL: it is equivalent to
+	 * setting this parameter to an all-green populated table (i.e. table
+	 * with all the 64 elements set to green color). The color blind mode
+	 * is configured by setting *use_prev_mtr_color* to 0 and *dscp_table*
+	 * to either NULL or to an all-green populated table. When
+	 * *use_prev_mtr_color* is non-zero value or when *dscp_table* contains
+	 * at least one yellow or red color element, then the color aware mode
+	 * is configured.
+	 */
+	enum rte_mtr_color *dscp_table;
+
+	/** Non-zero to enable the meter, zero to disable the meter at the time
+	 * of MTR object creation.
+	 * @see rte_mtr_meter_disable()
+	 */
+	int meter_enable;
+
+	/** Policer actions (per meter output color). */
+	enum rte_mtr_policer_action action[RTE_MTR_COLORS];
+
+	/** Set of stats counters to be enabled.
+	 * @see enum rte_mtr_stats_type
+	 */
+	uint64_t stats_mask;
+};
+
+/**
+ * MTR capabilities
+ */
+struct rte_mtr_capabilities {
+	/** Maximum number of MTR objects. */
+	uint32_t n_max;
+
+	/** Maximum number of MTR objects that can be shared by multiple flows.
+	 * The value of zero indicates that shared MTR objects are not
+	 * supported. The maximum value is *n_max*.
+	 */
+	uint32_t n_shared_max;
+
+	/** When non-zero, this flag indicates that all the MTR objects that
+	 * cannot be shared by multiple flows have identical capability set.
+	 */
+	int identical;
+
+	/** When non-zero, this flag indicates that all the MTR objects that
+	 * can be shared by multiple flows have identical capability set.
+	 */
+	int shared_identical;
+
+	/** Maximum number of flows that can share the same MTR object. The
+	 * value of zero is invalid. The value of 1 means that shared MTR
+	 * objects not supported.
+	 */
+	uint32_t shared_n_flows_per_mtr_max;
+
+	/** Maximum number of MTR objects that can be part of the same flow. The
+	 * value of zero is invalid. The value of 1 indicates that MTR object
+	 * chaining is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t chaining_n_mtrs_per_flow_max;
+
+	/**
+	 * When non-zero, it indicates that the packet color identified by one
+	 * MTR object can be used as the packet input color by any subsequent
+	 * MTR object from the same flow. When zero, it indicates that the color
+	 * determined by one MTR object is always ignored by any subsequent MTR
+	 * object from the same flow. Only valid when MTR chaining is supported,
+	 * i.e. *chaining_n_mtrs_per_flow_max* is greater than 1. When non-zero,
+	 * it also means that the color aware mode is supported by at least one
+	 * metering algorithm.
+	 */
+	int chaining_use_prev_mtr_color_supported;
+
+	/**
+	 * When non-zero, it indicates that the packet color identified by one
+	 * MTR object is always used as the packet input color by any subsequent
+	 * MTR object that is part of the same flow. When zero, it indicates
+	 * that whether the color determined by one MTR object is either ignored
+	 * or used as the packet input color by any subsequent MTR object from
+	 * the same flow is individually configurable for each MTR object. Only
+	 * valid when *chaining_use_prev_mtr_color_supported* is non-zero.
+	 */
+	int chaining_use_prev_mtr_color_enforced;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the srTCM RFC 2697 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_srtcm_rfc2697_n_max;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the trTCM RFC 2698 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_trtcm_rfc2698_n_max;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the trTCM RFC 4115 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_trtcm_rfc4115_n_max;
+
+	/** Maximum traffic rate that can be metered by a single MTR object. For
+	 * srTCM RFC 2697, this is the maximum CIR rate. For trTCM RFC 2698,
+	 * this is the maximum PIR rate. For trTCM RFC 4115, this is the maximum
+	 * value for the sum of PIR and EIR rates.
+	 */
+	uint64_t meter_rate_max;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the srTCM RFC 2697 metering algorithm.
+	 */
+	int color_aware_srtcm_rfc2697_supported;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the trTCM RFC 2698 metering algorithm.
+	 */
+	int color_aware_trtcm_rfc2698_supported;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the trTCM RFC 4115 metering algorithm.
+	 */
+	int color_aware_trtcm_rfc4115_supported;
+
+	/** When non-zero, it indicates that the policer packet recolor actions
+	 * are supported.
+	 * @see enum rte_mtr_policer_action
+	 */
+	int policer_action_recolor_supported;
+
+	/** When non-zero, it indicates that the policer packet drop action is
+	 * supported.
+	 * @see enum rte_mtr_policer_action
+	 */
+	int policer_action_drop_supported;
+
+	/** Set of supported statistics counter types.
+	 * @see enum rte_mtr_stats_type
+	 */
+	uint64_t stats_mask;
+};
+
+/**
+ * Verbose error types.
+ *
+ * Most of them provide the type of the object referenced by struct
+ * rte_mtr_error::cause.
+ */
+enum rte_mtr_error_type {
+	RTE_MTR_ERROR_TYPE_NONE, /**< No error. */
+	RTE_MTR_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */
+	RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+	RTE_MTR_ERROR_TYPE_METER_PROFILE,
+	RTE_MTR_ERROR_TYPE_MTR_ID,
+	RTE_MTR_ERROR_TYPE_MTR_PARAMS,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_GREEN,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_YELLOW,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_RED,
+	RTE_MTR_ERROR_TYPE_STATS_MASK,
+	RTE_MTR_ERROR_TYPE_STATS,
+	RTE_MTR_ERROR_TYPE_SHARED,
+};
+
+/**
+ * Verbose error structure definition.
+ *
+ * This object is normally allocated by applications and set by PMDs, the
+ * message points to a constant string which does not need to be freed by
+ * the application, however its pointer can be considered valid only as long
+ * as its associated DPDK port remains configured. Closing the underlying
+ * device or unloading the PMD invalidates it.
+ *
+ * Both cause and message may be NULL regardless of the error type.
+ */
+struct rte_mtr_error {
+	enum rte_mtr_error_type type; /**< Cause field and error type. */
+	const void *cause; /**< Object responsible for the error. */
+	const char *message; /**< Human-readable error message. */
+};
+
+/**
+ * MTR capabilities get
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[out] cap
+ *   MTR capabilities. Needs to be pre-allocated and valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_capabilities_get(uint8_t port_id,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error);
+
+/**
+ * Meter profile add
+ *
+ * Create a new meter profile with ID set to *meter_profile_id*. The new profile
+ * is used to create one or several MTR objects.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] meter_profile_id
+ *   ID for the new meter profile. Needs to be unused by any of the existing
+ *   meter profiles added for the current port.
+ * @param[in] profile
+ *   Meter profile parameters. Needs to be pre-allocated and valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_add(uint8_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error);
+
+/**
+ * Meter profile delete
+ *
+ * Delete an existing meter profile. This operation fails when there is
+ * currently at least one user (i.e. MTR object) of this profile.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] meter_profile_id
+ *   Meter profile ID. Needs to be the valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_delete(uint8_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object create
+ *
+ * Create a new MTR object for the current port. This object is run as part of
+ * associated flow action for traffic metering and policing.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be unused by any of the existing MTR objects.
+ *   created for the current port.
+ * @param[in] params
+ *   MTR object params. Needs to be pre-allocated and valid.
+ * @param[in] shared
+ *   Non-zero when this MTR object can be shared by multiple flows, zero when
+ *   this MTR object can be used by a single flow.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_flow_action_type::RTE_FLOW_ACTION_TYPE_METER
+ */
+int
+rte_mtr_create(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object destroy
+ *
+ * Delete an existing MTR object. This operation fails when there is currently
+ * at least one user (i.e. flow) of this MTR object.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ *   created for the current port.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_destroy(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter disable
+ *
+ * Disable the meter of an existing MTR object. In disabled state, the meter of
+ * the current MTR object works in pass-through mode, meaning that for each
+ * input packet the meter output color is always the same as the input color. In
+ * particular, when the meter of the current MTR object is configured in color
+ * blind mode, the input color is always green, so the meter output color is
+ * also always green. Note that the policer and the statistics of the current
+ * MTR object are working as usual while the meter is disabled. No action is
+ * taken and this function returns successfully when the meter of the current
+ * MTR object is already disabled.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_disable(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter enable
+ *
+ * Enable the meter of an existing MTR object. If the MTR object has its meter
+ * already enabled, then no action is taken and this function returns
+ * successfully.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_enable(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter profile update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] meter_profile_id
+ *   Meter profile ID for the current MTR object. Needs to be valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object DSCP table update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] dscp_table
+ *   When non-NULL: it points to a pre-allocated and pre-populated table with
+ *   exactly 64 elements providing the input color for each value of the
+ *   IPv4/IPv6 Differentiated Services Code Point (DSCP) input packet field.
+ *   When NULL: it is equivalent to setting this parameter to an “all-green”
+ *   populated table (i.e. table with all the 64 elements set to green color).
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_dscp_table_update(uint8_t port_id,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object policer actions update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] action_mask
+ *   Bit mask indicating which policer actions need to be updated. One or more
+ *   policer actions can be updated in a single function invocation. To update
+ *   the policer action associated with color C, bit (1 << C) needs to be set in
+ *   *action_mask* and element at position C in the *actions* array needs to be
+ *   valid.
+ * @param[in] actions
+ *   Pre-allocated and pre-populated array of policer actions.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_policer_actions_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object enabled statistics counters update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] stats_mask
+ *   Mask of statistics counter types to be enabled for the current MTR object.
+ *   Any statistics counter type not included in this set is to be disabled for
+ *   the current MTR object.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_mtr_stats_type
+ */
+int
+rte_mtr_stats_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object statistics counters read
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[out] stats
+ *   When non-NULL, it contains the current value for the statistics counters
+ *   enabled for the current MTR object.
+ * @param[out] stats_mask
+ *   When non-NULL, it contains the mask of statistics counter types that are
+ *   currently enabled for this MTR object, indicating which of the counters
+ *   retrieved with the *stats* structure are valid.
+ * @param[in] clear
+ *   When this parameter has a non-zero value, the statistics counters are
+ *   cleared (i.e. set to zero) immediately after they have been read,
+ *   otherwise the statistics counters are left untouched.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_mtr_stats_type
+ */
+int
+rte_mtr_stats_read(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_RTE_MTR_H__ */
diff --git a/lib/librte_ether/rte_mtr_driver.h b/lib/librte_ether/rte_mtr_driver.h
new file mode 100644
index 0000000..bb7deed
--- /dev/null
+++ b/lib/librte_ether/rte_mtr_driver.h
@@ -0,0 +1,221 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INCLUDE_RTE_MTR_DRIVER_H__
+#define __INCLUDE_RTE_MTR_DRIVER_H__
+
+/**
+ * @file
+ * RTE Generic Traffic Metering and Policing API (Driver Side)
+ *
+ * This file provides implementation helpers for internal use by PMDs, they
+ * are not intended to be exposed to applications and are not subject to ABI
+ * versioning.
+ */
+
+#include <stdint.h>
+
+#include <rte_errno.h>
+#include "rte_ethdev.h"
+#include "rte_mtr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int (*rte_mtr_capabilities_get_t)(struct rte_eth_dev *dev,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error);
+/**< @internal MTR capabilities get */
+
+typedef int (*rte_mtr_meter_profile_add_t)(struct rte_eth_dev *dev,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error);
+/**< @internal MTR meter profile add */
+
+typedef int (*rte_mtr_meter_profile_delete_t)(struct rte_eth_dev *dev,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR meter profile delete */
+
+typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error);
+/**< @internal MTR object create */
+
+typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object destroy */
+
+typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter enable */
+
+typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter disable */
+
+typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter profile update */
+
+typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter DSCP table update */
+
+typedef int (*rte_mtr_policer_actions_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error);
+/**< @internal MTR object policer action update*/
+
+typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error);
+/**< @internal MTR object enabled stats update */
+
+typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error);
+/**< @internal MTR object stats read */
+
+struct rte_mtr_ops {
+	/** MTR capabilities get */
+	rte_mtr_capabilities_get_t capabilities_get;
+
+	/** MTR meter profile add */
+	rte_mtr_meter_profile_add_t meter_profile_add;
+
+	/** MTR meter profile delete */
+	rte_mtr_meter_profile_delete_t meter_profile_delete;
+
+	/** MTR object create */
+	rte_mtr_create_t create;
+
+	/** MTR object destroy */
+	rte_mtr_destroy_t destroy;
+
+	/** MTR object meter enable */
+	rte_mtr_meter_enable_t meter_enable;
+
+	/** MTR object meter disable */
+	rte_mtr_meter_disable_t meter_disable;
+
+	/** MTR object meter profile update */
+	rte_mtr_meter_profile_update_t meter_profile_update;
+
+	/** MTR object meter DSCP table update */
+	rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
+
+	/** MTR object policer action update */
+	rte_mtr_policer_actions_update_t policer_actions_update;
+
+	/** MTR object enabled stats update */
+	rte_mtr_stats_update_t stats_update;
+
+	/** MTR object stats read */
+	rte_mtr_stats_read_t stats_read;
+};
+
+/**
+ * Initialize generic error structure.
+ *
+ * This function also sets rte_errno to a given value.
+ *
+ * @param[out] error
+ *   Pointer to error structure (may be NULL).
+ * @param[in] code
+ *   Related error code (rte_errno).
+ * @param[in] type
+ *   Cause field and error type.
+ * @param[in] cause
+ *   Object responsible for the error.
+ * @param[in] message
+ *   Human-readable error message.
+ *
+ * @return
+ *   Error code.
+ */
+static inline int
+rte_mtr_error_set(struct rte_mtr_error *error,
+		   int code,
+		   enum rte_mtr_error_type type,
+		   const void *cause,
+		   const char *message)
+{
+	if (error) {
+		*error = (struct rte_mtr_error){
+			.type = type,
+			.cause = cause,
+			.message = message,
+		};
+	}
+	rte_errno = code;
+	return code;
+}
+
+/**
+ * Get generic traffic metering and policing operations structure from a port
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[out] error
+ *   Error details
+ *
+ * @return
+ *   The traffic metering and policing operations structure associated with
+ *   port_id on success, NULL otherwise.
+ */
+const struct rte_mtr_ops *
+rte_mtr_ops_get(uint8_t port_id, struct rte_mtr_error *error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */
-- 
2.7.4

^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH v6 0/5] increase port_id range
  2017-10-06  2:15  0%         ` [dpdk-dev] [PATCH v6 0/5] " Ferruh Yigit
  2017-10-06 13:31  0%           ` Gaëtan Rivet
@ 2017-10-06 14:29  0%           ` Thomas Monjalon
  2017-10-06 16:02  0%           ` Thomas Monjalon
  2017-10-11 21:21  0%           ` Ferruh Yigit
  3 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-06 14:29 UTC (permalink / raw)
  To: Ferruh Yigit, Zhiyong Yang
  Cc: dev, Nelio Laranjeiro, Gaetan Rivet, Declan Doherty

06/10/2017 04:15, Ferruh Yigit:
> On 9/29/2017 8:17 AM, Zhiyong Yang wrote:
> > port_id is currently defined as uint8_t, which is limited to the range
> > 0 to 255. A larger range is required for vdev scalability.
> > 
> > It is necessary for a redefinition of port_id to extend it from
> > 1 bytes to 2 bytes. All ethdev APIs and usages related to port_id will
> > be changed at the same time.
> > 
> > Discussion about port_id is the following thread.
> > http://www.dpdk.org/dev/patchwork/patch/23208/
> > 
> > Changes in V2:
> > 1. cover more PMDs to increase port_id range.
> > 2. cover more examples to increase port_id range.
> > 3. add 17.11 release note.
> > 
> > Changes in V3:
> > 1.  cover mlx4 and mlx5.
> > 2.  add to increase port_id range in test code.
> > 3.  The patch "librte_mbuf: modify port initialization value" is merged
> >     into the patchset.
> > 
> > Changes in V4:
> > 1.  Add a patch to remove bonding APIs using ABI versioning according to
> >     Ferruh's comments.
> > 2.  Unify to use typedef portid_t in testpmd code.
> > 3.  update release note deprecation doc in 2/5
> > 4.  fix some issues according to comments.
> > 
> > Changes in V5:
> > 1.  For 1/5, bond_mode_8023ad_conf_get_v1708() and bond_mode_8023ad_conf
> >     _get() are merged into one function bond_mode_8023ad_conf_get.
> > 
> > Changes in V6:
> > 1.  For 2/5, remove the unnecessary LIBABIVER in Makefile and update
> >     the release notes "Shared Library Versions".
> >     Note: The patchset have dependency on the following patch.
> >     http://www.dpdk.org/dev/patchwork/patch/28738/
> >     http://www.dpdk.org/dev/patchwork/patch/29219/
> > 
> > Note: 3/5 and 4/5 patches' building depends on 2/5 patch since 2/5 patch
> > breaks lib/PMD API/ABI.
> > 
> > Zhiyong Yang (5):
> >   net/bonding: remove bonding APIs using ABI versioning
> >   ethdev: increase port_id range
> >   examples: increase port_id range
> >   test: increase port_id range
> >   librte_mbuf: modify port initialization value
> 
> Series applied to dpdk-next-net/master, thanks.

The patches 2, 3, 4 must be squashed, otherwise compilation fails.
Will squash in master branch.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 0/5] increase port_id range
  2017-10-06  2:15  0%         ` [dpdk-dev] [PATCH v6 0/5] " Ferruh Yigit
@ 2017-10-06 13:31  0%           ` Gaëtan Rivet
  2017-10-06 14:29  0%           ` Thomas Monjalon
                             ` (2 subsequent siblings)
  3 siblings, 0 replies; 200+ results
From: Gaëtan Rivet @ 2017-10-06 13:31 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: Zhiyong Yang, dev, thomas, Nelio Laranjeiro, Declan Doherty

On Fri, Oct 06, 2017 at 03:15:40AM +0100, Ferruh Yigit wrote:
> On 9/29/2017 8:17 AM, Zhiyong Yang wrote:
> > port_id is currently defined as uint8_t, which is limited to the range
> > 0 to 255. A larger range is required for vdev scalability.
> > 
> > It is necessary for a redefinition of port_id to extend it from
> > 1 bytes to 2 bytes. All ethdev APIs and usages related to port_id will
> > be changed at the same time.
> > 
> > Discussion about port_id is the following thread.
> > http://www.dpdk.org/dev/patchwork/patch/23208/
> > 
> > Changes in V2:
> > 1. cover more PMDs to increase port_id range.
> > 2. cover more examples to increase port_id range.
> > 3. add 17.11 release note.
> > 
> > Changes in V3:
> > 1.  cover mlx4 and mlx5.
> > 2.  add to increase port_id range in test code.
> > 3.  The patch "librte_mbuf: modify port initialization value" is merged
> >     into the patchset.
> > 
> > Changes in V4:
> > 1.  Add a patch to remove bonding APIs using ABI versioning according to
> >     Ferruh's comments.
> > 2.  Unify to use typedef portid_t in testpmd code.
> > 3.  update release note deprecation doc in 2/5
> > 4.  fix some issues according to comments.
> > 
> > Changes in V5:
> > 1.  For 1/5, bond_mode_8023ad_conf_get_v1708() and bond_mode_8023ad_conf
> >     _get() are merged into one function bond_mode_8023ad_conf_get.
> > 
> > Changes in V6:
> > 1.  For 2/5, remove the unnecessary LIBABIVER in Makefile and update
> >     the release notes "Shared Library Versions".
> >     Note: The patchset have dependency on the following patch.
> >     http://www.dpdk.org/dev/patchwork/patch/28738/
> >     http://www.dpdk.org/dev/patchwork/patch/29219/
> > 
> > Note: 3/5 and 4/5 patches' building depends on 2/5 patch since 2/5 patch
> > breaks lib/PMD API/ABI.
> > 
> > Zhiyong Yang (5):
> >   net/bonding: remove bonding APIs using ABI versioning
> >   ethdev: increase port_id range
> >   examples: increase port_id range
> >   test: increase port_id range
> >   librte_mbuf: modify port initialization value
> 
> Series applied to dpdk-next-net/master, thanks.
> 
> There was merge conflict for:
> rte_eth_bond_pmd.c
> failsafe_private.h
> mlx5_rxtx.h
> 
> Maintainers of these files cc'ed, can you please double check latest
> files in next-net?

Hello Ferruh,

The only potential conflicts I see are on the event callbacks

8<-----

int failsafe_eth_rmv_event_callback(uint16_t port_id,
                                    enum rte_eth_event_type type,
                                    void *arg, void *out);
int failsafe_eth_lsc_event_callback(uint16_t port_id,
                                    enum rte_eth_event_type event,
                                    void *cb_arg, void *out);
----->8

and I see no issue there on next-net.
Let me know if you want me to check something specific.

Regards,
-- 
Gaëtan Rivet
6WIND

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 0/5] increase port_id range
  2017-09-29  7:17  4%       ` [dpdk-dev] [PATCH v6 0/5] " Zhiyong Yang
  2017-09-29  7:17  7%         ` [dpdk-dev] [PATCH v6 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
  2017-09-29  7:17  1%         ` [dpdk-dev] [PATCH v6 2/5] ethdev: increase port_id range Zhiyong Yang
@ 2017-10-06  2:15  0%         ` Ferruh Yigit
  2017-10-06 13:31  0%           ` Gaëtan Rivet
                             ` (3 more replies)
  2 siblings, 4 replies; 200+ results
From: Ferruh Yigit @ 2017-10-06  2:15 UTC (permalink / raw)
  To: Zhiyong Yang, dev; +Cc: thomas, Nelio Laranjeiro, Gaetan Rivet, Declan Doherty

On 9/29/2017 8:17 AM, Zhiyong Yang wrote:
> port_id is currently defined as uint8_t, which is limited to the range
> 0 to 255. A larger range is required for vdev scalability.
> 
> It is necessary for a redefinition of port_id to extend it from
> 1 bytes to 2 bytes. All ethdev APIs and usages related to port_id will
> be changed at the same time.
> 
> Discussion about port_id is the following thread.
> http://www.dpdk.org/dev/patchwork/patch/23208/
> 
> Changes in V2:
> 1. cover more PMDs to increase port_id range.
> 2. cover more examples to increase port_id range.
> 3. add 17.11 release note.
> 
> Changes in V3:
> 1.  cover mlx4 and mlx5.
> 2.  add to increase port_id range in test code.
> 3.  The patch "librte_mbuf: modify port initialization value" is merged
>     into the patchset.
> 
> Changes in V4:
> 1.  Add a patch to remove bonding APIs using ABI versioning according to
>     Ferruh's comments.
> 2.  Unify to use typedef portid_t in testpmd code.
> 3.  update release note deprecation doc in 2/5
> 4.  fix some issues according to comments.
> 
> Changes in V5:
> 1.  For 1/5, bond_mode_8023ad_conf_get_v1708() and bond_mode_8023ad_conf
>     _get() are merged into one function bond_mode_8023ad_conf_get.
> 
> Changes in V6:
> 1.  For 2/5, remove the unnecessary LIBABIVER in Makefile and update
>     the release notes "Shared Library Versions".
>     Note: The patchset have dependency on the following patch.
>     http://www.dpdk.org/dev/patchwork/patch/28738/
>     http://www.dpdk.org/dev/patchwork/patch/29219/
> 
> Note: 3/5 and 4/5 patches' building depends on 2/5 patch since 2/5 patch
> breaks lib/PMD API/ABI.
> 
> Zhiyong Yang (5):
>   net/bonding: remove bonding APIs using ABI versioning
>   ethdev: increase port_id range
>   examples: increase port_id range
>   test: increase port_id range
>   librte_mbuf: modify port initialization value

Series applied to dpdk-next-net/master, thanks.

There was merge conflict for:
rte_eth_bond_pmd.c
failsafe_private.h
mlx5_rxtx.h

Maintainers of these files cc'ed, can you please double check latest
files in next-net?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
  2017-10-05 21:55  0%       ` Mokhtar, Amr
@ 2017-10-05 22:22  0%         ` Thomas Monjalon
  2017-10-06 23:27  0%           ` Mokhtar, Amr
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-10-05 22:22 UTC (permalink / raw)
  To: Mokhtar, Amr; +Cc: dev, fbl, aconole, bluca

05/10/2017 23:55, Mokhtar, Amr:
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > 03/10/2017 16:29, Mokhtar, Amr:
> > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > > 25/08/2017 15:46, Amr Mokhtar:
> > > > > +int
> > > > > +rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues,
> > > > > +		const struct rte_bbdev_conf *conf);
> > > >
> > > > I am not convinced by the "configure all" function in ethdev.
> > > > We break the ABI each time we add a new feature to configure.
> > > > And it does not really help to have all configurations in one struct.
> > > > Would you mind to split the struct rte_bbdev_conf and split the
> > > > function accordingly?
> > >
> > > There is nothing to split tbh. The only parameter it has is the socket_id.
> > > And in fact, it's optional, can be null. The only config we need is num_queues.
> > 
> > Indeed, there is nothing in this struct.
> > If you need only to allocate queues, you just have to rename this function.
> > 
> > > I don't see in the near future that we may need to add more config params.
> > > As a side, in the time of the implementation we were trying to avoid
> > > any diversions from the current design ideology of ethdev and cryptodev.
> > 
> > There is no ideology in ethdev, just some mistakes ;)
> > 
> > > Can we leave it for consideration with future releases?
> > 
> > No it should be addressed from the beginning.
> > 
> > When you will need to add something more to configure port-wise, you should
> > add a new function instead of breaking the ABI of the global conf struct.
> > That's why the configure option should be more specialized.
> > 
> > Distro people were complaining about ABI breakage last week.
> > This is exactly an example of how to avoid it from the beginning.
> > 
> 
> Ok, got your point. I was looking at it from an API-only standpoint.
> How about modifying it into?
> int
> rte_bbdev_setup_queues(uint16_t dev_id, uint16_t num_queues, int socket_id);

Yes OK

[...]
> > > > > +struct __rte_cache_aligned rte_bbdev {
> > > > > +	rte_bbdev_enqueue_ops_t enqueue_ops; /**< Enqueue function */
> > > > > +	rte_bbdev_dequeue_ops_t dequeue_ops;  /**< Dequeue function */
> > > > > +	const struct rte_bbdev_ops *dev_ops;  /**< Functions exported by
> > > > > +PMD
> > > > */
> > > > > +	struct rte_bbdev_data *data;  /**< Pointer to device data */
> > > > > +	bool attached;  /**< If device is currently attached or not */
> > > >
> > > > What "attached" means?
> > > > I'm afraid you are trying to manage hotplug in the wrong layer.
> > >
> > > Hotplug is not supported in the current release.
> > 
> > It is not answering the question.
> > What is an "attached" device?
> 
> "Attached" means that the PCI device was probed and the bbdev device slot is allocated.
> For software devices, means that a virtual bbdev device (vdev) is allocated for bbdev.
> Same way the "attached" approach used in cryptodev.

Not sure to understand.
If "attached" means "allocated", when is it false?

[...]
> > > > > +/** Structure specifying a single operation */ struct rte_bbdev_op {
> > > > > +	enum rte_bbdev_op_type type;  /**< Type of this operation */
> > > > > +	int status;  /**< Status of operation that was performed */
> > > > > +	struct rte_mempool *mempool;  /**< Mempool which op instance is
> > > > > +in
> > > > */
> > > > > +	void *opaque_data;  /**< Opaque pointer for user data */
> > > > > +	/**
> > > > > +	 * Anonymous union of operation-type specific parameters. When
> > > > allocated
> > > > > +	 * using rte_bbdev_op_pool_create(), space is allocated for the
> > > > > +	 * parameters at the end of each rte_bbdev_op structure, and the
> > > > > +	 * pointers here point to it.
> > > > > +	 */
> > > > > +	RTE_STD_C11
> > > > > +	union {
> > > > > +		void *generic;
> > > > > +		struct rte_bbdev_op_turbo_dec *turbo_dec;
> > > > > +		struct rte_bbdev_op_turbo_enc *turbo_enc;
> > > > > +	};
> > > > > +};
> > > >
> > > > I am not sure it is a good idea to fit every operations in the same
> > > > struct and the same functions.
> > >
> > > Due to the fact that our design adopts this idea that a device can
> > > support both the encode and decode operations.
> > > Then, at the time of PMD registration, the enqueue functions is allocated.
> > > This enqueue() function is common for both operations.
> > > This fitted operation structure is essential for the driver to decide on the
> > operation.
> > 
> > Sorry I do not understand why you must have a "generic operation".
> > Please, could you try again to explain this design to someone not fully
> > understanding how turbo enc/dec works?
> 
> Oh, sorry, I was not paying attention that you're referring to "void *generic"
> It is just a place-holder for any other operation types. Can be removed if you like.

No I was not referring to void *generic.
It is the same question as in the RFC.
I don't understand the benefit of grouping different things in an union.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
  2017-10-03 15:17  4%     ` Thomas Monjalon
  2017-10-04 17:11  0%       ` Flavio Leitner
@ 2017-10-05 21:55  0%       ` Mokhtar, Amr
  2017-10-05 22:22  0%         ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Mokhtar, Amr @ 2017-10-05 21:55 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, fbl, aconole, bluca



> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Tuesday 3 October 2017 16:18
> To: Mokhtar, Amr <amr.mokhtar@intel.com>
> Cc: dev@dpdk.org; fbl@redhat.com; aconole@redhat.com; bluca@debian.org
> Subject: Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
> 
> 03/10/2017 16:29, Mokhtar, Amr:
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > 25/08/2017 15:46, Amr Mokhtar:
> > > > +int
> > > > +rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues,
> > > > +		const struct rte_bbdev_conf *conf);
> > >
> > > I am not convinced by the "configure all" function in ethdev.
> > > We break the ABI each time we add a new feature to configure.
> > > And it does not really help to have all configurations in one struct.
> > > Would you mind to split the struct rte_bbdev_conf and split the
> > > function accordingly?
> >
> > There is nothing to split tbh. The only parameter it has is the socket_id.
> > And in fact, it's optional, can be null. The only config we need is num_queues.
> 
> Indeed, there is nothing in this struct.
> If you need only to allocate queues, you just have to rename this function.
> 
> > I don't see in the near future that we may need to add more config params.
> > As a side, in the time of the implementation we were trying to avoid
> > any diversions from the current design ideology of ethdev and cryptodev.
> 
> There is no ideology in ethdev, just some mistakes ;)
> 
> > Can we leave it for consideration with future releases?
> 
> No it should be addressed from the beginning.
> 
> When you will need to add something more to configure port-wise, you should
> add a new function instead of breaking the ABI of the global conf struct.
> That's why the configure option should be more specialized.
> 
> Distro people were complaining about ABI breakage last week.
> This is exactly an example of how to avoid it from the beginning.
> 

Ok, got your point. I was looking at it from an API-only standpoint.
How about modifying it into?
int
rte_bbdev_setup_queues(uint16_t dev_id, uint16_t num_queues, int socket_id);

> 
> > > [...]
> > > > +struct __rte_cache_aligned rte_bbdev {
> > > > +	rte_bbdev_enqueue_ops_t enqueue_ops; /**< Enqueue function */
> > > > +	rte_bbdev_dequeue_ops_t dequeue_ops;  /**< Dequeue function */
> > > > +	const struct rte_bbdev_ops *dev_ops;  /**< Functions exported by
> > > > +PMD
> > > */
> > > > +	struct rte_bbdev_data *data;  /**< Pointer to device data */
> > > > +	bool attached;  /**< If device is currently attached or not */
> > >
> > > What "attached" means?
> > > I'm afraid you are trying to manage hotplug in the wrong layer.
> >
> > Hotplug is not supported in the current release.
> 
> It is not answering the question.
> What is an "attached" device?

"Attached" means that the PCI device was probed and the bbdev device slot is allocated.
For software devices, means that a virtual bbdev device (vdev) is allocated for bbdev.
Same way the "attached" approach used in cryptodev.

> 
> 
> > > [...]
> > > > +/** Structure specifying a single operation */ struct rte_bbdev_op {
> > > > +	enum rte_bbdev_op_type type;  /**< Type of this operation */
> > > > +	int status;  /**< Status of operation that was performed */
> > > > +	struct rte_mempool *mempool;  /**< Mempool which op instance is
> > > > +in
> > > */
> > > > +	void *opaque_data;  /**< Opaque pointer for user data */
> > > > +	/**
> > > > +	 * Anonymous union of operation-type specific parameters. When
> > > allocated
> > > > +	 * using rte_bbdev_op_pool_create(), space is allocated for the
> > > > +	 * parameters at the end of each rte_bbdev_op structure, and the
> > > > +	 * pointers here point to it.
> > > > +	 */
> > > > +	RTE_STD_C11
> > > > +	union {
> > > > +		void *generic;
> > > > +		struct rte_bbdev_op_turbo_dec *turbo_dec;
> > > > +		struct rte_bbdev_op_turbo_enc *turbo_enc;
> > > > +	};
> > > > +};
> > >
> > > I am not sure it is a good idea to fit every operations in the same
> > > struct and the same functions.
> >
> > Due to the fact that our design adopts this idea that a device can
> > support both the encode and decode operations.
> > Then, at the time of PMD registration, the enqueue functions is allocated.
> > This enqueue() function is common for both operations.
> > This fitted operation structure is essential for the driver to decide on the
> operation.
> 
> Sorry I do not understand why you must have a "generic operation".
> Please, could you try again to explain this design to someone not fully
> understanding how turbo enc/dec works?

Oh, sorry, I was not paying attention that you're referring to "void *generic"
It is just a place-holder for any other operation types. Can be removed if you like.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v8 0/9] Policy Based Power Control for Guest
  2017-10-05 13:28  2%       ` [dpdk-dev] [PATCH v7 " David Hunt
  2017-10-05 13:54  0%         ` Ananyev, Konstantin
@ 2017-10-05 14:34  2%         ` David Hunt
  2017-10-09 22:34  0%           ` Ferruh Yigit
  1 sibling, 1 reply; 200+ results
From: David Hunt @ 2017-10-05 14:34 UTC (permalink / raw)
  To: dev; +Cc: konstantin.ananyev, jingjing.wu, santosh.shukla

Policy Based Power Control for Guest

This patchset adds the facility for a guest VM to send a policy down to the
host that will allow the host to scale up/down cpu frequencies
depending on the policy criteria independently of the DPDK app running in
the guest.  This differs from the previous vm_power implementation where
individual scale up/down requests were send from the guest to the host via
virtio-serial.

V8 patchset changes:
  * Added Ack's and Reviewed-by's to individual patches in the set so as to
    keep patchwork A/R/T flags properly in sync.

V7 patchset changes:
  * Changed return code of rte_pmd_i40e_query_vfid_by_mac() from an
    int64_t to int

V6 patchset changes:
  * Fixed comments in header for rte_pmd_i40e_query_vfid_by_mac.
  * changed rte_pmd_i40e_query_vfid_by_mac return code from uint to int
    as it can return negative error codes.
  * Removed bool enum from channel_commands.h, including stdbool.h instead.
  * Added #define VM_MAX_NAME_SZ 32 to channel_commands.h
  * Renamed a few variables to be more readable.
  * Added returns in a few places if failed to get info on domain.
  * Fixed power_manager_init to keep track of num_freqs for each core.
  * In power_manager_scale_core_med(), changed a hardcoded '5' to instead
    be calculated from the centre of the frequency list
    (global_core_freq_info[core_num].num_freqs / 2)

V5 patchset changes:
  * Removed most of the #ifdef I40_PMD as it will be applicable to
    other PMDs in the future.
  * Changed the parameter of rte_pmd_i40e_query_vfid_by_mac from a uint64
    to a const struct ether_addr *, rather than casting it later in the
    function.

V4 patchset changes:
  * None, re-post to mailing list under the correct email thread.

V3 patchset changes:
  * Changed to using is_same_ether_addr() instead of looping through
    the mac address bytes to compare them.
  * Tweaked some comments and working in the i40e patch after review.
  * Added a patch to the set to add new i40e function to map file, so
    as to allow shared library builds. The power library API needs a cleanup
    in next release, so will add API/ABI warning for this cleanup in a
    separate patch.

V2 patchset changes:
  * Removed API's in ethdev layer.
  * Now just a single new API in the i40e driver for mapping VF MAC to
    VF index.
  * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
  * Removed function for reading i40e register, moved to using the
    standard stats API.
  * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
  * Cleaned up policy generation code.

It's a modification of the vm_power_manager app that runs in the host, and
the guest_vm_power_app example app that runs in the guest. This allows the
guest to send down a policy to the host via virtio-serial, which then allows
the host to scale up/down based on the criteria in the policy, resulting in
quicker scale up/down than individual requests coming from the guest.
It also means that the DPDK application running in the guest does not need
to be modified in any way, it is unaware that it's cores are being scaled
up/down, reducing the effort in implementing a power-aware infrastructure.

The usage model is as follows:
1. Set up the VF's and assign to the guest in the usual way.
2. run vm_power_manager on the host, creating a channel to the guest.
3. Start the guest_vm_power_mgr app on the guest, which establishes
   a virtio-serial channel to the host.
4. Send down the profile for the guest using the "send_profile now" command.
   There is an example profile hard-coded into guest_vm_power_mgr.
5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
6. Send traffic into the VFs at varying traffic rates.
   Observe the frequency change on the host (turbostat -i 1)

The sequence of code changes are as follows:

A new function has been aded to the i40e driver to allow mapping of
a VF MAC to VF index.

Next we make an addition to librte_power that adds an extra command to allow
the passing of a policy structure from the guest to the host. This struct
contains information like busy/quiet hour, packet throughput thresholds, etc.

The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
physical CPU (pcpu) IDs so that the host can scale up/down the cores used
in the guest.

The remaining patches are functionality to process the policy, and take action
when the relevant trigger occurs to cause a frequency change.

[1/9] net/i40e: add API to convert VF MAC to VF id
[2/9] lib/librte_power: add extra msg type for policies
[3/9] examples/vm_power_mgr: add vcpu to pcpu mapping
[4/9] examples/vm_power_mgr: add scale to medium freq fn
[5/9] examples/vm_power_mgr: add policy to channels
[6/9] examples/vm_power_mgr: add port initialisation
[7/9] power: add send channel msg function to map file
[8/9] examples/guest_cli: add send policy to host
[9/9] examples/vm_power_mgr: set MAC address of VF

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH v7 0/9] Policy Based Power Control for Guest
  2017-10-05 13:28  2%       ` [dpdk-dev] [PATCH v7 " David Hunt
@ 2017-10-05 13:54  0%         ` Ananyev, Konstantin
  2017-10-05 14:34  2%         ` [dpdk-dev] [PATCH v8 " David Hunt
  1 sibling, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2017-10-05 13:54 UTC (permalink / raw)
  To: Hunt, David, dev; +Cc: Wu, Jingjing, santosh.shukla



> -----Original Message-----
> From: Hunt, David
> Sent: Thursday, October 5, 2017 2:28 PM
> To: dev@dpdk.org
> Cc: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; santosh.shukla@caviumnetworks.com
> Subject: [PATCH v7 0/9] Policy Based Power Control for Guest
> 
> Policy Based Power Control for Guest
> 
> This patchset adds the facility for a guest VM to send a policy down to the
> host that will allow the host to scale up/down cpu frequencies
> depending on the policy criteria independently of the DPDK app running in
> the guest.  This differs from the previous vm_power implementation where
> individual scale up/down requests were send from the guest to the host via
> virtio-serial.
> 
> V7 patchset changes:
>   * Changed return code of rte_pmd_i40e_query_vfid_by_mac() from an
>     int64_t to int
> 
> V6 patchset changes:
>   * Fixed comments in header for rte_pmd_i40e_query_vfid_by_mac.
>   * changed rte_pmd_i40e_query_vfid_by_mac return code from uint to int
>     as it can return negative error codes.
>   * Removed bool enum from channel_commands.h, including stdbool.h instead.
>   * Added #define VM_MAX_NAME_SZ 32 to channel_commands.h
>   * Renamed a few variables to be more readable.
>   * Added returns in a few places if failed to get info on domain.
>   * Fixed power_manager_init to keep track of num_freqs for each core.
>   * In power_manager_scale_core_med(), changed a hardcoded '5' to instead
>     be calculated from the centre of the frequency list
>     (global_core_freq_info[core_num].num_freqs / 2)
> 
> V5 patchset changes:
>   * Removed most of the #ifdef I40_PMD as it will be applicable to
>     other PMDs in the future.
>   * Changed the parameter of rte_pmd_i40e_query_vfid_by_mac from a uint64
>     to a const struct ether_addr *, rather than casting it later in the
>     function.
> 
> V4 patchset changes:
>   * None, re-post to mailing list under the correct email thread.
> 
> V3 patchset changes:
>   * Changed to using is_same_ether_addr() instead of looping through
>     the mac address bytes to compare them.
>   * Tweaked some comments and working in the i40e patch after review.
>   * Added a patch to the set to add new i40e function to map file, so
>     as to allow shared library builds. The power library API needs a cleanup
>     in next release, so will add API/ABI warning for this cleanup in a
>     separate patch.
> 
> V2 patchset changes:
>   * Removed API's in ethdev layer.
>   * Now just a single new API in the i40e driver for mapping VF MAC to
>     VF index.
>   * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
>   * Removed function for reading i40e register, moved to using the
>     standard stats API.
>   * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
>   * Cleaned up policy generation code.
> 
> It's a modification of the vm_power_manager app that runs in the host, and
> the guest_vm_power_app example app that runs in the guest. This allows the
> guest to send down a policy to the host via virtio-serial, which then allows
> the host to scale up/down based on the criteria in the policy, resulting in
> quicker scale up/down than individual requests coming from the guest.
> It also means that the DPDK application running in the guest does not need
> to be modified in any way, it is unaware that it's cores are being scaled
> up/down, reducing the effort in implementing a power-aware infrastructure.
> 
> The usage model is as follows:
> 1. Set up the VF's and assign to the guest in the usual way.
> 2. run vm_power_manager on the host, creating a channel to the guest.
> 3. Start the guest_vm_power_mgr app on the guest, which establishes
>    a virtio-serial channel to the host.
> 4. Send down the profile for the guest using the "send_profile now" command.
>    There is an example profile hard-coded into guest_vm_power_mgr.
> 5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
> 6. Send traffic into the VFs at varying traffic rates.
>    Observe the frequency change on the host (turbostat -i 1)
> 
> The sequence of code changes are as follows:
> 
> A new function has been aded to the i40e driver to allow mapping of
> a VF MAC to VF index.
> 
> Next we make an addition to librte_power that adds an extra command to allow
> the passing of a policy structure from the guest to the host. This struct
> contains information like busy/quiet hour, packet throughput thresholds, etc.
> 
> The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
> physical CPU (pcpu) IDs so that the host can scale up/down the cores used
> in the guest.
> 
> The remaining patches are functionality to process the policy, and take action
> when the relevant trigger occurs to cause a frequency change.
> 
> [1/9] net/i40e: add API to convert VF MAC to VF id
> [2/9] lib/librte_power: add extra msg type for policies
> [3/9] examples/vm_power_mgr: add vcpu to pcpu mapping
> [4/9] examples/vm_power_mgr: add scale to medium freq fn
> [5/9] examples/vm_power_mgr: add policy to channels
> [6/9] examples/vm_power_mgr: add port initialisation
> [7/9] power: add send channel msg function to map file
> [8/9] examples/guest_cli: add send policy to host
> [9/9] examples/vm_power_mgr: set MAC address of VF

Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v7 0/9] Policy Based Power Control for Guest
  2017-10-05 12:25  2%     ` [dpdk-dev] [PATCH v6 " David Hunt
@ 2017-10-05 13:28  2%       ` David Hunt
  2017-10-05 13:54  0%         ` Ananyev, Konstantin
  2017-10-05 14:34  2%         ` [dpdk-dev] [PATCH v8 " David Hunt
  0 siblings, 2 replies; 200+ results
From: David Hunt @ 2017-10-05 13:28 UTC (permalink / raw)
  To: dev; +Cc: konstantin.ananyev, jingjing.wu, santosh.shukla

Policy Based Power Control for Guest

This patchset adds the facility for a guest VM to send a policy down to the
host that will allow the host to scale up/down cpu frequencies
depending on the policy criteria independently of the DPDK app running in
the guest.  This differs from the previous vm_power implementation where
individual scale up/down requests were send from the guest to the host via
virtio-serial.

V7 patchset changes:
  * Changed return code of rte_pmd_i40e_query_vfid_by_mac() from an
    int64_t to int

V6 patchset changes:
  * Fixed comments in header for rte_pmd_i40e_query_vfid_by_mac.
  * changed rte_pmd_i40e_query_vfid_by_mac return code from uint to int
    as it can return negative error codes.
  * Removed bool enum from channel_commands.h, including stdbool.h instead.
  * Added #define VM_MAX_NAME_SZ 32 to channel_commands.h
  * Renamed a few variables to be more readable.
  * Added returns in a few places if failed to get info on domain.
  * Fixed power_manager_init to keep track of num_freqs for each core.
  * In power_manager_scale_core_med(), changed a hardcoded '5' to instead
    be calculated from the centre of the frequency list
    (global_core_freq_info[core_num].num_freqs / 2)

V5 patchset changes:
  * Removed most of the #ifdef I40_PMD as it will be applicable to
    other PMDs in the future.
  * Changed the parameter of rte_pmd_i40e_query_vfid_by_mac from a uint64
    to a const struct ether_addr *, rather than casting it later in the
    function.

V4 patchset changes:
  * None, re-post to mailing list under the correct email thread.

V3 patchset changes:
  * Changed to using is_same_ether_addr() instead of looping through
    the mac address bytes to compare them.
  * Tweaked some comments and working in the i40e patch after review.
  * Added a patch to the set to add new i40e function to map file, so
    as to allow shared library builds. The power library API needs a cleanup
    in next release, so will add API/ABI warning for this cleanup in a
    separate patch.

V2 patchset changes:
  * Removed API's in ethdev layer.
  * Now just a single new API in the i40e driver for mapping VF MAC to
    VF index.
  * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
  * Removed function for reading i40e register, moved to using the
    standard stats API.
  * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
  * Cleaned up policy generation code.

It's a modification of the vm_power_manager app that runs in the host, and
the guest_vm_power_app example app that runs in the guest. This allows the
guest to send down a policy to the host via virtio-serial, which then allows
the host to scale up/down based on the criteria in the policy, resulting in
quicker scale up/down than individual requests coming from the guest.
It also means that the DPDK application running in the guest does not need
to be modified in any way, it is unaware that it's cores are being scaled
up/down, reducing the effort in implementing a power-aware infrastructure.

The usage model is as follows:
1. Set up the VF's and assign to the guest in the usual way.
2. run vm_power_manager on the host, creating a channel to the guest.
3. Start the guest_vm_power_mgr app on the guest, which establishes
   a virtio-serial channel to the host.
4. Send down the profile for the guest using the "send_profile now" command.
   There is an example profile hard-coded into guest_vm_power_mgr.
5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
6. Send traffic into the VFs at varying traffic rates.
   Observe the frequency change on the host (turbostat -i 1)

The sequence of code changes are as follows:

A new function has been aded to the i40e driver to allow mapping of
a VF MAC to VF index.

Next we make an addition to librte_power that adds an extra command to allow
the passing of a policy structure from the guest to the host. This struct
contains information like busy/quiet hour, packet throughput thresholds, etc.

The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
physical CPU (pcpu) IDs so that the host can scale up/down the cores used
in the guest.

The remaining patches are functionality to process the policy, and take action
when the relevant trigger occurs to cause a frequency change.

[1/9] net/i40e: add API to convert VF MAC to VF id
[2/9] lib/librte_power: add extra msg type for policies
[3/9] examples/vm_power_mgr: add vcpu to pcpu mapping
[4/9] examples/vm_power_mgr: add scale to medium freq fn
[5/9] examples/vm_power_mgr: add policy to channels
[6/9] examples/vm_power_mgr: add port initialisation
[7/9] power: add send channel msg function to map file
[8/9] examples/guest_cli: add send policy to host
[9/9] examples/vm_power_mgr: set MAC address of VF

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH v5] devtools: rework abi checker script
  2017-10-05  7:53 27%     ` [dpdk-dev] [PATCH v5] " Olivier Matz
@ 2017-10-05 13:15  4%       ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2017-10-05 13:15 UTC (permalink / raw)
  To: Olivier Matz; +Cc: dev, bruce.richardson

On Thu, Oct 05, 2017 at 09:53:27AM +0200, Olivier Matz wrote:
> The initial version of the script had some limitations:
> - cannot work on a non-clean workspace
> - environment variables are not documented
> - no compilation log in case of failure
> - return success even it abi is incompatible
> 
> This patch addresses these issues and rework the code.
> 
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> Acked-by: Neil Horman <nhorman@tuxdriver.com>
> ---
> 
> v4->v5:
> - Add a log when shared lib has no public ABI
> 
> v3->v4:
> - clarify logs on incompatible abi
> - log when an error returned an error
> - [really] fix the report path
> - log the output of make config in the proper file
> 
> v2->v3:
> - fix when not launched from dpdk root dir
> - use "-Og -Wno-error" instead of "-O0"
> - fix typo in commit log
> 
> v1->v2:
> - use /usr/bin/env to find bash (which is required)
> - fix displayed path to html reports
> - reword help for -f option
> 
>  devtools/validate-abi.sh | 397 ++++++++++++++++++++++++-----------------------
>  1 file changed, 205 insertions(+), 192 deletions(-)
> 

To reiterate with updated logging
Acked-by: Neil Horman <nhorman@tuxdriver.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2 03/12] cryptodev: avoid dependency on rte_vdev.h
  2017-09-28 13:55  2%   ` [dpdk-dev] [PATCH v2 03/12] cryptodev: avoid dependency on rte_vdev.h Jianfeng Tan
@ 2017-10-05 13:13  0%     ` Jan Blunck
  2017-10-09  1:04  0%       ` Tan, Jianfeng
  0 siblings, 1 reply; 200+ results
From: Jan Blunck @ 2017-10-05 13:13 UTC (permalink / raw)
  To: Jianfeng Tan
  Cc: dev, Bruce Richardson, Ananyev, Konstantin, De Lara Guarch,
	Pablo, Thomas Monjalon, yliu, Maxime Coquelin, Tetsuya Mukawa,
	Ferruh Yigit

On Thu, Sep 28, 2017 at 3:55 PM, Jianfeng Tan <jianfeng.tan@intel.com> wrote:
> The helper API, rte_cryptodev_vdev_pmd_init(), has a parameter of
> struct rte_vdev_device *, which needs to include rte_vdev.h.
>
> We will move vdev into drivers/bus, so we need to avoid such
> dependency. And also, we cannot break the ABI.
>
> This patch changes that pointer to void *, and defines an internal
> structure same with struct rte_vdev_device.
>

This code duplication is unnecessary. Also you are doing evil thinks
and define a type with the same name in multiple places. Look at my
series how to do this properly.


> Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
> ---
>  lib/librte_cryptodev/rte_cryptodev_pmd.c  |   9 +-
>  lib/librte_cryptodev/rte_cryptodev_vdev.c | 161 ++++++++++++++++++++++++++++++
>  lib/librte_cryptodev/rte_cryptodev_vdev.h |   3 +-
>  3 files changed, 169 insertions(+), 4 deletions(-)
>  create mode 100644 lib/librte_cryptodev/rte_cryptodev_vdev.c
>
> diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.c b/lib/librte_cryptodev/rte_cryptodev_pmd.c
> index a57faad..60b3980 100644
> --- a/lib/librte_cryptodev/rte_cryptodev_pmd.c
> +++ b/lib/librte_cryptodev/rte_cryptodev_pmd.c
> @@ -75,9 +75,14 @@ rte_cryptodev_vdev_parse_integer_arg(const char *key __rte_unused,
>         return 0;
>  }
>
> +struct vdev_device {
> +       TAILQ_ENTRY(rte_vdev_device) next;
> +       struct rte_device device;
> +};
> +
>  struct rte_cryptodev *
>  rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
> -               int socket_id, struct rte_vdev_device *vdev)
> +               int socket_id, void *vdev)
>  {
>         struct rte_cryptodev *cryptodev;
>
> @@ -99,7 +104,7 @@ rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
>                                         " data");
>         }
>
> -       cryptodev->device = &vdev->device;
> +       cryptodev->device = &((struct vdev_device *)vdev)->device;
>
>         /* initialise user call-back tail queue */
>         TAILQ_INIT(&(cryptodev->link_intr_cbs));
> diff --git a/lib/librte_cryptodev/rte_cryptodev_vdev.c b/lib/librte_cryptodev/rte_cryptodev_vdev.c
> new file mode 100644
> index 0000000..4af8d51
> --- /dev/null
> +++ b/lib/librte_cryptodev/rte_cryptodev_vdev.c
> @@ -0,0 +1,161 @@
> +/*-
> + *   BSD LICENSE
> + *
> + *   Copyright(c) 2017 Intel Corporation. All rights reserved.
> + *
> + *   Redistribution and use in source and binary forms, with or without
> + *   modification, are permitted provided that the following conditions
> + *   are met:
> + *
> + *     * Redistributions of source code must retain the above copyright
> + *       notice, this list of conditions and the following disclaimer.
> + *     * Redistributions in binary form must reproduce the above copyright
> + *       notice, this list of conditions and the following disclaimer in
> + *       the documentation and/or other materials provided with the
> + *       distribution.
> + *     * Neither the name of the copyright holder nor the names of its
> + *       contributors may be used to endorse or promote products derived
> + *       from this software without specific prior written permission.
> + *
> + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/queue.h>
> +
> +#include "rte_cryptodev_vdev.h"
> +#include "rte_cryptodev_pci.h"
> +#include "rte_cryptodev_pmd.h"
> +
> +/**
> + * Parse name from argument
> + */
> +static int
> +rte_cryptodev_vdev_parse_name_arg(const char *key __rte_unused,
> +               const char *value, void *extra_args)
> +{
> +       struct rte_crypto_vdev_init_params *params = extra_args;
> +
> +       if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) {
> +               CDEV_LOG_ERR("Invalid name %s, should be less than "
> +                               "%u bytes", value,
> +                               RTE_CRYPTODEV_NAME_MAX_LEN - 1);
> +               return -1;
> +       }
> +
> +       strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN);
> +
> +       return 0;
> +}
> +
> +/**
> + * Parse integer from argument
> + */
> +static int
> +rte_cryptodev_vdev_parse_integer_arg(const char *key __rte_unused,
> +               const char *value, void *extra_args)
> +{
> +       int *i = extra_args;
> +
> +       *i = atoi(value);
> +       if (*i < 0) {
> +               CDEV_LOG_ERR("Argument has to be positive.");
> +               return -1;
> +       }
> +
> +       return 0;
> +}
> +
> +struct vdev_device {
> +       TAILQ_ENTRY(rte_vdev_device) next;
> +       struct rte_device device;
> +};
> +
> +struct rte_cryptodev *
> +rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
> +               int socket_id, void *vdev)
> +{
> +       struct rte_cryptodev *cryptodev;
> +
> +       /* allocate device structure */
> +       cryptodev = rte_cryptodev_pmd_allocate(name, socket_id);
> +       if (cryptodev == NULL)
> +               return NULL;
> +
> +       /* allocate private device structure */
> +       if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
> +               cryptodev->data->dev_private =
> +                               rte_zmalloc_socket("cryptodev device private",
> +                                               dev_private_size,
> +                                               RTE_CACHE_LINE_SIZE,
> +                                               socket_id);
> +
> +               if (cryptodev->data->dev_private == NULL)
> +                       rte_panic("Cannot allocate memzone for private device"
> +                                       " data");
> +       }
> +
> +       cryptodev->device = &((struct vdev_device *)vdev)->device;
> +
> +       /* initialise user call-back tail queue */
> +       TAILQ_INIT(&(cryptodev->link_intr_cbs));
> +
> +       return cryptodev;
> +}
> +
> +int
> +rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params,
> +               const char *input_args)
> +{
> +       struct rte_kvargs *kvlist = NULL;
> +       int ret = 0;
> +
> +       if (params == NULL)
> +               return -EINVAL;
> +
> +       if (input_args) {
> +               kvlist = rte_kvargs_parse(input_args,
> +                               cryptodev_vdev_valid_params);
> +               if (kvlist == NULL)
> +                       return -1;
> +
> +               ret = rte_kvargs_process(kvlist,
> +                                       RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG,
> +                                       &rte_cryptodev_vdev_parse_integer_arg,
> +                                       &params->max_nb_queue_pairs);
> +               if (ret < 0)
> +                       goto free_kvlist;
> +
> +               ret = rte_kvargs_process(kvlist,
> +                                       RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG,
> +                                       &rte_cryptodev_vdev_parse_integer_arg,
> +                                       &params->max_nb_sessions);
> +               if (ret < 0)
> +                       goto free_kvlist;
> +
> +               ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_SOCKET_ID,
> +                                       &rte_cryptodev_vdev_parse_integer_arg,
> +                                       &params->socket_id);
> +               if (ret < 0)
> +                       goto free_kvlist;
> +
> +               ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_NAME,
> +                                       &rte_cryptodev_vdev_parse_name_arg,
> +                                       params);
> +               if (ret < 0)
> +                       goto free_kvlist;
> +       }
> +
> +free_kvlist:
> +       rte_kvargs_free(kvlist);
> +       return ret;
> +}
> diff --git a/lib/librte_cryptodev/rte_cryptodev_vdev.h b/lib/librte_cryptodev/rte_cryptodev_vdev.h
> index 94ab9d3..1142d1d 100644
> --- a/lib/librte_cryptodev/rte_cryptodev_vdev.h
> +++ b/lib/librte_cryptodev/rte_cryptodev_vdev.h
> @@ -33,7 +33,6 @@
>  #ifndef _RTE_CRYPTODEV_VDEV_H_
>  #define _RTE_CRYPTODEV_VDEV_H_
>
> -#include <rte_vdev.h>
>  #include <inttypes.h>
>
>  #include "rte_cryptodev.h"
> @@ -80,7 +79,7 @@ struct rte_crypto_vdev_init_params {
>   */
>  struct rte_cryptodev *
>  rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
> -               int socket_id, struct rte_vdev_device *vdev);
> +               int socket_id, void *vdev);
>
>  /**
>   * @internal
> --
> 2.7.4
>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH V2 3/5] ethdev: add new api for traffic metering and policing
  @ 2017-10-05 13:09  1%   ` Cristian Dumitrescu
  0 siblings, 0 replies; 200+ results
From: Cristian Dumitrescu @ 2017-10-05 13:09 UTC (permalink / raw)
  To: dev
  Cc: thomas, adrien.mazarguil, jingjing.wu, hemant.agrawal,
	jerin.jacob, jasvinder.singh

This patch introduces new ethdev generic API for Traffic Metering and
Policing (MTR), which is yet another standard RX offload for Ethernet
devices.

Similar to rte_flow and rte_tm APIs, the configuration of MTR objects is
done in their own namespace (rte_mtr) within the librte_ether library.

Main features:
1. Traffic metering: determine the color for the current packet (green,
   yellow, red) based on history maintained by the MTR object. Supported
   algorithms: srTCM (RFC 2697), trTCM (RFC 2698 and RFC 4115).
2. Policing (per meter output color actions): re-color the packet (keep
   or change the meter output color) or drop the packet.
3. Statistics
4. Capability API

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
Changes in v2:
- Implemented input from Hemant:
     - Added support for RFC 4115 trTCM algorithm
     - Added support for meter pass-through mode: see API functions
       rte_mtr_meter_enable() and rte_mtr_meter_disable()
- Implemented input from Jerin:
     - Added capability API
- Implemented input from Thomas:
     - Added new API functions under the EXPERIMENTAL section in map file
- Improved the mechanism for MTR object chaining: each MTR object can be
  configured whther to read input color from a previous MTR object in the
  same flow (if any) of from DSCP traslation table
- Improved run-time update functions
- Doxygen: added more descriptions, small fixes

Changes in v1 (from RFC [1]):
- Implemented input from Thomas:
     - Added EXPERIMENTAL tag in rte_mtr.h and MANTAINERS for this new API
- Implemented input from Adrien:
     - Added more Doxygen comments to re-inforce relationship between MTR and
       flow
- Doxygen: added hook in doxy-api-index.md

[1] RFC: http://www.dpdk.org/ml/archives/dev/2017-May/066888.html

 MAINTAINERS                             |   4 +
 doc/api/doxy-api-index.md               |   1 +
 lib/librte_ether/Makefile               |   3 +
 lib/librte_ether/rte_ethdev_version.map |  18 +
 lib/librte_ether/rte_mtr.c              | 229 ++++++++++
 lib/librte_ether/rte_mtr.h              | 723 ++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_mtr_driver.h       | 221 ++++++++++
 7 files changed, 1199 insertions(+)
 create mode 100644 lib/librte_ether/rte_mtr.c
 create mode 100644 lib/librte_ether/rte_mtr.h
 create mode 100644 lib/librte_ether/rte_mtr_driver.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 8df2a7f..f9aa787 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -260,6 +260,10 @@ M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
 T: git://dpdk.org/next/dpdk-next-tm
 F: lib/librte_ether/rte_tm*
 
+Traffic Metering and Policing API - EXPERIMENTAL
+M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+F: lib/librte_ether/rte_mtr*
+
 Crypto API
 M: Declan Doherty <declan.doherty@intel.com>
 F: lib/librte_cryptodev/
diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index 19e0d4f..b2342a9 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -41,6 +41,7 @@ The public API headers are grouped by topics:
   [ethctrl]            (@ref rte_eth_ctrl.h),
   [rte_flow]           (@ref rte_flow.h),
   [rte_tm]             (@ref rte_tm.h),
+  [rte_mtr]            (@ref rte_mtr.h),
   [cryptodev]          (@ref rte_cryptodev.h),
   [eventdev]           (@ref rte_eventdev.h),
   [metrics]            (@ref rte_metrics.h),
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 201cb96..35ba5d9 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -46,6 +46,7 @@ LIBABIVER := 7
 SRCS-y += rte_ethdev.c
 SRCS-y += rte_flow.c
 SRCS-y += rte_tm.c
+SRCS-y += rte_mtr.c
 SRCS-y += ethdev_profile.c
 
 #
@@ -60,5 +61,7 @@ SYMLINK-y-include += rte_flow.h
 SYMLINK-y-include += rte_flow_driver.h
 SYMLINK-y-include += rte_tm.h
 SYMLINK-y-include += rte_tm_driver.h
+SYMLINK-y-include += rte_mtr.h
+SYMLINK-y-include += rte_mtr_driver.h
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map
index 07f9e17..c8f59a0 100644
--- a/lib/librte_ether/rte_ethdev_version.map
+++ b/lib/librte_ether/rte_ethdev_version.map
@@ -194,3 +194,21 @@ DPDK_17.11 {
 	rte_eth_dev_reset;
 
 } DPDK_17.08;
+
+EXPERIMENTAL {
+	global:
+
+	rte_mtr_capabilities_get;
+	rte_mtr_meter_profile_add;
+	rte_mtr_meter_profile_delete;
+	rte_mtr_create;
+	rte_mtr_destroy;
+	rte_mtr_meter_enable;
+	rte_mtr_meter_disable;
+	rte_mtr_meter_profile_update;
+	rte_mtr_meter_dscp_table_update;
+	rte_mtr_policer_actions_update;
+	rte_mtr_stats_update;
+	rte_mtr_stats_read;
+
+} DPDK_17.11;
diff --git a/lib/librte_ether/rte_mtr.c b/lib/librte_ether/rte_mtr.c
new file mode 100644
index 0000000..6526a97
--- /dev/null
+++ b/lib/librte_ether/rte_mtr.c
@@ -0,0 +1,229 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdint.h>
+
+#include <rte_errno.h>
+#include "rte_ethdev.h"
+#include "rte_mtr_driver.h"
+#include "rte_mtr.h"
+
+/* Get generic traffic metering & policing operations structure from a port. */
+const struct rte_mtr_ops *
+rte_mtr_ops_get(uint8_t port_id, struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	const struct rte_mtr_ops *ops;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		rte_mtr_error_set(error,
+			ENODEV,
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+			NULL,
+			rte_strerror(ENODEV));
+		return NULL;
+	}
+
+	if ((dev->dev_ops->mtr_ops_get == NULL) ||
+		(dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
+		(ops == NULL)) {
+		rte_mtr_error_set(error,
+			ENOSYS,
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+			NULL,
+			rte_strerror(ENOSYS));
+		return NULL;
+	}
+
+	return ops;
+}
+
+#define RTE_MTR_FUNC(port_id, func)			\
+({							\
+	const struct rte_mtr_ops *ops =			\
+		rte_mtr_ops_get(port_id, error);		\
+	if (ops == NULL)					\
+		return -rte_errno;			\
+							\
+	if (ops->func == NULL)				\
+		return -rte_mtr_error_set(error,		\
+			ENOSYS,				\
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,	\
+			NULL,				\
+			rte_strerror(ENOSYS));		\
+							\
+	ops->func;					\
+})
+
+/* MTR capabilities get */
+int
+rte_mtr_capabilities_get(uint8_t port_id,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
+		cap, error);
+}
+
+/* MTR meter profile add */
+int
+rte_mtr_meter_profile_add(uint8_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
+		meter_profile_id, profile, error);
+}
+
+/** MTR meter profile delete */
+int
+rte_mtr_meter_profile_delete(uint8_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
+		meter_profile_id, error);
+}
+
+/** MTR object create */
+int
+rte_mtr_create(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, create)(dev,
+		mtr_id, params, shared, error);
+}
+
+/** MTR object destroy */
+int
+rte_mtr_destroy(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, destroy)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter enable */
+int
+rte_mtr_meter_enable(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_enable)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter disable */
+int
+rte_mtr_meter_disable(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_disable)(dev,
+		mtr_id, error);
+}
+
+/** MTR object meter profile update */
+int
+rte_mtr_meter_profile_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
+		mtr_id, meter_profile_id, error);
+}
+
+/** MTR object meter DSCP table update */
+int
+rte_mtr_meter_dscp_table_update(uint8_t port_id,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
+		mtr_id, dscp_table, error);
+}
+
+/** MTR object policer action update */
+int
+rte_mtr_policer_actions_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, policer_actions_update)(dev,
+		mtr_id, action_mask, actions, error);
+}
+
+/** MTR object enabled stats update */
+int
+rte_mtr_stats_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, stats_update)(dev,
+		mtr_id, stats_mask, error);
+}
+
+/** MTR object stats read */
+int
+rte_mtr_stats_read(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, stats_read)(dev,
+		mtr_id, stats, stats_mask, clear, error);
+}
diff --git a/lib/librte_ether/rte_mtr.h b/lib/librte_ether/rte_mtr.h
new file mode 100644
index 0000000..f0f897f
--- /dev/null
+++ b/lib/librte_ether/rte_mtr.h
@@ -0,0 +1,723 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation.
+ *   Copyright(c) 2017 NXP.
+ *   Copyright(c) 2017 Cavium.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INCLUDE_RTE_MTR_H__
+#define __INCLUDE_RTE_MTR_H__
+
+/**
+ * @file
+ * RTE Generic Traffic Metering and Policing API
+ *
+ * This interface provides the ability to configure the traffic metering and
+ * policing (MTR) in a generic way.
+ *
+ * The processing done for each input packet hitting a MTR object is:
+ *    A) Traffic metering: The packet is assigned a color (the meter output
+ *       color), based on the previous history of the flow reflected in the
+ *       current state of the MTR object, according to the specific traffic
+ *       metering algorithm. The traffic metering algorithm can typically work
+ *       in color aware mode, in which case the input packet already has an
+ *       initial color (the input color), or in color blind mode, which is
+ *       equivalent to considering all input packets initially colored as green.
+ *    B) Policing: There is a separate policer action configured for each meter
+ *       output color, which can:
+ *          a) Drop the packet.
+ *          b) Keep the same packet color: the policer output color matches the
+ *             meter output color (essentially a no-op action).
+ *          c) Recolor the packet: the policer output color is different than
+ *             the meter output color.
+ *       The policer output color is the output color of the packet, which is
+ *       set in the packet meta-data (i.e. struct rte_mbuf::sched::color).
+ *    C) Statistics: The set of counters maintained for each MTR object is
+ *       configurable and subject to the implementation support. This set
+ *       includes the number of packets and bytes dropped or passed for each
+ *       output color.
+ *
+ * Once successfully created, an MTR object is linked to one or several flows
+ * through the meter action of the flow API.
+ *    A) Whether an MTR object is private to a flow or potentially shared by
+ *       several flows has to be specified at creation time.
+ *    B) Several meter actions can be potentially registered for the same flow.
+ *
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ */
+#include <stdint.h>
+
+#include <rte_common.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Color
+ */
+enum rte_mtr_color {
+	RTE_MTR_GREEN = 0, /**< Green */
+	RTE_MTR_YELLOW, /**< Yellow */
+	RTE_MTR_RED, /**< Red */
+	RTE_MTR_COLORS /**< Number of colors. */
+};
+
+/**
+ * Statistics counter type
+ */
+enum rte_mtr_stats_type {
+	/** Number of packets passed as green by the policer. */
+	RTE_MTR_STATS_N_PKTS_GREEN = 1 << 0,
+
+	/** Number of bytes passed as green by the policer. */
+	RTE_MTR_STATS_N_BYTES_GREEN = 1 << 1,
+
+	/** Number of packets passed as yellow by the policer. */
+	RTE_MTR_STATS_N_PKTS_YELLOW = 1 << 2,
+
+	/** Number of bytes passed as yellow by the policer. */
+	RTE_MTR_STATS_N_BYTES_YELLOW = 1 << 3,
+
+	/** Number of packets passed as red by the policer. */
+	RTE_MTR_STATS_N_PKTS_RED = 1 << 4,
+
+	/** Number of bytes passed as red by the policer. */
+	RTE_MTR_STATS_N_BYTES_RED = 1 << 5,
+
+	/** Number of packets dropped by the policer. */
+	RTE_MTR_STATS_N_PKTS_DROPPED = 1 << 6,
+
+	/** Number of bytes dropped by the policer. */
+	RTE_MTR_STATS_N_BYTES_DROPPED = 1 << 7,
+};
+
+/**
+ * Statistics counters
+ */
+struct rte_mtr_stats {
+	/** Number of packets passed by the policer (per color). */
+	uint64_t n_pkts[RTE_MTR_COLORS];
+
+	/** Number of bytes passed by the policer (per color). */
+	uint64_t n_bytes[RTE_MTR_COLORS];
+
+	/** Number of packets dropped by the policer. */
+	uint64_t n_pkts_dropped;
+
+	/** Number of bytes passed by the policer. */
+	uint64_t n_bytes_dropped;
+};
+
+/**
+ * Traffic metering algorithms
+ */
+enum rte_mtr_algorithm {
+	/** Single Rate Three Color Marker (srTCM) - IETF RFC 2697. */
+	RTE_MTR_SRTCM_RFC2697,
+
+	/** Two Rate Three Color Marker (trTCM) - IETF RFC 2698. */
+	RTE_MTR_TRTCM_RFC2698,
+
+	/** Two Rate Three Color Marker (trTCM) - IETF RFC 4115. */
+	RTE_MTR_TRTCM_RFC4115,
+};
+
+/**
+ * Meter profile
+ */
+struct rte_mtr_meter_profile {
+	/** Traffic metering algorithm. */
+	enum rte_mtr_algorithm alg;
+
+	RTE_STD_C11
+	union {
+		/** Items only valid when *alg* is set to srTCM - RFC 2697. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Committed Burst Size (CBS) (bytes). */
+			uint64_t cbs;
+
+			/** Excess Burst Size (EBS) (bytes). */
+			uint64_t ebs;
+		} srtcm_rfc2697;
+
+		/** Items only valid when *alg* is set to trTCM - RFC 2698. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Peak Information Rate (PIR) (bytes/second). */
+			uint64_t pir;
+
+			/** Committed Burst Size (CBS) (byes). */
+			uint64_t cbs;
+
+			/** Peak Burst Size (PBS) (bytes). */
+			uint64_t pbs;
+		} trtcm_rfc2698;
+
+		/** Items only valid when *alg* is set to trTCM - RFC 4115. */
+		struct {
+			/** Committed Information Rate (CIR) (bytes/second). */
+			uint64_t cir;
+
+			/** Excess Information Rate (EIR) (bytes/second). */
+			uint64_t eir;
+
+			/** Committed Burst Size (CBS) (byes). */
+			uint64_t cbs;
+
+			/** Excess Burst Size (EBS) (bytes). */
+			uint64_t ebs;
+		} trtcm_rfc4115;
+	};
+};
+
+/**
+ * Policer actions
+ */
+enum rte_mtr_policer_action {
+	/** Recolor the packet as green. */
+	MTR_POLICER_ACTION_COLOR_GREEN = 0,
+
+	/** Recolor the packet as yellow. */
+	MTR_POLICER_ACTION_COLOR_YELLOW,
+
+	/** Recolor the packet as red. */
+	MTR_POLICER_ACTION_COLOR_RED,
+
+	/** Drop the packet. */
+	MTR_POLICER_ACTION_DROP,
+};
+
+/**
+ * Parameters for each traffic metering & policing object
+ *
+ * @see enum rte_mtr_stats_type
+ */
+struct rte_mtr_params {
+	/** Meter profile ID. */
+	uint32_t meter_profile_id;
+
+	/** Meter input color in case of MTR object chaining. When non-zero: if
+	 * a previous MTR object is enabled in the same flow, then the color
+	 * determined by the latest MTR object in the same flow is used as the
+	 * input color by the current MTR object, otherwise the current MTR
+	 * object uses the *dscp_table* to determine the input color. When zero:
+	 * the color determined by any previous MTR object in same flow is
+	 * ignored by the current MTR object, which uses the *dscp_table* to
+	 * determine the input color.
+	 */
+	int use_prev_mtr_color;
+
+	/** Meter input color. When non-NULL: it points to a pre-allocated and
+	 * pre-populated table with exactly 64 elements providing the input
+	 * color for each value of the IPv4/IPv6 Differentiated Services Code
+	 * Point (DSCP) input packet field. When NULL: it is equivalent to
+	 * setting this parameter to an all-green populated table (i.e. table
+	 * with all the 64 elements set to green color). The color blind mode
+	 * is configured by setting *use_prev_mtr_color* to 0 and *dscp_table*
+	 * to either NULL or to an all-green populated table. When
+	 * *use_prev_mtr_color* is non-zero value or when *dscp_table* contains
+	 * at least one yellow or red color element, then the color aware mode
+	 * is configured.
+	 */
+	enum rte_mtr_color *dscp_table;
+
+	/** Non-zero to enable the meter, zero to disable the meter at the time
+	 * of MTR object creation.
+	 * @see rte_mtr_meter_disable()
+	 */
+	int meter_enable;
+
+	/** Policer actions (per meter output color). */
+	enum rte_mtr_policer_action action[RTE_MTR_COLORS];
+
+	/** Set of stats counters to be enabled.
+	 * @see enum rte_mtr_stats_type
+	 */
+	uint64_t stats_mask;
+};
+
+/**
+ * MTR capabilities
+ */
+struct rte_mtr_capabilities {
+	/** Maximum number of MTR objects. */
+	uint32_t n_max;
+
+	/** Maximum number of MTR objects that can be shared by multiple flows.
+	 * The value of zero indicates that shared MTR objects are not
+	 * supported. The maximum value is *n_max*.
+	 */
+	uint32_t n_shared_max;
+
+	/** When non-zero, this flag indicates that all the MTR objects that
+	 * cannot be shared by multiple flows have identical capability set.
+	 */
+	int identical;
+
+	/** When non-zero, this flag indicates that all the MTR objects that
+	 * can be shared by multiple flows have identical capability set.
+	 */
+	int shared_identical;
+
+	/** Maximum number of flows that can share the same MTR object. The
+	 * value of zero is invalid. The value of 1 means that shared MTR
+	 * objects not supported.
+	 */
+	uint32_t shared_n_flows_per_mtr_max;
+
+	/** Maximum number of MTR objects that can be part of the same flow. The
+	 * value of zero is invalid. The value of 1 indicates that MTR object
+	 * chaining is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t chaining_n_mtrs_per_flow_max;
+
+	/**
+	 * When non-zero, it indicates that the packet color identified by one
+	 * MTR object can be used as the packet input color by any subsequent
+	 * MTR object from the same flow. When zero, it indicates that the color
+	 * determined by one MTR object is always ignored by any subsequent MTR
+	 * object from the same flow. Only valid when MTR chaining is supported,
+	 * i.e. *chaining_n_mtrs_per_flow_max* is greater than 1. When non-zero,
+	 * it also means that the color aware mode is supported by at least one
+	 * metering algorithm.
+	 */
+	int chaining_use_prev_mtr_color_supported;
+
+	/**
+	 * When non-zero, it indicates that the packet color identified by one
+	 * MTR object is always used as the packet input color by any subsequent
+	 * MTR object that is part of the same flow. When zero, it indicates
+	 * that whether the color determined by one MTR object is either ignored
+	 * or used as the packet input color by any subsequent MTR object from
+	 * the same flow is individually configurable for each MTR object. Only
+	 * valid when *chaining_use_prev_mtr_color_supported* is non-zero.
+	 */
+	int chaining_use_prev_mtr_color_enforced;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the srTCM RFC 2697 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_srtcm_rfc2697_n_max;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the trTCM RFC 2698 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_trtcm_rfc2698_n_max;
+
+	/** Maximum number of MTR objects that can have their meter configured
+	 * to run the trTCM RFC 4115 algorithm. The value of 0 indicates this
+	 * metering algorithm is not supported. The maximum value is *n_max*.
+	 */
+	uint32_t meter_trtcm_rfc4115_n_max;
+
+	/** Maximum traffic rate that can be metered by a single MTR object. For
+	 * srTCM RFC 2697, this is the maximum CIR rate. For trTCM RFC 2698,
+	 * this is the maximum PIR rate. For trTCM RFC 4115, this is the maximum
+	 * value for the sum of PIR and EIR rates.
+	 */
+	uint64_t meter_rate_max;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the srTCM RFC 2697 metering algorithm.
+	 */
+	int color_aware_srtcm_rfc2697_supported;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the trTCM RFC 2698 metering algorithm.
+	 */
+	int color_aware_trtcm_rfc2698_supported;
+
+	/**
+	 * When non-zero, it indicates that color aware mode is supported for
+	 * the trTCM RFC 4115 metering algorithm.
+	 */
+	int color_aware_trtcm_rfc4115_supported;
+
+	/** When non-zero, it indicates that the policer packet recolor actions
+	 * are supported.
+	 * @see enum rte_mtr_policer_action
+	 */
+	int policer_action_recolor_supported;
+
+	/** When non-zero, it indicates that the policer packet drop action is
+	 * supported.
+	 * @see enum rte_mtr_policer_action
+	 */
+	int policer_action_drop_supported;
+
+	/** Set of supported statistics counter types.
+	 * @see enum rte_mtr_stats_type
+	 */
+	uint64_t stats_mask;
+};
+
+/**
+ * Verbose error types.
+ *
+ * Most of them provide the type of the object referenced by struct
+ * rte_mtr_error::cause.
+ */
+enum rte_mtr_error_type {
+	RTE_MTR_ERROR_TYPE_NONE, /**< No error. */
+	RTE_MTR_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */
+	RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+	RTE_MTR_ERROR_TYPE_METER_PROFILE,
+	RTE_MTR_ERROR_TYPE_MTR_ID,
+	RTE_MTR_ERROR_TYPE_MTR_PARAMS,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_GREEN,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_YELLOW,
+	RTE_MTR_ERROR_TYPE_POLICER_ACTION_RED,
+	RTE_MTR_ERROR_TYPE_STATS_MASK,
+	RTE_MTR_ERROR_TYPE_STATS,
+	RTE_MTR_ERROR_TYPE_SHARED,
+};
+
+/**
+ * Verbose error structure definition.
+ *
+ * This object is normally allocated by applications and set by PMDs, the
+ * message points to a constant string which does not need to be freed by
+ * the application, however its pointer can be considered valid only as long
+ * as its associated DPDK port remains configured. Closing the underlying
+ * device or unloading the PMD invalidates it.
+ *
+ * Both cause and message may be NULL regardless of the error type.
+ */
+struct rte_mtr_error {
+	enum rte_mtr_error_type type; /**< Cause field and error type. */
+	const void *cause; /**< Object responsible for the error. */
+	const char *message; /**< Human-readable error message. */
+};
+
+/**
+ * MTR capabilities get
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[out] cap
+ *   MTR capabilities. Needs to be pre-allocated and valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_capabilities_get(uint8_t port_id,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error);
+
+/**
+ * Meter profile add
+ *
+ * Create a new meter profile with ID set to *meter_profile_id*. The new profile
+ * is used to create one or several MTR objects.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] meter_profile_id
+ *   ID for the new meter profile. Needs to be unused by any of the existing
+ *   meter profiles added for the current port.
+ * @param[in] profile
+ *   Meter profile parameters. Needs to be pre-allocated and valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_add(uint8_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error);
+
+/**
+ * Meter profile delete
+ *
+ * Delete an existing meter profile. This operation fails when there is
+ * currently at least one user (i.e. MTR object) of this profile.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] meter_profile_id
+ *   Meter profile ID. Needs to be the valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_delete(uint8_t port_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object create
+ *
+ * Create a new MTR object for the current port. This object is run as part of
+ * associated flow action for traffic metering and policing.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be unused by any of the existing MTR objects.
+ *   created for the current port.
+ * @param[in] params
+ *   MTR object params. Needs to be pre-allocated and valid.
+ * @param[in] shared
+ *   Non-zero when this MTR object can be shared by multiple flows, zero when
+ *   this MTR object can be used by a single flow.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_flow_action_type::RTE_FLOW_ACTION_TYPE_METER
+ */
+int
+rte_mtr_create(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object destroy
+ *
+ * Delete an existing MTR object. This operation fails when there is currently
+ * at least one user (i.e. flow) of this MTR object.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ *   created for the current port.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_destroy(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter disable
+ *
+ * Disable the meter of an existing MTR object. In disabled state, the meter of
+ * the current MTR object works in pass-through mode, meaning that for each
+ * input packet the meter output color is always the same as the input color. In
+ * particular, when the meter of the current MTR object is configured in color
+ * blind mode, the input color is always green, so the meter output color is
+ * also always green. Note that the policer and the statistics of the current
+ * MTR object are working as usual while the meter is disabled. No action is
+ * taken and this function returns successfully when the meter of the current
+ * MTR object is already disabled.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_disable(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter enable
+ *
+ * Enable the meter of an existing MTR object. If the MTR object has its meter
+ * already enabled, then no action is taken and this function returns
+ * successfully.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_enable(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object meter profile update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] meter_profile_id
+ *   Meter profile ID for the current MTR object. Needs to be valid.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_profile_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object DSCP table update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] dscp_table
+ *   When non-NULL: it points to a pre-allocated and pre-populated table with
+ *   exactly 64 elements providing the input color for each value of the
+ *   IPv4/IPv6 Differentiated Services Code Point (DSCP) input packet field.
+ *   When NULL: it is equivalent to setting this parameter to an “all-green”
+ *   populated table (i.e. table with all the 64 elements set to green color).
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_meter_dscp_table_update(uint8_t port_id,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object policer actions update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] action_mask
+ *   Bit mask indicating which policer actions need to be updated. One or more
+ *   policer actions can be updated in a single function invocation. To update
+ *   the policer action associated with color C, bit (1 << C) needs to be set in
+ *   *action_mask* and element at position C in the *actions* array needs to be
+ *   valid.
+ * @param[in] actions
+ *   Pre-allocated and pre-populated array of policer actions.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+int
+rte_mtr_policer_actions_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object enabled statistics counters update
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[in] stats_mask
+ *   Mask of statistics counter types to be enabled for the current MTR object.
+ *   Any statistics counter type not included in this set is to be disabled for
+ *   the current MTR object.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_mtr_stats_type
+ */
+int
+rte_mtr_stats_update(uint8_t port_id,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error);
+
+/**
+ * MTR object statistics counters read
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] mtr_id
+ *   MTR object ID. Needs to be valid.
+ * @param[out] stats
+ *   When non-NULL, it contains the current value for the statistics counters
+ *   enabled for the current MTR object.
+ * @param[out] stats_mask
+ *   When non-NULL, it contains the mask of statistics counter types that are
+ *   currently enabled for this MTR object, indicating which of the counters
+ *   retrieved with the *stats* structure are valid.
+ * @param[in] clear
+ *   When this parameter has a non-zero value, the statistics counters are
+ *   cleared (i.e. set to zero) immediately after they have been read,
+ *   otherwise the statistics counters are left untouched.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ * @see enum rte_mtr_stats_type
+ */
+int
+rte_mtr_stats_read(uint8_t port_id,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_RTE_MTR_H__ */
diff --git a/lib/librte_ether/rte_mtr_driver.h b/lib/librte_ether/rte_mtr_driver.h
new file mode 100644
index 0000000..bb7deed
--- /dev/null
+++ b/lib/librte_ether/rte_mtr_driver.h
@@ -0,0 +1,221 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INCLUDE_RTE_MTR_DRIVER_H__
+#define __INCLUDE_RTE_MTR_DRIVER_H__
+
+/**
+ * @file
+ * RTE Generic Traffic Metering and Policing API (Driver Side)
+ *
+ * This file provides implementation helpers for internal use by PMDs, they
+ * are not intended to be exposed to applications and are not subject to ABI
+ * versioning.
+ */
+
+#include <stdint.h>
+
+#include <rte_errno.h>
+#include "rte_ethdev.h"
+#include "rte_mtr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int (*rte_mtr_capabilities_get_t)(struct rte_eth_dev *dev,
+	struct rte_mtr_capabilities *cap,
+	struct rte_mtr_error *error);
+/**< @internal MTR capabilities get */
+
+typedef int (*rte_mtr_meter_profile_add_t)(struct rte_eth_dev *dev,
+	uint32_t meter_profile_id,
+	struct rte_mtr_meter_profile *profile,
+	struct rte_mtr_error *error);
+/**< @internal MTR meter profile add */
+
+typedef int (*rte_mtr_meter_profile_delete_t)(struct rte_eth_dev *dev,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR meter profile delete */
+
+typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_params *params,
+	int shared,
+	struct rte_mtr_error *error);
+/**< @internal MTR object create */
+
+typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object destroy */
+
+typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter enable */
+
+typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter disable */
+
+typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint32_t meter_profile_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter profile update */
+
+typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	enum rte_mtr_color *dscp_table,
+	struct rte_mtr_error *error);
+/**< @internal MTR object meter DSCP table update */
+
+typedef int (*rte_mtr_policer_actions_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint32_t action_mask,
+	enum rte_mtr_policer_action *actions,
+	struct rte_mtr_error *error);
+/**< @internal MTR object policer action update*/
+
+typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	uint64_t stats_mask,
+	struct rte_mtr_error *error);
+/**< @internal MTR object enabled stats update */
+
+typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
+	uint32_t mtr_id,
+	struct rte_mtr_stats *stats,
+	uint64_t *stats_mask,
+	int clear,
+	struct rte_mtr_error *error);
+/**< @internal MTR object stats read */
+
+struct rte_mtr_ops {
+	/** MTR capabilities get */
+	rte_mtr_capabilities_get_t capabilities_get;
+
+	/** MTR meter profile add */
+	rte_mtr_meter_profile_add_t meter_profile_add;
+
+	/** MTR meter profile delete */
+	rte_mtr_meter_profile_delete_t meter_profile_delete;
+
+	/** MTR object create */
+	rte_mtr_create_t create;
+
+	/** MTR object destroy */
+	rte_mtr_destroy_t destroy;
+
+	/** MTR object meter enable */
+	rte_mtr_meter_enable_t meter_enable;
+
+	/** MTR object meter disable */
+	rte_mtr_meter_disable_t meter_disable;
+
+	/** MTR object meter profile update */
+	rte_mtr_meter_profile_update_t meter_profile_update;
+
+	/** MTR object meter DSCP table update */
+	rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
+
+	/** MTR object policer action update */
+	rte_mtr_policer_actions_update_t policer_actions_update;
+
+	/** MTR object enabled stats update */
+	rte_mtr_stats_update_t stats_update;
+
+	/** MTR object stats read */
+	rte_mtr_stats_read_t stats_read;
+};
+
+/**
+ * Initialize generic error structure.
+ *
+ * This function also sets rte_errno to a given value.
+ *
+ * @param[out] error
+ *   Pointer to error structure (may be NULL).
+ * @param[in] code
+ *   Related error code (rte_errno).
+ * @param[in] type
+ *   Cause field and error type.
+ * @param[in] cause
+ *   Object responsible for the error.
+ * @param[in] message
+ *   Human-readable error message.
+ *
+ * @return
+ *   Error code.
+ */
+static inline int
+rte_mtr_error_set(struct rte_mtr_error *error,
+		   int code,
+		   enum rte_mtr_error_type type,
+		   const void *cause,
+		   const char *message)
+{
+	if (error) {
+		*error = (struct rte_mtr_error){
+			.type = type,
+			.cause = cause,
+			.message = message,
+		};
+	}
+	rte_errno = code;
+	return code;
+}
+
+/**
+ * Get generic traffic metering and policing operations structure from a port
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[out] error
+ *   Error details
+ *
+ * @return
+ *   The traffic metering and policing operations structure associated with
+ *   port_id on success, NULL otherwise.
+ */
+const struct rte_mtr_ops *
+rte_mtr_ops_get(uint8_t port_id, struct rte_mtr_error *error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */
-- 
2.7.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v6 0/9] Policy Based Power Control for Guest
  2017-10-04 15:25  2%   ` [dpdk-dev] [PATCH v5 0/9] " David Hunt
@ 2017-10-05 12:25  2%     ` David Hunt
  2017-10-05 13:28  2%       ` [dpdk-dev] [PATCH v7 " David Hunt
  0 siblings, 1 reply; 200+ results
From: David Hunt @ 2017-10-05 12:25 UTC (permalink / raw)
  To: dev; +Cc: konstantin.ananyev, jingjing.wu, santosh.shukla

Policy Based Power Control for Guest

This patchset adds the facility for a guest VM to send a policy down to the
host that will allow the host to scale up/down cpu frequencies
depending on the policy criteria independently of the DPDK app running in
the guest.  This differs from the previous vm_power implementation where
individual scale up/down requests were send from the guest to the host via
virtio-serial.

V6 patchset changes:
  * Fixed comments in header for rte_pmd_i40e_query_vfid_by_mac.
  * changed rte_pmd_i40e_query_vfid_by_mac return code from uint to int
    as it can return negative error codes.
  * Removed bool enum from channel_commands.h, including stdbool.h instead.
  * Added #define VM_MAX_NAME_SZ 32 to channel_commands.h
  * Renamed a few variables to be more readable.
  * Added returns in a few places if failed to get info on domain.
  * Fixed power_manager_init to keep track of num_freqs for each core.
  * In power_manager_scale_core_med(), changed a hardcoded '5' to instead
    be calculated from the centre of the frequency list
    (global_core_freq_info[core_num].num_freqs / 2)

V5 patchset changes:
  * Removed most of the #ifdef I40_PMD as it will be applicable to
    other PMDs in the future.
  * Changed the parameter of rte_pmd_i40e_query_vfid_by_mac from a uint64
    to a const struct ether_addr *, rather than casting it later in the
    function.

V4 patchset changes:
  * None, re-post to mailing list under the correct email thread.

V3 patchset changes:
  * Changed to using is_same_ether_addr() instead of looping through
    the mac address bytes to compare them.
  * Tweaked some comments and working in the i40e patch after review.
  * Added a patch to the set to add new i40e function to map file, so
    as to allow shared library builds. The power library API needs a cleanup
    in next release, so will add API/ABI warning for this cleanup in a
    separate patch.

V2 patchset changes:
  * Removed API's in ethdev layer.
  * Now just a single new API in the i40e driver for mapping VF MAC to
    VF index.
  * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
  * Removed function for reading i40e register, moved to using the
    standard stats API.
  * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
  * Cleaned up policy generation code.

It's a modification of the vm_power_manager app that runs in the host, and
the guest_vm_power_app example app that runs in the guest. This allows the
guest to send down a policy to the host via virtio-serial, which then allows
the host to scale up/down based on the criteria in the policy, resulting in
quicker scale up/down than individual requests coming from the guest.
It also means that the DPDK application running in the guest does not need
to be modified in any way, it is unaware that it's cores are being scaled
up/down, reducing the effort in implementing a power-aware infrastructure.

The usage model is as follows:
1. Set up the VF's and assign to the guest in the usual way.
2. run vm_power_manager on the host, creating a channel to the guest.
3. Start the guest_vm_power_mgr app on the guest, which establishes
   a virtio-serial channel to the host.
4. Send down the profile for the guest using the "send_profile now" command.
   There is an example profile hard-coded into guest_vm_power_mgr.
5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
6. Send traffic into the VFs at varying traffic rates.
   Observe the frequency change on the host (turbostat -i 1)

The sequence of code changes are as follows:

A new function has been aded to the i40e driver to allow mapping of
a VF MAC to VF index.

Next we make an addition to librte_power that adds an extra command to allow
the passing of a policy structure from the guest to the host. This struct
contains information like busy/quiet hour, packet throughput thresholds, etc.

The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
physical CPU (pcpu) IDs so that the host can scale up/down the cores used
in the guest.

The remaining patches are functionality to process the policy, and take action
when the relevant trigger occurs to cause a frequency change.

[1/9] net/i40e: add API to convert VF MAC to VF id
[2/9] lib/librte_power: add extra msg type for policies
[3/9] examples/vm_power_mgr: add vcpu to pcpu mapping
[4/9] examples/vm_power_mgr: add scale to medium freq fn
[5/9] examples/vm_power_mgr: add policy to channels
[6/9] examples/vm_power_mgr: add port initialisation
[7/9] power: add send channel msg function to map file
[8/9] examples/guest_cli: add send policy to host
[9/9] examples/vm_power_mgr: set MAC address of VF

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH v6 1/3] eal/x86: run-time dispatch over memcpy
  @ 2017-10-05 11:26  3%         ` Richardson, Bruce
  0 siblings, 0 replies; 200+ results
From: Richardson, Bruce @ 2017-10-05 11:26 UTC (permalink / raw)
  To: Li, Xiaoyun, Ananyev, Konstantin
  Cc: Lu, Wenzhuo, Zhang, Helin, dev,
	Thomas Monjalon (thomas.monjalon@6wind.com)



> -----Original Message-----
> From: Li, Xiaoyun
> Sent: Thursday, October 5, 2017 12:19 PM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>
> Cc: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Zhang, Helin
> <helin.zhang@intel.com>; dev@dpdk.org; Thomas Monjalon
> (thomas.monjalon@6wind.com) <thomas.monjalon@6wind.com>
> Subject: RE: [PATCH v6 1/3] eal/x86: run-time dispatch over memcpy
> 
> 
> 
> > -----Original Message-----
> > From: Ananyev, Konstantin
> > Sent: Thursday, October 5, 2017 17:37
> > To: Li, Xiaoyun <xiaoyun.li@intel.com>; Richardson, Bruce
> > <bruce.richardson@intel.com>
> > Cc: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Zhang, Helin
> > <helin.zhang@intel.com>; dev@dpdk.org; Thomas Monjalon
> > (thomas.monjalon@6wind.com) <thomas.monjalon@6wind.com>
> > Subject: RE: [PATCH v6 1/3] eal/x86: run-time dispatch over memcpy
> >
> > > diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> > > b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> > > index 8c08b8d..15a2fe9 100644
> > > --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> > > +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> > > @@ -241,5 +241,6 @@ EXPERIMENTAL {
> > >  	rte_service_runstate_set;
> > >  	rte_service_set_stats_enable;
> > >  	rte_service_start_with_defaults;
> > > +	rte_memcpy_ptr;
> > >
> > >  } DPDK_17.08;
> >
> > I am not an expert in DPDK versioning system, But shouldn't we create
> > a
> > 17.11 section here?
> Should we create a 17.11 section? I am not sure who to ask for.
> 
Any new functions that are public and are added in the 17.11 release need to
be added to the map file in a new 17.11 section. They are not part of the
ABI for the 17.08 release as they were not present there.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v6 4/8] ethdev: add GTP items to support flow API
  2017-10-05  8:30  3%                 ` Adrien Mazarguil
@ 2017-10-05  8:39  0%                   ` Wu, Jingjing
  0 siblings, 0 replies; 200+ results
From: Wu, Jingjing @ 2017-10-05  8:39 UTC (permalink / raw)
  To: Adrien Mazarguil; +Cc: Sean Harte, Xing, Beilei, Chilikin, Andrey, dev



> -----Original Message-----
> From: Adrien Mazarguil [mailto:adrien.mazarguil@6wind.com]
> Sent: Thursday, October 5, 2017 4:30 PM
> To: Wu, Jingjing <jingjing.wu@intel.com>
> Cc: Sean Harte <seanbh@gmail.com>; Xing, Beilei <beilei.xing@intel.com>; Chilikin,
> Andrey <andrey.chilikin@intel.com>; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v6 4/8] ethdev: add GTP items to support flow API
> 
> On Thu, Oct 05, 2017 at 08:06:38AM +0000, Wu, Jingjing wrote:
> >
> >
> > > -----Original Message-----
> > > From: Sean Harte [mailto:seanbh@gmail.com]
> > > Sent: Tuesday, October 3, 2017 4:57 PM
> > > To: Adrien Mazarguil <adrien.mazarguil@6wind.com>
> > > Cc: Xing, Beilei <beilei.xing@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>;
> Chilikin,
> > > Andrey <andrey.chilikin@intel.com>; dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH v6 4/8] ethdev: add GTP items to support flow API
> > >
> > > On 2 October 2017 at 13:27, Adrien Mazarguil <adrien.mazarguil@6wind.com>
> wrote:
> > > > On Fri, Sep 29, 2017 at 10:29:55AM +0100, Sean Harte wrote:
> > > >> On 29 September 2017 at 09:54, Xing, Beilei <beilei.xing@intel.com> wrote:
> > > > <snip>
> > > >> >> >  /**
> > > >> >> > + * RTE_FLOW_ITEM_TYPE_GTP.
> > > >> >> > + *
> > > >> >> > + * Matches a GTPv1 header.
> > > >> >> > + */
> > > >> >> > +struct rte_flow_item_gtp {
> > > >> >> > +       /**
> > > >> >> > +        * Version (3b), protocol type (1b), reserved (1b),
> > > >> >> > +        * Extension header flag (1b),
> > > >> >> > +        * Sequence number flag (1b),
> > > >> >> > +        * N-PDU number flag (1b).
> > > >> >> > +        */
> > > >> >> > +       uint8_t v_pt_rsv_flags;
> > > >> >> > +       uint8_t msg_type; /**< Message type. */
> > > >> >> > +       rte_be16_t msg_len; /**< Message length. */
> > > >> >> > +       rte_be32_t teid; /**< Tunnel endpoint identifier. */ };
> > > >> >>
> > > >> >> In future, you might add support for GTPv2 (which is used since LTE).
> > > >> >> Maybe this structure should have v1 in its name to avoid confusion?
> > > >> >
> > > >> > I considered it before. But I think we can modify it when we support GTPv2 in
> future,
> > > and keep concise 'GTP' currently:)  since I have described it matches v1 header.
> > > >> >
> > > >>
> > > >> You could rename v_pt_rsv_flags to version_flags to avoid some future
> > > >> code changes to support GTPv2. There's still the issue that not all
> > > >> GTPv2 messages have a TEID though.
> > > >
> > > > Although they have the same size, the header of these two protocols
> > > > obviously differs. My suggestion would be to go with a separate GTPv2
> > > > pattern item using its own dedicated structure instead.
> > > >
> > > > --
> > > > Adrien Mazarguil
> > > > 6WIND
> > >
> > > The 1st four bytes are the same (flags in first byte have different
> > > meanings, but the bits indicating the version are in the same
> > > location). After that, different fields in each version are optional,
> > > and the headers have variable size. A single structure could be used
> > > if the first field is renamed to something like "version_flags", and
> > > then check that the teid field in item->mask is not set if
> > > ((version_flags >> 5 == 2) && ((version_flags >> 4) & 1) == 1). If
> > > there's going to be two structures, it would be good to put v1 and v2
> > > in the names, in my opinion.
> >
> > I think the name GTP is OK for now. Due to v1 and v2 are different, why not rename
> them
> > when the v2 supporting are introduced?
> 
> In any case I'd rather avoid renaming and modifying existing items and
> structure contents once part of the API to avoid API/ABI breakage that
> require deprecation notices, user applications updates and so on; rte_flow
> has been created as a kind of append-only API for this reason (of course
> there are exceptions, such as a bad design choice for the VLAN item I intend
> to fix at some point).
> 
> I'm fine with the name "GTP" as defined now and documented as matching
> GTPv1. We can add "GTPv2"-themed definitions later when some implementation
> provides the ability to match this version. If you want to append the "v1"
> suffix right now to be more explicit, I'm also fine with that. Your call.
> 
Got your point, I'm also fine with the name now for GTPv1, and add "GTPv2" when
It is supported.

Thanks
Jingjing

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 4/8] ethdev: add GTP items to support flow API
  @ 2017-10-05  8:30  3%                 ` Adrien Mazarguil
  2017-10-05  8:39  0%                   ` Wu, Jingjing
  0 siblings, 1 reply; 200+ results
From: Adrien Mazarguil @ 2017-10-05  8:30 UTC (permalink / raw)
  To: Wu, Jingjing; +Cc: Sean Harte, Xing, Beilei, Chilikin, Andrey, dev

On Thu, Oct 05, 2017 at 08:06:38AM +0000, Wu, Jingjing wrote:
> 
> 
> > -----Original Message-----
> > From: Sean Harte [mailto:seanbh@gmail.com]
> > Sent: Tuesday, October 3, 2017 4:57 PM
> > To: Adrien Mazarguil <adrien.mazarguil@6wind.com>
> > Cc: Xing, Beilei <beilei.xing@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Chilikin,
> > Andrey <andrey.chilikin@intel.com>; dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v6 4/8] ethdev: add GTP items to support flow API
> > 
> > On 2 October 2017 at 13:27, Adrien Mazarguil <adrien.mazarguil@6wind.com> wrote:
> > > On Fri, Sep 29, 2017 at 10:29:55AM +0100, Sean Harte wrote:
> > >> On 29 September 2017 at 09:54, Xing, Beilei <beilei.xing@intel.com> wrote:
> > > <snip>
> > >> >> >  /**
> > >> >> > + * RTE_FLOW_ITEM_TYPE_GTP.
> > >> >> > + *
> > >> >> > + * Matches a GTPv1 header.
> > >> >> > + */
> > >> >> > +struct rte_flow_item_gtp {
> > >> >> > +       /**
> > >> >> > +        * Version (3b), protocol type (1b), reserved (1b),
> > >> >> > +        * Extension header flag (1b),
> > >> >> > +        * Sequence number flag (1b),
> > >> >> > +        * N-PDU number flag (1b).
> > >> >> > +        */
> > >> >> > +       uint8_t v_pt_rsv_flags;
> > >> >> > +       uint8_t msg_type; /**< Message type. */
> > >> >> > +       rte_be16_t msg_len; /**< Message length. */
> > >> >> > +       rte_be32_t teid; /**< Tunnel endpoint identifier. */ };
> > >> >>
> > >> >> In future, you might add support for GTPv2 (which is used since LTE).
> > >> >> Maybe this structure should have v1 in its name to avoid confusion?
> > >> >
> > >> > I considered it before. But I think we can modify it when we support GTPv2 in future,
> > and keep concise 'GTP' currently:)  since I have described it matches v1 header.
> > >> >
> > >>
> > >> You could rename v_pt_rsv_flags to version_flags to avoid some future
> > >> code changes to support GTPv2. There's still the issue that not all
> > >> GTPv2 messages have a TEID though.
> > >
> > > Although they have the same size, the header of these two protocols
> > > obviously differs. My suggestion would be to go with a separate GTPv2
> > > pattern item using its own dedicated structure instead.
> > >
> > > --
> > > Adrien Mazarguil
> > > 6WIND
> > 
> > The 1st four bytes are the same (flags in first byte have different
> > meanings, but the bits indicating the version are in the same
> > location). After that, different fields in each version are optional,
> > and the headers have variable size. A single structure could be used
> > if the first field is renamed to something like "version_flags", and
> > then check that the teid field in item->mask is not set if
> > ((version_flags >> 5 == 2) && ((version_flags >> 4) & 1) == 1). If
> > there's going to be two structures, it would be good to put v1 and v2
> > in the names, in my opinion.
> 
> I think the name GTP is OK for now. Due to v1 and v2 are different, why not rename them
> when the v2 supporting are introduced?

In any case I'd rather avoid renaming and modifying existing items and
structure contents once part of the API to avoid API/ABI breakage that
require deprecation notices, user applications updates and so on; rte_flow
has been created as a kind of append-only API for this reason (of course
there are exceptions, such as a bad design choice for the VLAN item I intend
to fix at some point).

I'm fine with the name "GTP" as defined now and documented as matching
GTPv1. We can add "GTPv2"-themed definitions later when some implementation
provides the ability to match this version. If you want to append the "v1"
suffix right now to be more explicit, I'm also fine with that. Your call.

-- 
Adrien Mazarguil
6WIND

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v5] devtools: rework abi checker script
  2017-09-20  9:12 27%   ` [dpdk-dev] [PATCH v4] " Olivier Matz
  2017-09-21 15:40  7%     ` Neil Horman
@ 2017-10-05  7:53 27%     ` Olivier Matz
  2017-10-05 13:15  4%       ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Olivier Matz @ 2017-10-05  7:53 UTC (permalink / raw)
  To: dev, nhorman, bruce.richardson

The initial version of the script had some limitations:
- cannot work on a non-clean workspace
- environment variables are not documented
- no compilation log in case of failure
- return success even it abi is incompatible

This patch addresses these issues and rework the code.

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
---

v4->v5:
- Add a log when shared lib has no public ABI

v3->v4:
- clarify logs on incompatible abi
- log when an error returned an error
- [really] fix the report path
- log the output of make config in the proper file

v2->v3:
- fix when not launched from dpdk root dir
- use "-Og -Wno-error" instead of "-O0"
- fix typo in commit log

v1->v2:
- use /usr/bin/env to find bash (which is required)
- fix displayed path to html reports
- reword help for -f option

 devtools/validate-abi.sh | 397 ++++++++++++++++++++++++-----------------------
 1 file changed, 205 insertions(+), 192 deletions(-)

diff --git a/devtools/validate-abi.sh b/devtools/validate-abi.sh
index 0accc99b1..8caf43e83 100755
--- a/devtools/validate-abi.sh
+++ b/devtools/validate-abi.sh
@@ -1,7 +1,8 @@
-#!/bin/sh
+#!/usr/bin/env bash
 #   BSD LICENSE
 #
 #   Copyright(c) 2015 Neil Horman. All rights reserved.
+#   Copyright(c) 2017 6WIND S.A.
 #   All rights reserved.
 #
 #   Redistribution and use in source and binary forms, with or without
@@ -27,236 +28,248 @@
 #   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-TAG1=$1
-TAG2=$2
-TARGET=$3
-ABI_DIR=`mktemp -d -p /tmp ABI.XXXXXX`
+set -e
 
-usage() {
-	echo "$0 <REV1> <REV2> <TARGET>"
-}
+abicheck=abi-compliance-checker
+abidump=abi-dumper
+default_dst=abi-check
+default_target=x86_64-native-linuxapp-gcc
 
-log() {
-	local level=$1
-	shift
-	echo "$*"
+# trap on error
+err_report() {
+    echo "$0: error at line $1"
 }
+trap 'err_report $LINENO' ERR
 
-validate_tags() {
+print_usage () {
+	cat <<- END_OF_HELP
+	$(basename $0) [options] <rev1> <rev2>
 
-	if [ -z "$HASH1" ]
-	then
-		echo "invalid revision: $TAG1"
-		return
-	fi
-	if [ -z "$HASH2" ]
-	then
-		echo "invalid revision: $TAG2"
-		return
-	fi
+	This script compares the ABI of 2 git revisions of the current
+	workspace. The output is a html report and a compilation log.
+
+	The objective is to make sure that applications built against
+	DSOs from the first revision can still run when executed using
+	the DSOs built from the second revision.
+
+	<rev1> and <rev2> are git commit id or tags.
+
+	Options:
+	  -h		show this help
+	  -j <num>	enable parallel compilation with <num> threads
+	  -v		show compilation logs on the console
+	  -d <dir>	change working directory (default is ${default_dst})
+	  -t <target>	the dpdk target to use (default is ${default_target})
+	  -f		overwrite existing files in destination directory
+
+	The script returns 0 on success, or the value of last failing
+	call of ${abicheck} (incompatible abi or the tool has run with errors).
+	The errors returned by ${abidump} are ignored.
+
+	END_OF_HELP
 }
 
-validate_args() {
-	if [ -z "$TAG1" ]
-	then
-		echo "Must Specify REV1"
-		return
-	fi
-	if [ -z "$TAG2" ]
-	then
-		echo "Must Specify REV2"
-		return
-	fi
-	if [ -z "$TARGET" ]
-	then
-		echo "Must Specify a build target"
+# log in the file, and on stdout if verbose
+# $1: level string
+# $2: string to be logged
+log() {
+	echo "$1: $2"
+	if [ "${verbose}" != "true" ]; then
+		echo "$1: $2" >&3
 	fi
 }
 
+# launch a command and log it, taking care of surrounding spaces with quotes
+cmd() {
+	local i s whitespace ret
+	s=""
+	whitespace="[[:space:]]"
+	for i in "$@"; do
+		if [[ $i =~ $whitespace ]]; then
+			i=\"$i\"
+		fi
+		if [ -z "$s" ]; then
+			s="$i"
+		else
+			s="$s $i"
+		fi
+	done
+
+	ret=0
+	log "CMD" "$s"
+	"$@" || ret=$?
+	if [ "$ret" != "0" ]; then
+		log "CMD" "previous command returned $ret"
+	fi
+
+	return $ret
+}
 
-cleanup_and_exit() {
-	rm -rf $ABI_DIR
-	git checkout $CURRENT_BRANCH
-	exit $1
+# redirect or copy stderr/stdout to a file
+# the syntax is unfamiliar, but it makes the rest of the
+# code easier to read, avoiding the use of pipes
+set_log_file() {
+	# save original stdout and stderr in fd 3 and 4
+	exec 3>&1
+	exec 4>&2
+	# create a new fd 5 that send to a file
+	exec 5> >(cat > $1)
+	# send stdout and stderr to fd 5
+	if [ "${verbose}" = "true" ]; then
+		exec 1> >(tee /dev/fd/5 >&3)
+		exec 2> >(tee /dev/fd/5 >&4)
+	else
+		exec 1>&5
+		exec 2>&5
+	fi
 }
 
 # Make sure we configure SHARED libraries
 # Also turn off IGB and KNI as those require kernel headers to build
 fixup_config() {
-	sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" config/defconfig_$TARGET
-	sed -i -e"$ a\CONFIG_RTE_NEXT_ABI=n" config/defconfig_$TARGET
-	sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET
-	sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" config/defconfig_$TARGET
-	sed -i -e"$ a\CONFIG_RTE_KNI_KMOD=n" config/defconfig_$TARGET
+	local conf=config/defconfig_$target
+	cmd sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" $conf
+	cmd sed -i -e"$ a\CONFIG_RTE_NEXT_ABI=n" $conf
+	cmd sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" $conf
+	cmd sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" $conf
+	cmd sed -i -e"$ a\CONFIG_RTE_KNI_KMOD=n" $conf
 }
 
-###########################################
-#START
-############################################
+# build dpdk for the given tag and dump abi
+# $1: hash of the revision
+gen_abi() {
+	local i
+
+	cmd git clone ${dpdkroot} ${dst}/${1}
+	cmd cd ${dst}/${1}
+
+	log "INFO" "Checking out version ${1} of the dpdk"
+	# Move to the old version of the tree
+	cmd git checkout ${1}
+
+	fixup_config
+
+	# Now configure the build
+	log "INFO" "Configuring DPDK ${1}"
+	cmd make config T=$target O=$target
+
+	# Checking abi compliance relies on using the dwarf information in
+	# the shared objects. Build with -g to include them.
+	log "INFO" "Building DPDK ${1}. This might take a moment"
+	cmd make -j$parallel O=$target V=1 EXTRA_CFLAGS="-g -Og -Wno-error" \
+	    EXTRA_LDFLAGS="-g" || log "INFO" "The build failed"
+
+	# Move to the lib directory
+	cmd cd ${PWD}/$target/lib
+	log "INFO" "Collecting ABI information for ${1}"
+	for i in *.so; do
+		[ -e "$i" ] || break
+		cmd $abidump ${i} -o $dst/${1}/${i}.dump -lver ${1} || true
+		# hack to ignore empty SymbolsInfo section (no public ABI)
+		if grep -q "'SymbolInfo' => {}," $dst/${1}/${i}.dump \
+				2> /dev/null; then
+			log "INFO" "${i} has no public ABI, remove dump file"
+			cmd rm -f $dst/${1}/${i}.dump
+		fi
+	done
+}
 
-#trap on ctrl-c to clean up
-trap cleanup_and_exit SIGINT
+verbose=false
+parallel=1
+dst=${default_dst}
+target=${default_target}
+force=0
+while getopts j:vd:t:fh ARG ; do
+	case $ARG in
+		j ) parallel=$OPTARG ;;
+		v ) verbose=true ;;
+		d ) dst=$OPTARG ;;
+		t ) target=$OPTARG ;;
+		f ) force=1 ;;
+		h ) print_usage ; exit 0 ;;
+		? ) print_usage ; exit 1 ;;
+	esac
+done
+shift $(($OPTIND - 1))
 
-if [ -z "$DPDK_MAKE_JOBS" ]
-then
-	# This counts the number of cpus on the system
-	if [ -e /usr/bin/lscpu ]
-	then
-		DPDK_MAKE_JOBS=`lscpu -p=cpu | grep -v "#" | wc -l`
-	else
-		DPDK_MAKE_JOBS=1
-	fi
+if [ $# != 2 ]; then
+	print_usage
+	exit 1
 fi
 
-#Save the current branch
-CURRENT_BRANCH=`git branch | grep \* | cut -d' ' -f2`
+tag1=$1
+tag2=$2
 
-if [ -z "$CURRENT_BRANCH" ]
-then
-	CURRENT_BRANCH=`git log --pretty=format:%H HEAD~1..HEAD`
-fi
+# convert path to absolute
+case "${dst}" in
+	/*) ;;
+	*) dst=${PWD}/${dst} ;;
+esac
+dpdkroot=$(readlink -e $(dirname $0)/..)
 
-if [ -n "$VERBOSE" ]
-then
-	export VERBOSE=/dev/stdout
-else
-	export VERBOSE=/dev/null
+if [ -e "${dst}" -a "$force" = 0 ]; then
+	echo "The ${dst} directory is not empty. Remove it, use another"
+	echo "one (-d <dir>), or force overriding (-f)"
+	exit 1
 fi
 
-# Validate that we have all the arguments we need
-res=$(validate_args)
-if [ -n "$res" ]
-then
-	echo $res
-	usage
-	cleanup_and_exit 1
-fi
+rm -rf ${dst}
+mkdir -p ${dst}
+set_log_file ${dst}/abi-check.log
+log "INFO" "Logs available in ${dst}/abi-check.log"
 
-HASH1=$(git show -s --format=%H "$TAG1" -- 2> /dev/null | tail -1)
-HASH2=$(git show -s --format=%H "$TAG2" -- 2> /dev/null | tail -1)
+command -v ${abicheck} || log "INFO" "Can't find ${abicheck} utility"
+command -v ${abidump} || log "INFO" "Can't find ${abidump} utility"
 
-# Make sure our tags exist
-res=$(validate_tags)
-if [ -n "$res" ]
-then
-	echo $res
-	cleanup_and_exit 1
-fi
+hash1=$(git show -s --format=%h "$tag1" -- 2> /dev/null | tail -1)
+hash2=$(git show -s --format=%h "$tag2" -- 2> /dev/null | tail -1)
 
 # Make hashes available in output for non-local reference
-TAG1="$TAG1 ($HASH1)"
-TAG2="$TAG2 ($HASH2)"
-
-ABICHECK=`which abi-compliance-checker 2>/dev/null`
-if [ $? -ne 0 ]
-then
-	log "INFO" "Can't find abi-compliance-checker utility"
-	cleanup_and_exit 1
-fi
-
-ABIDUMP=`which abi-dumper 2>/dev/null`
-if [ $? -ne 0 ]
-then
-	log "INFO" "Can't find abi-dumper utility"
-	cleanup_and_exit 1
-fi
+tag1="$tag1 ($hash1)"
+tag2="$tag2 ($hash2)"
 
-log "INFO" "We're going to check and make sure that applications built"
-log "INFO" "against DPDK DSOs from version $TAG1 will still run when executed"
-log "INFO" "against DPDK DSOs built from version $TAG2."
-log "INFO" ""
-
-# Check to make sure we have a clean tree
-git status | grep -q clean
-if [ $? -ne 0 ]
-then
-	log "WARN" "Working directory not clean, aborting"
-	cleanup_and_exit 1
+if [ "$hash1" = "$hash2" ]; then
+	log "ERROR" "$tag1 and $tag2 are the same revisions"
+	exit 1
 fi
 
-# Move to the root of the git tree
-cd $(dirname $0)/..
+cmd mkdir -p ${dst}
 
-log "INFO" "Checking out version $TAG1 of the dpdk"
-# Move to the old version of the tree
-git checkout $HASH1
+# dump abi for each revision
+gen_abi ${hash1}
+gen_abi ${hash2}
 
-fixup_config
+# compare the abi dumps
+cmd cd ${dst}
+ret=0
+list=""
+for i in ${hash2}/*.dump; do
+	name=`basename $i`
+	libname=${name%.dump}
 
-# Checking abi compliance relies on using the dwarf information in
-# The shared objects.  Thats only included in the DSO's if we build
-# with -g
-export EXTRA_CFLAGS="$EXTRA_CFLAGS -g -O0"
-export EXTRA_LDFLAGS="$EXTRA_LDFLAGS -g"
-
-# Now configure the build
-log "INFO" "Configuring DPDK $TAG1"
-make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
-
-log "INFO" "Building DPDK $TAG1. This might take a moment"
-make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1
-
-if [ $? -ne 0 ]
-then
-	log "INFO" "THE BUILD FAILED.  ABORTING"
-	cleanup_and_exit 1
-fi
+	if [ ! -f ${hash1}/$name ]; then
+		log "INFO" "$NAME does not exist in $tag1. skipping..."
+		continue
+	fi
 
-# Move to the lib directory
-cd $TARGET/lib
-log "INFO" "COLLECTING ABI INFORMATION FOR $TAG1"
-for i in `ls *.so`
-do
-	$ABIDUMP $i -o $ABI_DIR/$i-ABI-0.dump -lver $HASH1
+	local_ret=0
+	cmd $abicheck -l $libname \
+	    -old ${hash1}/$name -new ${hash2}/$name || local_ret=$?
+	if [ $local_ret != 0 ]; then
+		log "NOTICE" "$abicheck returned $local_ret"
+		ret=$local_ret
+		list="$list $libname"
+	fi
 done
-cd ../..
-
-# Now clean the tree, checkout the second tag, and rebuild
-git clean -f -d
-git reset --hard
-# Move to the new version of the tree
-log "INFO" "Checking out version $TAG2 of the dpdk"
-git checkout $HASH2
-
-fixup_config
-
-# Now configure the build
-log "INFO" "Configuring DPDK $TAG2"
-make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
-
-log "INFO" "Building DPDK $TAG2. This might take a moment"
-make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1
 
-if [ $? -ne 0 ]
-then
-	log "INFO" "THE BUILD FAILED.  ABORTING"
-	cleanup_and_exit 1
+if [ $ret != 0 ]; then
+	log "NOTICE" "ABI may be incompatible, check reports/logs for details."
+	log "NOTICE" "Incompatible list: $list"
+else
+	log "NOTICE" "No error detected, ABI is compatible."
 fi
 
-cd $TARGET/lib
-log "INFO" "COLLECTING ABI INFORMATION FOR $TAG2"
-for i in `ls *.so`
-do
-	$ABIDUMP $i -o $ABI_DIR/$i-ABI-1.dump -lver $HASH2
-done
-cd ../..
-
-# Start comparison of ABI dumps
-for i in `ls $ABI_DIR/*-1.dump`
-do
-	NEWNAME=`basename $i`
-	OLDNAME=`basename $i | sed -e"s/1.dump/0.dump/"`
-	LIBNAME=`basename $i | sed -e"s/-ABI-1.dump//"`
-
-	if [ ! -f $ABI_DIR/$OLDNAME ]
-	then
-		log "INFO" "$OLDNAME DOES NOT EXIST IN $TAG1. SKIPPING..."
-	fi
-
-	#compare the abi dumps
-	$ABICHECK -l $LIBNAME -old $ABI_DIR/$OLDNAME -new $ABI_DIR/$NEWNAME
-done
+log "INFO" "Logs are in ${dst}/abi-check.log"
+log "INFO" "HTML reports are in ${dst}/compat_reports directory"
 
-git reset --hard
-log "INFO" "ABI CHECK COMPLETE.  REPORTS ARE IN compat_report directory"
-cleanup_and_exit 0
+exit $ret
-- 
2.11.0

^ permalink raw reply	[relevance 27%]

* Re: [dpdk-dev] [PATCH v6 0/4] ethdev new offloads API
  2017-10-04 16:12  0%         ` Ananyev, Konstantin
@ 2017-10-05  0:55  0%           ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-10-05  0:55 UTC (permalink / raw)
  To: Ananyev, Konstantin, Shahaf Shuler, thomas, arybchenko, jerin.jacob; +Cc: dev

On 10/4/2017 5:12 PM, Ananyev, Konstantin wrote:
> 
> 
>> -----Original Message-----
>> From: Shahaf Shuler [mailto:shahafs@mellanox.com]
>> Sent: Wednesday, October 4, 2017 9:18 AM
>> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; thomas@monjalon.net; arybchenko@solarflare.com;
>> jerin.jacob@caviumnetworks.com; Yigit, Ferruh <ferruh.yigit@intel.com>
>> Cc: dev@dpdk.org
>> Subject: [PATCH v6 0/4] ethdev new offloads API
>>
>> Tx offloads configuration is per queue. Tx offloads are enabled by default,
>> and can be disabled using ETH_TXQ_FLAGS_NO* flags.
>> This behaviour is not consistent with the Rx side where the Rx offloads
>> configuration is per port. Rx offloads are disabled by default and enabled
>> according to bit field in rte_eth_rxmode structure.
>>
>> Moreover, considering more Tx and Rx offloads will be added
>> over time, the cost of managing them all inside the PMD will be tremendous,
>> as the PMD will need to check the matching for the entire offload set
>> for each mbuf it handles.
>> In addition, on the current approach each Rx offload added breaks the
>> ABI compatibility as it requires to add entries to existing bit-fields.
>>
>> The series address above issues by defining a new offloads API.
>> In the new API, offloads are divided into per-port and per-queue offloads,
>> with a corresponding capability for each.
>> The offloads are disabled by default. Each offload can be enabled or
>> disabled using the existing DEV_TX_OFFLOADS_* or DEV_RX_OFFLOADS_* flags.
>> Such API will enable to easily add or remove offloads, without breaking the
>> ABI compatibility.
>>
>> In order to provide a smooth transition between the APIs the following actions
>> were taken:
>> *  The old offloads API is kept for the meanwhile.
>> *  Helper function which copy from old to new API were added to ethdev,
>>    enabling the PMD to support only one of the APIs.
>> *  Helper function which copy from new to old API were also added,
>>    to enable application to use the new API with PMD which still supports
>>    the old one.
>>
>> Per discussion made on the RFC of this series [1], the integration plan which was
>> decided is to do the transition in two phases:
>> * ethdev API will move on 17.11.
>> * Apps and examples will move on 18.02.
>>
>> This to enable PMD maintainers sufficient time to adopt the new API.
>>
>> [1]
>> http://dpdk.org/ml/archives/dev/2017-August/072643.html
>>
>> on v6:
>>  - Move mbuf fast free Tx offload to a seperate patch.
>>
>> on v5:
>>  - Fix documentation.
>>  - Fix comments on port offloads configuration.
>>
>> on v4:
>>  - Added another patch for documentation.
>>  - Fixed ETH_TXQ_FLAGS_IGNORE flag override.
>>  - Clarify the description of DEV_TX_OFFLOAD_MBUF_FAST_FREE offload.
>>
>> on v3:
>>  - Introduce the DEV_TX_OFFLOAD_MBUF_FAST_FREE to act as an equivalent
>>    for the no refcnt and single mempool flags.
>>  - Fix features documentation.
>>  - Fix comment style.
>>
>> on v2:
>>  - Taking new approach of dividing offloads into per-queue and per-port one.
>>  - Postpone the Tx/Rx public struct renaming to 18.02
>>  - Squash the helper functions into the Rx/Tx offloads intro patches.
>>
>> Shahaf Shuler (4):
>>   ethdev: introduce Rx queue offloads API
>>   ethdev: introduce Tx queue offloads API
>>   ethdev: add mbuf fast free Tx offload
>>   doc: add details on ethdev offloads API
>>
>>  doc/guides/nics/features.rst            |  66 +++++---
>>  doc/guides/nics/features/default.ini    |   1 +
>>  doc/guides/prog_guide/poll_mode_drv.rst |  20 +++
>>  lib/librte_ether/rte_ethdev.c           | 223 +++++++++++++++++++++++++--
>>  lib/librte_ether/rte_ethdev.h           |  89 ++++++++++-
>>  5 files changed, 359 insertions(+), 40 deletions(-)
>>
>> Series-reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>

> Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: fix LIBABIVER
  @ 2017-10-04 21:54  3%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-04 21:54 UTC (permalink / raw)
  To: Yigit, Ferruh; +Cc: dev, Yang, Zhiyong, stable

Added this comment:
The ethdev ABI has been broken in release 17.08 without being bumped.

> > Fixes: c33ade1227a5 ("doc: notify ethdev callback process API change")
> > Cc: stable@dpdk.org
> > 
> > Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
> 
> Reviewed-by: Zhiyong Yang <zhiyong.yang@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
  2017-10-03 15:17  4%     ` Thomas Monjalon
@ 2017-10-04 17:11  0%       ` Flavio Leitner
  2017-10-05 21:55  0%       ` Mokhtar, Amr
  1 sibling, 0 replies; 200+ results
From: Flavio Leitner @ 2017-10-04 17:11 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: Mokhtar, Amr, dev, aconole, bluca

On Tue, 03 Oct 2017 17:17:53 +0200
Thomas Monjalon <thomas@monjalon.net> wrote:

> 03/10/2017 16:29, Mokhtar, Amr:
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]  
> > > 25/08/2017 15:46, Amr Mokhtar:  
> > > > +int
> > > > +rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues,
> > > > +		const struct rte_bbdev_conf *conf);  
> > > 
> > > I am not convinced by the "configure all" function in ethdev.
> > > We break the ABI each time we add a new feature to configure.
> > > And it does not really help to have all configurations in one struct.
> > > Would you mind to split the struct rte_bbdev_conf and split the function
> > > accordingly?  
> > 
> > There is nothing to split tbh. The only parameter it has is the socket_id.
> > And in fact, it's optional, can be null. The only config we need is num_queues.  
> 
> Indeed, there is nothing in this struct.
> If you need only to allocate queues, you just have to rename this function.
> 
> > I don't see in the near future that we may need to add more config params.
> > As a side, in the time of the implementation we were trying to avoid any
> > diversions from the current design ideology of ethdev and cryptodev.  
> 
> There is no ideology in ethdev, just some mistakes ;)
> 
> > Can we leave it for consideration with future releases?  
> 
> No it should be addressed from the beginning.
> 
> When you will need to add something more to configure port-wise,
> you should add a new function instead of breaking the ABI
> of the global conf struct.
> That's why the configure option should be more specialized.
> 
> Distro people were complaining about ABI breakage last week.
> This is exactly an example of how to avoid it from the beginning.

Exactly, and fixing in future is unlikely to happen or could be
more difficult and even if it happens, it will cause another breakage.

-- 
Flavio

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 0/4] ethdev new offloads API
  2017-10-04  8:17  4%       ` [dpdk-dev] [PATCH v6 0/4] " Shahaf Shuler
@ 2017-10-04 16:12  0%         ` Ananyev, Konstantin
  2017-10-05  0:55  0%           ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2017-10-04 16:12 UTC (permalink / raw)
  To: Shahaf Shuler, thomas, arybchenko, jerin.jacob, Yigit, Ferruh; +Cc: dev



> -----Original Message-----
> From: Shahaf Shuler [mailto:shahafs@mellanox.com]
> Sent: Wednesday, October 4, 2017 9:18 AM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; thomas@monjalon.net; arybchenko@solarflare.com;
> jerin.jacob@caviumnetworks.com; Yigit, Ferruh <ferruh.yigit@intel.com>
> Cc: dev@dpdk.org
> Subject: [PATCH v6 0/4] ethdev new offloads API
> 
> Tx offloads configuration is per queue. Tx offloads are enabled by default,
> and can be disabled using ETH_TXQ_FLAGS_NO* flags.
> This behaviour is not consistent with the Rx side where the Rx offloads
> configuration is per port. Rx offloads are disabled by default and enabled
> according to bit field in rte_eth_rxmode structure.
> 
> Moreover, considering more Tx and Rx offloads will be added
> over time, the cost of managing them all inside the PMD will be tremendous,
> as the PMD will need to check the matching for the entire offload set
> for each mbuf it handles.
> In addition, on the current approach each Rx offload added breaks the
> ABI compatibility as it requires to add entries to existing bit-fields.
> 
> The series address above issues by defining a new offloads API.
> In the new API, offloads are divided into per-port and per-queue offloads,
> with a corresponding capability for each.
> The offloads are disabled by default. Each offload can be enabled or
> disabled using the existing DEV_TX_OFFLOADS_* or DEV_RX_OFFLOADS_* flags.
> Such API will enable to easily add or remove offloads, without breaking the
> ABI compatibility.
> 
> In order to provide a smooth transition between the APIs the following actions
> were taken:
> *  The old offloads API is kept for the meanwhile.
> *  Helper function which copy from old to new API were added to ethdev,
>    enabling the PMD to support only one of the APIs.
> *  Helper function which copy from new to old API were also added,
>    to enable application to use the new API with PMD which still supports
>    the old one.
> 
> Per discussion made on the RFC of this series [1], the integration plan which was
> decided is to do the transition in two phases:
> * ethdev API will move on 17.11.
> * Apps and examples will move on 18.02.
> 
> This to enable PMD maintainers sufficient time to adopt the new API.
> 
> [1]
> http://dpdk.org/ml/archives/dev/2017-August/072643.html
> 
> on v6:
>  - Move mbuf fast free Tx offload to a seperate patch.
> 
> on v5:
>  - Fix documentation.
>  - Fix comments on port offloads configuration.
> 
> on v4:
>  - Added another patch for documentation.
>  - Fixed ETH_TXQ_FLAGS_IGNORE flag override.
>  - Clarify the description of DEV_TX_OFFLOAD_MBUF_FAST_FREE offload.
> 
> on v3:
>  - Introduce the DEV_TX_OFFLOAD_MBUF_FAST_FREE to act as an equivalent
>    for the no refcnt and single mempool flags.
>  - Fix features documentation.
>  - Fix comment style.
> 
> on v2:
>  - Taking new approach of dividing offloads into per-queue and per-port one.
>  - Postpone the Tx/Rx public struct renaming to 18.02
>  - Squash the helper functions into the Rx/Tx offloads intro patches.
> 
> Shahaf Shuler (4):
>   ethdev: introduce Rx queue offloads API
>   ethdev: introduce Tx queue offloads API
>   ethdev: add mbuf fast free Tx offload
>   doc: add details on ethdev offloads API
> 
>  doc/guides/nics/features.rst            |  66 +++++---
>  doc/guides/nics/features/default.ini    |   1 +
>  doc/guides/prog_guide/poll_mode_drv.rst |  20 +++
>  lib/librte_ether/rte_ethdev.c           | 223 +++++++++++++++++++++++++--
>  lib/librte_ether/rte_ethdev.h           |  89 ++++++++++-
>  5 files changed, 359 insertions(+), 40 deletions(-)
> 
> Series-reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> 
> --
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>

> 2.12.0

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 0/9] Policy Based Power Control for Guest
  2017-10-04  9:15  2% ` [dpdk-dev] [PATCH v4] " David Hunt
@ 2017-10-04 15:25  2%   ` David Hunt
  2017-10-05 12:25  2%     ` [dpdk-dev] [PATCH v6 " David Hunt
  0 siblings, 1 reply; 200+ results
From: David Hunt @ 2017-10-04 15:25 UTC (permalink / raw)
  To: dev; +Cc: konstantin.ananyev, jingjing.wu

Policy Based Power Control for Guest

This patchset adds the facility for a guest VM to send a policy down to the
host that will allow the host to scale up/down cpu frequencies
depending on the policy criteria independently of the DPDK app running in
the guest.  This differs from the previous vm_power implementation where
individual scale up/down requests were send from the guest to the host via
virtio-serial.

V5 patchset changes:
  * Removed most of the #ifdef I40_PMD from the example code as it will
    be applicable to other PMDs in the future.
  * Changed the parameter of rte_pmd_i40e_query_vfid_by_mac from a uint64
    to a const struct ether_addr *, rather than casting it later in the
    function.

V4 patchset changes:
  * None, re-post to mailing list under the correct email thread.

V3 patchset changes:
  * Changed to using is_same_ether_addr() instead of looping through
    the mac address bytes to compare them.
  * Tweaked some comments and working in the i40e patch after review.
  * Added a patch to the set to add new i40e function to map file, so
    as to allow shared library builds. The power library API needs a cleanup
    in next release, so will add API/ABI warning for this cleanup in a
    separate patch.

V2 patchset changes:
  * Removed API's in ethdev layer.
  * Now just a single new API in the i40e driver for mapping VF MAC to
    VF index.
  * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
  * Removed function for reading i40e register, moved to using the
    standard stats API.
  * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
  * Cleaned up policy generation code.

It's a modification of the vm_power_manager app that runs in the host, and
the guest_vm_power_app example app that runs in the guest. This allows the
guest to send down a policy to the host via virtio-serial, which then allows
the host to scale up/down based on the criteria in the policy, resulting in
quicker scale up/down than individual requests coming from the guest.
It also means that the DPDK application running in the guest does not need
to be modified in any way, it is unaware that it's cores are being scaled
up/down, reducing the effort in implementing a power-aware infrastructure.

The usage model is as follows:
1. Set up the VF's and assign to the guest in the usual way.
2. run vm_power_manager on the host, creating a channel to the guest.
3. Start the guest_vm_power_mgr app on the guest, which establishes
   a virtio-serial channel to the host.
4. Send down the profile for the guest using the "send_profile now" command.
   There is an example profile hard-coded into guest_vm_power_mgr.
5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
6. Send traffic into the VFs at varying traffic rates.
   Observe the frequency change on the host (turbostat -i 1)

The sequence of code changes are as follows:

A new function has been aded to the i40e driver to allow mapping of
a VF MAC to VF index.

Next we make an addition to librte_power that adds an extra command to allow
the passing of a policy structure from the guest to the host. This struct
contains information like busy/quiet hour, packet throughput thresholds, etc.

The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
physical CPU (pcpu) IDs so that the host can scale up/down the cores used
in the guest.

The remaining patches are functionality to process the policy, and take action
when the relevant trigger occurs to cause a frequency change.

[1/9] net/i40e: add API to convert VF MAC to VF id
[2/9] lib/librte_power: add extra msg type for policies
[3/9] examples/vm_power_mgr: add vcpu to pcpu mapping
[4/9] examples/vm_power_mgr: add scale to medium freq fn
[5/9] examples/vm_power_mgr: add policy to channels
[6/9] examples/vm_power_mgr: add port initialisation
[7/9] power: add send channel msg function to map file
[8/9] examples/guest_cli: add send policy to host
[9/9] examples/vm_power_mgr: set MAC address of VF

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v2] test/crypto: remove crypto perf tests
  @ 2017-10-04  6:48  1% ` Pablo de Lara
  0 siblings, 0 replies; 200+ results
From: Pablo de Lara @ 2017-10-04  6:48 UTC (permalink / raw)
  To: declan.doherty, hemant.agrawal, akhil.goyal, jerin.jacob,
	fiona.trahe, deepak.k.jain, john.griffin
  Cc: dev, Pablo de Lara

Since the crypto perf application is flexible enough
to cover all the crypto performance tests, these are not needed
anymore, so they will be removed to avoid duplications.
Besides, the crypto perf application gives the user more options
to get performance, for every single supported algorithm,
such as varying the buffer size as the user wants.

Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---

Changes in v2:
- Rebased against latest code
- Added note in release notes

 doc/guides/rel_notes/release_17_11.rst |   15 +
 test/test/Makefile                     |    1 -
 test/test/test_cryptodev_perf.c        | 4932 --------------------------------
 3 files changed, 15 insertions(+), 4933 deletions(-)
 delete mode 100644 test/test/test_cryptodev_perf.c

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index ebb5021..58e614b 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -164,6 +164,21 @@ ABI Changes
    =========================================================
 
 
+Removed Items
+-------------
+
+.. This section should contain removed items in this release. Sample format:
+
+   * Add a short 1-2 sentence description of the removed item in the past
+     tense.
+
+   This section is a comment. do not overwrite or remove it.
+   Also, make sure to start the actual text at the margin.
+   =========================================================
+
+* The crypto performance unit tests have been removed, substituted
+  by the dpdk-test-crypto-perf application.
+
 
 Shared Library Versions
 -----------------------
diff --git a/test/test/Makefile b/test/test/Makefile
index 42d9a49..de360e3 100644
--- a/test/test/Makefile
+++ b/test/test/Makefile
@@ -198,7 +198,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_RING) += test_pmd_ring.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_RING) += test_pmd_ring_perf.c
 
 SRCS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += test_cryptodev_blockcipher.c
-SRCS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += test_cryptodev_perf.c
 SRCS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += test_cryptodev.c
 
 ifeq ($(CONFIG_RTE_LIBRTE_EVENTDEV),y)
diff --git a/test/test/test_cryptodev_perf.c b/test/test/test_cryptodev_perf.c
deleted file mode 100644
index 3b57e6d..0000000
--- a/test/test/test_cryptodev_perf.c
+++ /dev/null
@@ -1,4932 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2015-2017 Intel Corporation. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *	 * Redistributions of source code must retain the above copyright
- *	   notice, this list of conditions and the following disclaimer.
- *	 * Redistributions in binary form must reproduce the above copyright
- *	   notice, this list of conditions and the following disclaimer in
- *	   the documentation and/or other materials provided with the
- *	   distribution.
- *	 * Neither the name of Intel Corporation nor the names of its
- *	   contributors may be used to endorse or promote products derived
- *	   from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <rte_common.h>
-#include <rte_mbuf.h>
-#include <rte_malloc.h>
-#include <rte_memcpy.h>
-
-#include <rte_crypto.h>
-#include <rte_cryptodev.h>
-#include <rte_cycles.h>
-
-#include "test.h"
-#include "test_cryptodev.h"
-#include "test_cryptodev_gcm_test_vectors.h"
-
-#define AES_CIPHER_IV_LENGTH 16
-#define TRIPLE_DES_CIPHER_IV_LENGTH 8
-#define AES_GCM_AAD_LENGTH 16
-
-#define PERF_NUM_OPS_INFLIGHT		(128)
-#define DEFAULT_NUM_REQS_TO_SUBMIT	(10000000)
-
-struct crypto_testsuite_params {
-	struct rte_mempool *mbuf_mp;
-	struct rte_mempool *op_mpool;
-	struct rte_mempool *sess_mp;
-
-	uint16_t nb_queue_pairs;
-
-	struct rte_cryptodev_config conf;
-	struct rte_cryptodev_qp_conf qp_conf;
-	uint8_t dev_id;
-};
-
-enum chain_mode {
-	CIPHER_HASH,
-	HASH_CIPHER,
-	CIPHER_ONLY,
-	HASH_ONLY,
-	AEAD
-};
-
-
-struct symmetric_op {
-	const uint8_t *aad_data;
-
-	const uint8_t *p_data;
-	uint32_t p_len;
-
-	const uint8_t *c_data;
-	uint32_t c_len;
-
-	const uint8_t *t_data;
-	uint32_t t_len;
-
-};
-
-struct symmetric_session_attrs {
-	enum rte_crypto_cipher_operation cipher;
-	enum rte_crypto_auth_operation auth;
-	enum rte_crypto_aead_operation aead;
-
-	enum rte_crypto_cipher_algorithm cipher_algorithm;
-	const uint8_t *key_cipher_data;
-	uint32_t key_cipher_len;
-
-	enum rte_crypto_auth_algorithm auth_algorithm;
-	const uint8_t *key_auth_data;
-	uint32_t key_auth_len;
-
-	enum rte_crypto_aead_algorithm aead_algorithm;
-	const uint8_t *key_aead_data;
-	uint32_t key_aead_len;
-
-	const uint8_t *iv_data;
-	uint16_t iv_len;
-	uint16_t aad_len;
-	uint32_t digest_len;
-};
-
-static struct rte_cryptodev_sym_session *test_crypto_session;
-
-#define ALIGN_POW2_ROUNDUP(num, align) \
-	(((num) + (align) - 1) & ~((align) - 1))
-
-/*
- * This struct is needed to avoid unnecessary allocation or checking
- * of allocation of crypto params with current alloc on the fly
- * implementation.
- */
-
-struct crypto_params {
-	uint8_t *aad;
-	uint8_t *digest;
-};
-
-struct perf_test_params {
-
-	unsigned total_operations;
-	unsigned burst_size;
-	unsigned buf_size;
-
-	enum chain_mode chain;
-
-	enum rte_crypto_cipher_algorithm cipher_algo;
-	unsigned int key_length;
-	enum rte_crypto_auth_algorithm auth_algo;
-	enum rte_crypto_aead_algorithm aead_algo;
-
-	struct symmetric_session_attrs *session_attrs;
-
-	struct symmetric_op *symmetric_op;
-};
-
-#define MAX_NUM_OF_OPS_PER_UT	(128)
-
-struct crypto_unittest_params {
-	struct rte_crypto_sym_xform cipher_xform;
-	struct rte_crypto_sym_xform auth_xform;
-
-	struct rte_cryptodev_sym_session *sess;
-
-	struct rte_crypto_op *op;
-
-	struct rte_mbuf *obuf[MAX_NUM_OF_OPS_PER_UT];
-	struct rte_mbuf *ibuf[MAX_NUM_OF_OPS_PER_UT];
-
-	uint8_t *digest;
-};
-
-static int
-test_perf_create_snow3g_session(uint8_t dev_id, enum chain_mode chain,
-		enum rte_crypto_cipher_algorithm cipher_algo,
-		unsigned int cipher_key_len,
-		enum rte_crypto_auth_algorithm auth_algo);
-static int
-test_perf_create_openssl_session(uint8_t dev_id, enum chain_mode chain,
-		enum rte_crypto_cipher_algorithm cipher_algo,
-		unsigned int cipher_key_len,
-		enum rte_crypto_auth_algorithm auth_algo,
-		enum rte_crypto_aead_algorithm aead_algo);
-static int
-test_perf_create_armv8_session(uint8_t dev_id, enum chain_mode chain,
-		enum rte_crypto_cipher_algorithm cipher_algo,
-		unsigned int cipher_key_len,
-		enum rte_crypto_auth_algorithm auth_algo);
-
-static struct rte_mbuf *
-test_perf_create_pktmbuf(struct rte_mempool *mpool, unsigned buf_sz);
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_snow3g(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess, unsigned int data_len);
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_aes(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess, unsigned int data_len,
-		enum chain_mode chain);
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_aes_gcm(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess, unsigned int data_len,
-		enum chain_mode chain __rte_unused);
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_3des(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess, unsigned int data_len,
-		enum chain_mode chain __rte_unused);
-static uint32_t get_auth_digest_length(enum rte_crypto_auth_algorithm algo);
-
-
-static const char *chain_mode_name(enum chain_mode mode)
-{
-	switch (mode) {
-	case CIPHER_HASH: return "cipher_hash"; break;
-	case HASH_CIPHER: return "hash_cipher"; break;
-	case CIPHER_ONLY: return "cipher_only"; break;
-	case HASH_ONLY: return "hash_only"; break;
-	case AEAD: return "aead"; break;
-	default: return ""; break;
-	}
-}
-
-static const char *pmd_name(uint8_t driver_id)
-{
-	uint8_t null_pmd = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_NULL_PMD));
-	uint8_t dpaa2_pmd = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
-	uint8_t snow3g_pmd = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
-	uint8_t aesni_gcm_pmd = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
-	uint8_t aesni_mb_pmd = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
-	uint8_t qat_pmd = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
-
-	if (driver_id == null_pmd)
-		return RTE_STR(CRYPTODEV_NAME_NULL_PMD);
-	else if (driver_id == aesni_gcm_pmd)
-		return RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD);
-	else if (driver_id == aesni_mb_pmd)
-		return RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD);
-	else if (driver_id == qat_pmd)
-		return RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
-	else if (driver_id == snow3g_pmd)
-		return RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD);
-	else if (driver_id == dpaa2_pmd)
-		return RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
-	else
-		return "";
-}
-
-static struct rte_mbuf *
-setup_test_string(struct rte_mempool *mpool,
-		const uint8_t *data, size_t len, uint8_t blocksize)
-{
-	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
-	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
-
-	if (m) {
-		char *dst = rte_pktmbuf_append(m, t_len);
-
-		if (!dst) {
-			rte_pktmbuf_free(m);
-			return NULL;
-		}
-
-		rte_memcpy(dst, (const void *)data, t_len);
-	}
-	return m;
-}
-
-static struct crypto_testsuite_params testsuite_params = { NULL };
-static struct crypto_unittest_params unittest_params;
-static int gbl_driver_id;
-
-static int
-testsuite_setup(void)
-{
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct rte_cryptodev_info info;
-	unsigned i, nb_devs, valid_dev_id = 0;
-	int ret;
-	uint16_t qp_id;
-
-	ts_params->mbuf_mp = rte_mempool_lookup("CRYPTO_PERF_MBUFPOOL");
-	if (ts_params->mbuf_mp == NULL) {
-		/* Not already created so create */
-		ts_params->mbuf_mp = rte_pktmbuf_pool_create(
-				"CRYPTO_PERF_MBUFPOOL",
-				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
-				rte_socket_id());
-		if (ts_params->mbuf_mp == NULL) {
-			RTE_LOG(ERR, USER1, "Can't create CRYPTO_PERF_MBUFPOOL\n");
-			return TEST_FAILED;
-		}
-	}
-
-
-	ts_params->op_mpool = rte_crypto_op_pool_create("CRYPTO_OP_POOL",
-			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
-			NUM_MBUFS, MBUF_CACHE_SIZE,
-			DEFAULT_NUM_XFORMS *
-			sizeof(struct rte_crypto_sym_xform) +
-			MAXIMUM_IV_LENGTH,
-			rte_socket_id());
-		if (ts_params->op_mpool == NULL) {
-			RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
-			return TEST_FAILED;
-		}
-
-	/* Create an AESNI MB device if required */
-	if (gbl_driver_id == rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
-		nb_devs = rte_cryptodev_device_count_by_driver(
-				rte_cryptodev_driver_id_get(
-				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
-		if (nb_devs < 1) {
-			ret = rte_vdev_init(
-				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
-
-			TEST_ASSERT(ret == 0,
-				"Failed to create instance of pmd : %s",
-				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
-		}
-	}
-
-	/* Create an AESNI GCM device if required */
-	if (gbl_driver_id == rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
-		nb_devs = rte_cryptodev_device_count_by_driver(
-				rte_cryptodev_driver_id_get(
-				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
-		if (nb_devs < 1) {
-			ret = rte_vdev_init(
-				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL);
-
-			TEST_ASSERT(ret == 0,
-				"Failed to create instance of pmd : %s",
-				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
-		}
-	}
-
-	/* Create a SNOW3G device if required */
-	if (gbl_driver_id == rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
-		nb_devs = rte_cryptodev_device_count_by_driver(
-				rte_cryptodev_driver_id_get(
-				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
-		if (nb_devs < 1) {
-			ret = rte_vdev_init(
-				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL);
-
-			TEST_ASSERT(ret == 0,
-				"Failed to create instance of pmd : %s",
-				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
-		}
-	}
-
-	/* Create an OPENSSL device if required */
-	if (gbl_driver_id == rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
-		nb_devs = rte_cryptodev_device_count_by_driver(
-				rte_cryptodev_driver_id_get(
-				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
-		if (nb_devs < 1) {
-			ret = rte_vdev_init(
-				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
-				NULL);
-
-			TEST_ASSERT(ret == 0, "Failed to create "
-				"instance of pmd : %s",
-				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
-		}
-	}
-
-	/* Create an ARMv8 device if required */
-	if (gbl_driver_id == rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
-		nb_devs = rte_cryptodev_device_count_by_driver(
-				rte_cryptodev_driver_id_get(
-				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
-		if (nb_devs < 1) {
-			ret = rte_vdev_init(
-				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
-				NULL);
-
-			TEST_ASSERT(ret == 0, "Failed to create "
-				"instance of pmd : %s",
-				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
-		}
-	}
-
-	nb_devs = rte_cryptodev_count();
-	if (nb_devs < 1) {
-		RTE_LOG(ERR, USER1, "No crypto devices found?\n");
-		return TEST_FAILED;
-	}
-
-	/* Search for the first valid */
-	for (i = 0; i < nb_devs; i++) {
-		rte_cryptodev_info_get(i, &info);
-		if (info.driver_id == (uint8_t) gbl_driver_id) {
-			ts_params->dev_id = i;
-			valid_dev_id = 1;
-			break;
-		}
-	}
-
-	if (!valid_dev_id)
-		return TEST_FAILED;
-
-	/*
-	 * Using Crypto Device Id 0 by default.
-	 * Set up all the qps on this device
-	 */
-
-	rte_cryptodev_info_get(ts_params->dev_id, &info);
-
-	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
-	ts_params->conf.socket_id = SOCKET_ID_ANY;
-
-	unsigned int session_size = sizeof(struct rte_cryptodev_sym_session) +
-		rte_cryptodev_get_private_session_size(ts_params->dev_id);
-
-	ts_params->sess_mp = rte_mempool_create(
-				"test_sess_mp_perf",
-				info.sym.max_nb_sessions,
-				session_size,
-				0, 0, NULL, NULL, NULL,
-				NULL, SOCKET_ID_ANY,
-				0);
-
-	TEST_ASSERT_NOT_NULL(ts_params->sess_mp,
-			"session mempool allocation failed");
-
-	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->dev_id,
-			&ts_params->conf),
-			"Failed to configure cryptodev %u",
-			ts_params->dev_id);
-
-	ts_params->qp_conf.nb_descriptors = PERF_NUM_OPS_INFLIGHT;
-	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
-
-		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
-			ts_params->dev_id, qp_id,
-				&ts_params->qp_conf,
-				rte_cryptodev_socket_id(ts_params->dev_id),
-				ts_params->sess_mp),
-				"Failed to setup queue pair %u on cryptodev %u",
-				qp_id, ts_params->dev_id);
-	}
-
-	return TEST_SUCCESS;
-}
-static void
-testsuite_teardown(void)
-{
-	struct crypto_testsuite_params *ts_params =
-			&testsuite_params;
-
-	if (ts_params->mbuf_mp != NULL)
-		RTE_LOG(DEBUG, USER1, "CRYPTO_PERF_MBUFPOOL count %u\n",
-		rte_mempool_avail_count(ts_params->mbuf_mp));
-	if (ts_params->op_mpool != NULL)
-		RTE_LOG(DEBUG, USER1, "CRYPTO_PERF_OP POOL count %u\n",
-		rte_mempool_avail_count(ts_params->op_mpool));
-	/* Free session mempool */
-	if (ts_params->sess_mp != NULL) {
-		rte_mempool_free(ts_params->sess_mp);
-		ts_params->sess_mp = NULL;
-	}
-
-}
-
-static int
-ut_setup(void)
-{
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct crypto_unittest_params *ut_params = &unittest_params;
-
-	/* Clear unit test parameters before running test */
-	memset(ut_params, 0, sizeof(*ut_params));
-
-	rte_cryptodev_stats_reset(ts_params->dev_id);
-
-	/* Start the device */
-	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->dev_id),
-			"Failed to start cryptodev %u",
-			ts_params->dev_id);
-
-	return TEST_SUCCESS;
-}
-
-static void
-ut_teardown(void)
-{
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct crypto_unittest_params *ut_params = &unittest_params;
-	struct rte_cryptodev_stats stats;
-
-	unsigned i;
-
-	/* free crypto session structure */
-	if (ut_params->sess) {
-		rte_cryptodev_sym_session_clear(ts_params->dev_id,
-				ut_params->sess);
-		rte_cryptodev_sym_session_free(ut_params->sess);
-	}
-
-	/* free crypto operation structure */
-	if (ut_params->op)
-		rte_crypto_op_free(ut_params->op);
-
-	for (i = 0; i < MAX_NUM_OF_OPS_PER_UT; i++) {
-		if (ut_params->obuf[i])
-			rte_pktmbuf_free(ut_params->obuf[i]);
-		else if (ut_params->ibuf[i])
-			rte_pktmbuf_free(ut_params->ibuf[i]);
-	}
-
-	if (ts_params->mbuf_mp != NULL)
-		RTE_LOG(DEBUG, USER1, "CRYPTO_PERF_MBUFPOOL count %u\n",
-			rte_mempool_avail_count(ts_params->mbuf_mp));
-
-	rte_cryptodev_stats_get(ts_params->dev_id, &stats);
-
-	/* Stop the device */
-	rte_cryptodev_stop(ts_params->dev_id);
-}
-
-const char plaintext_quote[] =
-		"THE COUNT OF MONTE CRISTO by Alexandre Dumas, Pere Chapter 1. "
-		"Marseilles--The Arrival. On the 24th of February, 1815, the "
-		"look-out at Notre-Dame de la Garde signalled the three-master,"
-		" the Pharaon from Smyrna, Trieste, and Naples. As usual, a "
-		"pilot put off immediately, and rounding the Chateau d'If, got "
-		"on board the vessel between Cape Morgion and Rion island. "
-		"Immediately, and according to custom, the ramparts of Fort "
-		"Saint-Jean were covered with spectators; it is always an event "
-		"at Marseilles for a ship to come into port, especially when "
-		"this ship, like the Pharaon, has been built, rigged, and laden"
-		" at the old Phocee docks, and belongs to an owner of the city."
-		" The ship drew on and had safely passed the strait, which some"
-		" volcanic shock has made between the Calasareigne and Jaros "
-		"islands; had doubled Pomegue, and approached the harbor under"
-		" topsails, jib, and spanker, but so slowly and sedately that"
-		" the idlers, with that instinct which is the forerunner of "
-		"evil, asked one another what misfortune could have happened "
-		"on board. However, those experienced in navigation saw plainly"
-		" that if any accident had occurred, it was not to the vessel "
-		"herself, for she bore down with all the evidence of being "
-		"skilfully handled, the anchor a-cockbill, the jib-boom guys "
-		"already eased off, and standing by the side of the pilot, who"
-		" was steering the Pharaon towards the narrow entrance of the"
-		" inner port, was a young man, who, with activity and vigilant"
-		" eye, watched every motion of the ship, and repeated each "
-		"direction of the pilot. The vague disquietude which prevailed "
-		"among the spectators had so much affected one of the crowd "
-		"that he did not await the arrival of the vessel in harbor, but"
-		" jumping into a small skiff, desired to be pulled alongside "
-		"the Pharaon, which he reached as she rounded into La Reserve "
-		"basin. When the young man on board saw this person approach, "
-		"he left his station by the pilot, and, hat in hand, leaned "
-		"over the ship's bulwarks. He was a fine, tall, slim young "
-		"fellow of eighteen or twenty, with black eyes, and hair as "
-		"dark as a raven's wing; and his whole appearance bespoke that "
-		"calmness and resolution peculiar to men accustomed from their "
-		"cradle to contend with danger. \"Ah, is it you, Dantes?\" "
-		"cried the man in the skiff. \"What's the matter? and why have "
-		"you such an air of sadness aboard?\" \"A great misfortune, M. "
-		"Morrel,\" replied the young man,--\"a great misfortune, for me"
-		" especially! Off Civita Vecchia we lost our brave Captain "
-		"Leclere.\" \"And the cargo?\" inquired the owner, eagerly. "
-		"\"Is all safe, M. Morrel; and I think you will be satisfied on"
-		" that head. But poor Captain Leclere--\" \"What happened to "
-		"him?\" asked the owner, with an air of considerable "
-		"resignation. \"What happened to the worthy captain?\" \"He "
-		"died.\" \"Fell into the sea?\" \"No, sir, he died of "
-		"brain-fever in dreadful agony.\" Then turning to the crew, "
-		"he said, \"Bear a hand there, to take in sail!\" All hands "
-		"obeyed, and at once the eight or ten seamen who composed the "
-		"crew, sprang to their respective stations at the spanker "
-		"brails and outhaul, topsail sheets and halyards, the jib "
-		"downhaul, and the topsail clewlines and buntlines. The young "
-		"sailor gave a look to see that his orders were promptly and "
-		"accurately obeyed, and then turned again to the owner. \"And "
-		"how did this misfortune occur?\" inquired the latter, resuming"
-		" the interrupted conversation. \"Alas, sir, in the most "
-		"unexpected manner. After a long talk with the harbor-master, "
-		"Captain Leclere left Naples greatly disturbed in mind. In "
-		"twenty-four hours he was attacked by a fever, and died three "
-		"days afterwards. We performed the usual burial service, and he"
-		" is at his rest, sewn up in his hammock with a thirty-six "
-		"pound shot at his head and his heels, off El Giglio island. "
-		"We bring to his widow his sword and cross of honor. It was "
-		"worth while, truly,\" added the young man with a melancholy "
-		"smile, \"to make war against the English for ten years, and "
-		"to die in his bed at last, like everybody else.";
-
-#define QUOTE_LEN_64B		(64)
-#define QUOTE_LEN_128B		(128)
-#define QUOTE_LEN_256B		(256)
-#define QUOTE_LEN_512B		(512)
-#define QUOTE_LEN_768B		(768)
-#define QUOTE_LEN_1024B		(1024)
-#define QUOTE_LEN_1280B		(1280)
-#define QUOTE_LEN_1536B		(1536)
-#define QUOTE_LEN_1792B		(1792)
-#define QUOTE_LEN_2048B		(2048)
-
-
-/* ***** AES-CBC / HMAC-SHA256 Performance Tests ***** */
-
-#define HMAC_KEY_LENGTH_SHA256	(DIGEST_BYTE_LENGTH_SHA256)
-
-#define CIPHER_KEY_LENGTH_AES_CBC	(16)
-#define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
-
-static uint8_t aes_cbc_128_key[] = {
-		0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
-		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA };
-
-static uint8_t aes_cbc_128_iv[] = {
-		0xf5, 0xd3, 0x89, 0x0f, 0x47, 0x00, 0xcb, 0x52,
-		0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1 };
-
-static uint8_t hmac_sha256_key[] = {
-		0xff, 0xcb, 0x37, 0x30, 0x1d, 0x4a, 0xc2, 0x41,
-		0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A,
-		0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
-		0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60 };
-
-
-/* Cipher text output */
-
-static const uint8_t AES_CBC_ciphertext_64B[] = {
-		0x05, 0x15, 0x77, 0x32, 0xc9, 0x66, 0x91, 0x50,
-		0x93, 0x9f, 0xbb, 0x4e, 0x2e, 0x5a, 0x02, 0xd0,
-		0x2d, 0x9d, 0x31, 0x5d, 0xc8, 0x9e, 0x86, 0x36,
-		0x54, 0x5c, 0x50, 0xe8, 0x75, 0x54, 0x74, 0x5e,
-		0xd5, 0xa2, 0x84, 0x21, 0x2d, 0xc5, 0xf8, 0x1c,
-		0x55, 0x1a, 0xba, 0x91, 0xce, 0xb5, 0xa3, 0x1e,
-		0x31, 0xbf, 0xe9, 0xa1, 0x97, 0x5c, 0x2b, 0xd6,
-		0x57, 0xa5, 0x9f, 0xab, 0xbd, 0xb0, 0x9b, 0x9c
-};
-
-static const uint8_t AES_CBC_ciphertext_128B[] = {
-		0x79, 0x92, 0x65, 0xc8, 0xfb, 0x0a, 0xc7, 0xc4,
-		0x9b, 0x3b, 0xbe, 0x69, 0x7f, 0x7c, 0xf4, 0x4e,
-		0xa5, 0x0d, 0xf6, 0x33, 0xc4, 0xdf, 0xf3, 0x0d,
-		0xdb, 0xb9, 0x68, 0x34, 0xb0, 0x0d, 0xbd, 0xb9,
-		0xa7, 0xf3, 0x86, 0x50, 0x2a, 0xbe, 0x50, 0x5d,
-		0xb3, 0xbe, 0x72, 0xf9, 0x02, 0xb1, 0x69, 0x0b,
-		0x8c, 0x96, 0x4c, 0x3c, 0x0c, 0x1e, 0x76, 0xe5,
-		0x7e, 0x75, 0xdd, 0xd0, 0xa9, 0x75, 0x00, 0x13,
-		0x6b, 0x1e, 0xc0, 0xad, 0xfc, 0x03, 0xb5, 0x99,
-		0xdc, 0x37, 0x35, 0xfc, 0x16, 0x34, 0xfd, 0xb4,
-		0xea, 0x1e, 0xb6, 0x51, 0xdf, 0xab, 0x87, 0xd6,
-		0x87, 0x41, 0xfa, 0x1c, 0xc6, 0x78, 0xa6, 0x3c,
-		0x1d, 0x76, 0xfe, 0xff, 0x65, 0xfc, 0x63, 0x1e,
-		0x1f, 0xe2, 0x7c, 0x9b, 0xa2, 0x72, 0xc3, 0x34,
-		0x23, 0xdf, 0x01, 0xf0, 0xfd, 0x02, 0x8b, 0x97,
-		0x00, 0x2b, 0x97, 0x4e, 0xab, 0x98, 0x21, 0x3c
-};
-
-static const uint8_t AES_CBC_ciphertext_256B[] = {
-		0xc7, 0x71, 0x2b, 0xed, 0x2c, 0x97, 0x59, 0xfa,
-		0xcf, 0x5a, 0xb9, 0x31, 0x92, 0xe0, 0xc9, 0x92,
-		0xc0, 0x2d, 0xd5, 0x9c, 0x84, 0xbf, 0x70, 0x36,
-		0x13, 0x48, 0xe0, 0xb1, 0xbf, 0x6c, 0xcd, 0x91,
-		0xa0, 0xc3, 0x57, 0x6c, 0x3f, 0x0e, 0x34, 0x41,
-		0xe7, 0x9c, 0xc0, 0xec, 0x18, 0x0c, 0x05, 0x52,
-		0x78, 0xe2, 0x3c, 0x6e, 0xdf, 0xa5, 0x49, 0xc7,
-		0xf2, 0x55, 0x00, 0x8f, 0x65, 0x6d, 0x4b, 0xd0,
-		0xcb, 0xd4, 0xd2, 0x0b, 0xea, 0xf4, 0xb0, 0x85,
-		0x61, 0x9e, 0x36, 0xc0, 0x71, 0xb7, 0x80, 0xad,
-		0x40, 0x78, 0xb4, 0x70, 0x2b, 0xe8, 0x80, 0xc5,
-		0x19, 0x35, 0x96, 0x55, 0x3b, 0x40, 0x03, 0xbb,
-		0x9f, 0xa6, 0xc2, 0x82, 0x92, 0x04, 0xc3, 0xa6,
-		0x96, 0xc4, 0x7f, 0x4c, 0x3e, 0x3c, 0x79, 0x82,
-		0x88, 0x8b, 0x3f, 0x8b, 0xc5, 0x9f, 0x44, 0xbe,
-		0x71, 0xe7, 0x09, 0xa2, 0x40, 0xa2, 0x23, 0x4e,
-		0x9f, 0x31, 0xab, 0x6f, 0xdf, 0x59, 0x40, 0xe1,
-		0x12, 0x15, 0x55, 0x4b, 0xea, 0x3f, 0xa1, 0x41,
-		0x4f, 0xaf, 0xcd, 0x27, 0x2a, 0x61, 0xa1, 0x9e,
-		0x82, 0x30, 0x05, 0x05, 0x55, 0xce, 0x99, 0xd3,
-		0x8f, 0x3f, 0x86, 0x79, 0xdc, 0x9f, 0x33, 0x07,
-		0x75, 0x26, 0xc8, 0x72, 0x81, 0x0f, 0x9b, 0xf7,
-		0xb1, 0xfb, 0xd3, 0x91, 0x36, 0x08, 0xab, 0x26,
-		0x70, 0x53, 0x0c, 0x99, 0xfd, 0xa9, 0x07, 0xb4,
-		0xe9, 0xce, 0xc1, 0xd6, 0xd2, 0x2c, 0x71, 0x80,
-		0xec, 0x59, 0x61, 0x0b, 0x24, 0xf0, 0x6d, 0x33,
-		0x73, 0x45, 0x6e, 0x80, 0x03, 0x45, 0xf2, 0x76,
-		0xa5, 0x8a, 0xc9, 0xcf, 0xaf, 0x4a, 0xed, 0x35,
-		0xc0, 0x97, 0x52, 0xc5, 0x00, 0xdf, 0xef, 0xc7,
-		0x9f, 0xf2, 0xe8, 0x15, 0x3e, 0xb3, 0x30, 0xe7,
-		0x00, 0xd0, 0x4e, 0xeb, 0x79, 0xf6, 0xf6, 0xcf,
-		0xf0, 0xe7, 0x61, 0xd5, 0x3d, 0x6a, 0x73, 0x9d
-};
-
-static const uint8_t AES_CBC_ciphertext_512B[] = {
-		0xb4, 0xc6, 0xc6, 0x5f, 0x7e, 0xca, 0x05, 0x70,
-		0x21, 0x7b, 0x92, 0x9e, 0x23, 0xe7, 0x92, 0xb8,
-		0x27, 0x3d, 0x20, 0x29, 0x57, 0xfa, 0x1f, 0x26,
-		0x0a, 0x04, 0x34, 0xa6, 0xf2, 0xdc, 0x44, 0xb6,
-		0x43, 0x40, 0x62, 0xde, 0x0c, 0xde, 0x1c, 0x30,
-		0x43, 0x85, 0x0b, 0xe8, 0x93, 0x1f, 0xa1, 0x2a,
-		0x8a, 0x27, 0x35, 0x39, 0x14, 0x9f, 0x37, 0x64,
-		0x59, 0xb5, 0x0e, 0x96, 0x82, 0x5d, 0x63, 0x45,
-		0xd6, 0x93, 0x89, 0x46, 0xe4, 0x71, 0x31, 0xeb,
-		0x0e, 0xd1, 0x7b, 0xda, 0x90, 0xb5, 0x81, 0xac,
-		0x76, 0x54, 0x54, 0x85, 0x0b, 0xa9, 0x46, 0x9c,
-		0xf0, 0xfd, 0xde, 0x5d, 0xa8, 0xe3, 0xee, 0xe9,
-		0xf4, 0x9d, 0x34, 0x76, 0x39, 0xe7, 0xc3, 0x4a,
-		0x84, 0x38, 0x92, 0x61, 0xf1, 0x12, 0x9f, 0x05,
-		0xda, 0xdb, 0xc1, 0xd4, 0xb0, 0xa0, 0x27, 0x19,
-		0xa0, 0x56, 0x5d, 0x9b, 0xcc, 0x47, 0x7c, 0x15,
-		0x1d, 0x52, 0x66, 0xd5, 0xff, 0xef, 0x12, 0x23,
-		0x86, 0xe2, 0xee, 0x81, 0x2c, 0x3d, 0x7d, 0x28,
-		0xd5, 0x42, 0xdf, 0xdb, 0x75, 0x1c, 0xeb, 0xdf,
-		0x13, 0x23, 0xd5, 0x17, 0x89, 0xea, 0xd7, 0x01,
-		0xff, 0x57, 0x6a, 0x44, 0x61, 0xf4, 0xea, 0xbe,
-		0x97, 0x9b, 0xc2, 0xb1, 0x9c, 0x5d, 0xff, 0x4f,
-		0x73, 0x2d, 0x3f, 0x57, 0x28, 0x38, 0xbf, 0x3d,
-		0x9f, 0xda, 0x49, 0x55, 0x8f, 0xb2, 0x77, 0xec,
-		0x0f, 0xbc, 0xce, 0xb8, 0xc6, 0xe1, 0x03, 0xed,
-		0x35, 0x9c, 0xf2, 0x4d, 0xa4, 0x29, 0x6c, 0xd6,
-		0x6e, 0x05, 0x53, 0x46, 0xc1, 0x41, 0x09, 0x36,
-		0x0b, 0x7d, 0xf4, 0x9e, 0x0f, 0xba, 0x86, 0x33,
-		0xdd, 0xf1, 0xa7, 0xf7, 0xd5, 0x29, 0xa8, 0xa7,
-		0x4d, 0xce, 0x0c, 0xf5, 0xb4, 0x6c, 0xd8, 0x27,
-		0xb0, 0x87, 0x2a, 0x6f, 0x7f, 0x3f, 0x8f, 0xc3,
-		0xe2, 0x3e, 0x94, 0xcf, 0x61, 0x4a, 0x09, 0x3d,
-		0xf9, 0x55, 0x19, 0x31, 0xf2, 0xd2, 0x4a, 0x3e,
-		0xc1, 0xf5, 0xed, 0x7c, 0x45, 0xb0, 0x0c, 0x7b,
-		0xdd, 0xa6, 0x0a, 0x26, 0x66, 0xec, 0x85, 0x49,
-		0x00, 0x38, 0x05, 0x7c, 0x9c, 0x1c, 0x92, 0xf5,
-		0xf7, 0xdb, 0x5d, 0xbd, 0x61, 0x0c, 0xc9, 0xaf,
-		0xfd, 0x57, 0x3f, 0xee, 0x2b, 0xad, 0x73, 0xef,
-		0xa3, 0xc1, 0x66, 0x26, 0x44, 0x5e, 0xf9, 0x12,
-		0x86, 0x66, 0xa9, 0x61, 0x75, 0xa1, 0xbc, 0x40,
-		0x7f, 0xa8, 0x08, 0x02, 0xc0, 0x76, 0x0e, 0x76,
-		0xb3, 0x26, 0x3d, 0x1c, 0x40, 0x65, 0xe4, 0x18,
-		0x0f, 0x62, 0x17, 0x8f, 0x1e, 0x61, 0xb8, 0x08,
-		0x83, 0x54, 0x42, 0x11, 0x03, 0x30, 0x8e, 0xb7,
-		0xc1, 0x9c, 0xec, 0x69, 0x52, 0x95, 0xfb, 0x7b,
-		0x1a, 0x0c, 0x20, 0x24, 0xf7, 0xb8, 0x38, 0x0c,
-		0xb8, 0x7b, 0xb6, 0x69, 0x70, 0xd0, 0x61, 0xb9,
-		0x70, 0x06, 0xc2, 0x5b, 0x20, 0x47, 0xf7, 0xd9,
-		0x32, 0xc2, 0xf2, 0x90, 0xb6, 0x4d, 0xcd, 0x3c,
-		0x6d, 0x74, 0xea, 0x82, 0x35, 0x1b, 0x08, 0x44,
-		0xba, 0xb7, 0x33, 0x82, 0x33, 0x27, 0x54, 0x77,
-		0x6e, 0x58, 0xfe, 0x46, 0x5a, 0xb4, 0x88, 0x53,
-		0x8d, 0x9b, 0xb1, 0xab, 0xdf, 0x04, 0xe1, 0xfb,
-		0xd7, 0x1e, 0xd7, 0x38, 0x64, 0x54, 0xba, 0xb0,
-		0x6c, 0x84, 0x7a, 0x0f, 0xa7, 0x80, 0x6b, 0x86,
-		0xd9, 0xc9, 0xc6, 0x31, 0x95, 0xfa, 0x8a, 0x2c,
-		0x14, 0xe1, 0x85, 0x66, 0x27, 0xfd, 0x63, 0x3e,
-		0xf0, 0xfa, 0x81, 0xc9, 0x89, 0x4f, 0xe2, 0x6a,
-		0x8c, 0x17, 0xb5, 0xc7, 0x9f, 0x5d, 0x3f, 0x6b,
-		0x3f, 0xcd, 0x13, 0x7a, 0x3c, 0xe6, 0x4e, 0xfa,
-		0x7a, 0x10, 0xb8, 0x7c, 0x40, 0xec, 0x93, 0x11,
-		0x1f, 0xd0, 0x9e, 0xc3, 0x56, 0xb9, 0xf5, 0x21,
-		0x18, 0x41, 0x31, 0xea, 0x01, 0x8d, 0xea, 0x1c,
-		0x95, 0x5e, 0x56, 0x33, 0xbc, 0x7a, 0x3f, 0x6f
-};
-
-static const uint8_t AES_CBC_ciphertext_768B[] = {
-		0x3e, 0x7f, 0x9e, 0x4c, 0x88, 0x15, 0x68, 0x69,
-		0x10, 0x09, 0xe1, 0xa7, 0x0f, 0x27, 0x88, 0x2d,
-		0x90, 0x73, 0x4f, 0x67, 0xd3, 0x8b, 0xaf, 0xa1,
-		0x2c, 0x37, 0xa5, 0x6c, 0x7c, 0xbd, 0x95, 0x4c,
-		0x82, 0xcf, 0x05, 0x49, 0x16, 0x5c, 0xe7, 0x06,
-		0xd4, 0xcb, 0x55, 0x65, 0x9a, 0xd0, 0xe1, 0x46,
-		0x3a, 0x37, 0x71, 0xad, 0xb0, 0xb4, 0x99, 0x1e,
-		0x23, 0x57, 0x48, 0x96, 0x9c, 0xc5, 0xc4, 0xdb,
-		0x64, 0x3e, 0xc9, 0x7f, 0x90, 0x5a, 0xa0, 0x08,
-		0x75, 0x4c, 0x09, 0x06, 0x31, 0x6e, 0x59, 0x29,
-		0xfc, 0x2f, 0x72, 0xde, 0xf2, 0x40, 0x5a, 0xfe,
-		0xd3, 0x66, 0x64, 0xb8, 0x9c, 0xc9, 0xa6, 0x1f,
-		0xc3, 0x52, 0xcd, 0xb5, 0xd1, 0x4f, 0x43, 0x3f,
-		0xf4, 0x59, 0x25, 0xc4, 0xdd, 0x3e, 0x58, 0x7c,
-		0x21, 0xd6, 0x21, 0xce, 0xa4, 0xbe, 0x08, 0x23,
-		0x46, 0x68, 0xc0, 0x00, 0x91, 0x47, 0xca, 0x9b,
-		0xe0, 0xb4, 0xe3, 0xab, 0xbf, 0xcf, 0x68, 0x26,
-		0x97, 0x23, 0x09, 0x93, 0x64, 0x8f, 0x57, 0x59,
-		0xe2, 0x41, 0x7c, 0xa2, 0x48, 0x7e, 0xd5, 0x2c,
-		0x54, 0x09, 0x1b, 0x07, 0x94, 0xca, 0x39, 0x83,
-		0xdd, 0xf4, 0x7a, 0x1d, 0x2d, 0xdd, 0x67, 0xf7,
-		0x3c, 0x30, 0x89, 0x3e, 0xc1, 0xdc, 0x1d, 0x8f,
-		0xfc, 0xb1, 0xe9, 0x13, 0x31, 0xb0, 0x16, 0xdb,
-		0x88, 0xf2, 0x32, 0x7e, 0x73, 0xa3, 0xdf, 0x08,
-		0x6b, 0x53, 0x92, 0x08, 0xc9, 0x9d, 0x98, 0xb2,
-		0xf4, 0x8c, 0xb1, 0x95, 0xdc, 0xb6, 0xfc, 0xec,
-		0xf1, 0xc9, 0x0d, 0x6d, 0x42, 0x2c, 0xf5, 0x38,
-		0x29, 0xf4, 0xd8, 0x98, 0x0f, 0xb0, 0x81, 0xa5,
-		0xaa, 0xe6, 0x1f, 0x6e, 0x87, 0x32, 0x1b, 0x02,
-		0x07, 0x57, 0x38, 0x83, 0xf3, 0xe4, 0x54, 0x7c,
-		0xa8, 0x43, 0xdf, 0x3f, 0x42, 0xfd, 0x67, 0x28,
-		0x06, 0x4d, 0xea, 0xce, 0x1f, 0x84, 0x4a, 0xcd,
-		0x8c, 0x61, 0x5e, 0x8f, 0x61, 0xed, 0x84, 0x03,
-		0x53, 0x6a, 0x9e, 0xbf, 0x68, 0x83, 0xa7, 0x42,
-		0x56, 0x57, 0xcd, 0x45, 0x29, 0xfc, 0x7b, 0x07,
-		0xfc, 0xe9, 0xb9, 0x42, 0xfd, 0x29, 0xd5, 0xfd,
-		0x98, 0x11, 0xd1, 0x8d, 0x67, 0x29, 0x47, 0x61,
-		0xd8, 0x27, 0x37, 0x79, 0x29, 0xd1, 0x94, 0x6f,
-		0x8d, 0xf3, 0x1b, 0x3d, 0x6a, 0xb1, 0x59, 0xef,
-		0x1b, 0xd4, 0x70, 0x0e, 0xac, 0xab, 0xa0, 0x2b,
-		0x1f, 0x5e, 0x04, 0xf0, 0x0e, 0x35, 0x72, 0x90,
-		0xfc, 0xcf, 0x86, 0x43, 0xea, 0x45, 0x6d, 0x22,
-		0x63, 0x06, 0x1a, 0x58, 0xd7, 0x2d, 0xc5, 0xb0,
-		0x60, 0x69, 0xe8, 0x53, 0xc2, 0xa2, 0x57, 0x83,
-		0xc4, 0x31, 0xb4, 0xc6, 0xb3, 0xa1, 0x77, 0xb3,
-		0x1c, 0xca, 0x89, 0x3f, 0xf5, 0x10, 0x3b, 0x36,
-		0x31, 0x7d, 0x00, 0x46, 0x00, 0x92, 0xa0, 0xa0,
-		0x34, 0xd8, 0x5e, 0x62, 0xa9, 0xe0, 0x23, 0x37,
-		0x50, 0x85, 0xc7, 0x3a, 0x20, 0xa3, 0x98, 0xc0,
-		0xac, 0x20, 0x06, 0x0f, 0x17, 0x3c, 0xfc, 0x43,
-		0x8c, 0x9d, 0xec, 0xf5, 0x9a, 0x35, 0x96, 0xf7,
-		0xb7, 0x4c, 0xf9, 0x69, 0xf8, 0xd4, 0x1e, 0x9e,
-		0xf9, 0x7c, 0xc4, 0xd2, 0x11, 0x14, 0x41, 0xb9,
-		0x89, 0xd6, 0x07, 0xd2, 0x37, 0x07, 0x5e, 0x5e,
-		0xae, 0x60, 0xdc, 0xe4, 0xeb, 0x38, 0x48, 0x6d,
-		0x95, 0x8d, 0x71, 0xf2, 0xba, 0xda, 0x5f, 0x08,
-		0x9d, 0x4a, 0x0f, 0x56, 0x90, 0x64, 0xab, 0xb6,
-		0x88, 0x22, 0xa8, 0x90, 0x1f, 0x76, 0x2c, 0x83,
-		0x43, 0xce, 0x32, 0x55, 0x45, 0x84, 0x57, 0x43,
-		0xf9, 0xa8, 0xd1, 0x4f, 0xe3, 0xc1, 0x72, 0x9c,
-		0xeb, 0x64, 0xf7, 0xe4, 0x61, 0x2b, 0x93, 0xd1,
-		0x1f, 0xbb, 0x5c, 0xff, 0xa1, 0x59, 0x69, 0xcf,
-		0xf7, 0xaf, 0x58, 0x45, 0xd5, 0x3e, 0x98, 0x7d,
-		0x26, 0x39, 0x5c, 0x75, 0x3c, 0x4a, 0xbf, 0x5e,
-		0x12, 0x10, 0xb0, 0x93, 0x0f, 0x86, 0x82, 0xcf,
-		0xb2, 0xec, 0x70, 0x5c, 0x0b, 0xad, 0x5d, 0x63,
-		0x65, 0x32, 0xa6, 0x04, 0x58, 0x03, 0x91, 0x2b,
-		0xdb, 0x8f, 0xd3, 0xa3, 0x2b, 0x3a, 0xf5, 0xa1,
-		0x62, 0x6c, 0xb6, 0xf0, 0x13, 0x3b, 0x8c, 0x07,
-		0x10, 0x82, 0xc9, 0x56, 0x24, 0x87, 0xfc, 0x56,
-		0xe8, 0xef, 0x90, 0x8b, 0xd6, 0x48, 0xda, 0x53,
-		0x04, 0x49, 0x41, 0xa4, 0x67, 0xe0, 0x33, 0x24,
-		0x6b, 0x9c, 0x07, 0x55, 0x4c, 0x5d, 0xe9, 0x35,
-		0xfa, 0xbd, 0xea, 0xa8, 0x3f, 0xe9, 0xf5, 0x20,
-		0x5c, 0x60, 0x0f, 0x0d, 0x24, 0xcb, 0x1a, 0xd6,
-		0xe8, 0x5c, 0xa8, 0x42, 0xae, 0xd0, 0xd2, 0xf2,
-		0xa8, 0xbe, 0xea, 0x0f, 0x8d, 0xfb, 0x81, 0xa3,
-		0xa4, 0xef, 0xb7, 0x3e, 0x91, 0xbd, 0x26, 0x0f,
-		0x8e, 0xf1, 0xb2, 0xa5, 0x47, 0x06, 0xfa, 0x40,
-		0x8b, 0x31, 0x7a, 0x5a, 0x74, 0x2a, 0x0a, 0x7c,
-		0x62, 0x5d, 0x39, 0xa4, 0xae, 0x14, 0x85, 0x08,
-		0x5b, 0x20, 0x85, 0xf1, 0x57, 0x6e, 0x71, 0x13,
-		0x4e, 0x2b, 0x49, 0x87, 0x01, 0xdf, 0x37, 0xed,
-		0x28, 0xee, 0x4d, 0xa1, 0xf4, 0xb3, 0x3b, 0xba,
-		0x2d, 0xb3, 0x46, 0x17, 0x84, 0x80, 0x9d, 0xd7,
-		0x93, 0x1f, 0x28, 0x7c, 0xf5, 0xf9, 0xd6, 0x85,
-		0x8c, 0xa5, 0x44, 0xe9, 0x2c, 0x65, 0x51, 0x5f,
-		0x53, 0x7a, 0x09, 0xd9, 0x30, 0x16, 0x95, 0x89,
-		0x9c, 0x0b, 0xef, 0x90, 0x6d, 0x23, 0xd3, 0x48,
-		0x57, 0x3b, 0x55, 0x69, 0x96, 0xfc, 0xf7, 0x52,
-		0x92, 0x38, 0x36, 0xbf, 0xa9, 0x0a, 0xbb, 0x68,
-		0x45, 0x08, 0x25, 0xee, 0x59, 0xfe, 0xee, 0xf2,
-		0x2c, 0xd4, 0x5f, 0x78, 0x59, 0x0d, 0x90, 0xf1,
-		0xd7, 0xe4, 0x39, 0x0e, 0x46, 0x36, 0xf5, 0x75,
-		0x03, 0x3c, 0x28, 0xfb, 0xfa, 0x8f, 0xef, 0xc9,
-		0x61, 0x00, 0x94, 0xc3, 0xd2, 0x0f, 0xd9, 0xda
-};
-
-static const uint8_t AES_CBC_ciphertext_1024B[] = {
-		0x7d, 0x01, 0x7e, 0x2f, 0x92, 0xb3, 0xea, 0x72,
-		0x4a, 0x3f, 0x10, 0xf9, 0x2b, 0xb0, 0xd5, 0xb9,
-		0x19, 0x68, 0x94, 0xe9, 0x93, 0xe9, 0xd5, 0x26,
-		0x20, 0x44, 0xe2, 0x47, 0x15, 0x8d, 0x75, 0x48,
-		0x8e, 0xe4, 0x40, 0x81, 0xb5, 0x06, 0xa8, 0xb8,
-		0x0e, 0x0f, 0x3b, 0xbc, 0x5b, 0xbe, 0x3b, 0xa2,
-		0x2a, 0x0c, 0x48, 0x98, 0x19, 0xdf, 0xe9, 0x25,
-		0x75, 0xab, 0x93, 0x44, 0xb1, 0x72, 0x70, 0xbb,
-		0x20, 0xcf, 0x78, 0xe9, 0x4d, 0xc6, 0xa9, 0xa9,
-		0x84, 0x78, 0xc5, 0xc0, 0xc4, 0xc9, 0x79, 0x1a,
-		0xbc, 0x61, 0x25, 0x5f, 0xac, 0x01, 0x03, 0xb7,
-		0xef, 0x07, 0xf2, 0x62, 0x98, 0xee, 0xe3, 0xad,
-		0x94, 0x75, 0x30, 0x67, 0xb9, 0x15, 0x00, 0xe7,
-		0x11, 0x32, 0x2e, 0x6b, 0x55, 0x9f, 0xac, 0x68,
-		0xde, 0x61, 0x05, 0x80, 0x01, 0xf3, 0xad, 0xab,
-		0xaf, 0x45, 0xe0, 0xf4, 0x68, 0x5c, 0xc0, 0x52,
-		0x92, 0xc8, 0x21, 0xb6, 0xf5, 0x8a, 0x1d, 0xbb,
-		0xfc, 0x4a, 0x11, 0x62, 0xa2, 0xc4, 0xf1, 0x2d,
-		0x0e, 0xb2, 0xc7, 0x17, 0x34, 0xb4, 0x2a, 0x54,
-		0x81, 0xc2, 0x1e, 0xcf, 0x51, 0x0a, 0x76, 0x54,
-		0xf1, 0x48, 0x0d, 0x5c, 0xcd, 0x38, 0x3e, 0x38,
-		0x3e, 0xf8, 0x46, 0x1d, 0x00, 0xf5, 0x62, 0xe1,
-		0x5c, 0xb7, 0x8d, 0xce, 0xd0, 0x3f, 0xbb, 0x22,
-		0xf1, 0xe5, 0xb1, 0xa0, 0x58, 0x5e, 0x3c, 0x0f,
-		0x15, 0xd1, 0xac, 0x3e, 0xc7, 0x72, 0xc4, 0xde,
-		0x8b, 0x95, 0x3e, 0x91, 0xf7, 0x1d, 0x04, 0x9a,
-		0xc8, 0xe4, 0xbf, 0xd3, 0x22, 0xca, 0x4a, 0xdc,
-		0xb6, 0x16, 0x79, 0x81, 0x75, 0x2f, 0x6b, 0xa7,
-		0x04, 0x98, 0xa7, 0x4e, 0xc1, 0x19, 0x90, 0x33,
-		0x33, 0x3c, 0x7f, 0xdd, 0xac, 0x09, 0x0c, 0xc3,
-		0x91, 0x34, 0x74, 0xab, 0xa5, 0x35, 0x0a, 0x13,
-		0xc3, 0x56, 0x67, 0x6d, 0x1a, 0x3e, 0xbf, 0x56,
-		0x06, 0x67, 0x15, 0x5f, 0xfc, 0x8b, 0xa2, 0x3c,
-		0x5e, 0xaf, 0x56, 0x1f, 0xe3, 0x2e, 0x9d, 0x0a,
-		0xf9, 0x9b, 0xc7, 0xb5, 0x03, 0x1c, 0x68, 0x99,
-		0xfa, 0x3c, 0x37, 0x59, 0xc1, 0xf7, 0x6a, 0x83,
-		0x22, 0xee, 0xca, 0x7f, 0x7d, 0x49, 0xe6, 0x48,
-		0x84, 0x54, 0x7a, 0xff, 0xb3, 0x72, 0x21, 0xd8,
-		0x7a, 0x5d, 0xb1, 0x4b, 0xcc, 0x01, 0x6f, 0x90,
-		0xc6, 0x68, 0x1c, 0x2c, 0xa1, 0xe2, 0x74, 0x40,
-		0x26, 0x9b, 0x57, 0x53, 0xa3, 0x7c, 0x0b, 0x0d,
-		0xcf, 0x05, 0x5d, 0x62, 0x4f, 0x75, 0x06, 0x62,
-		0x1f, 0x26, 0x32, 0xaa, 0x25, 0xcc, 0x26, 0x8d,
-		0xae, 0x01, 0x47, 0xa3, 0x00, 0x42, 0xe2, 0x4c,
-		0xee, 0x29, 0xa2, 0x81, 0xa0, 0xfd, 0xeb, 0xff,
-		0x9a, 0x66, 0x6e, 0x47, 0x5b, 0xab, 0x93, 0x5a,
-		0x02, 0x6d, 0x6f, 0xf2, 0x6e, 0x02, 0x9d, 0xb1,
-		0xab, 0x56, 0xdc, 0x8b, 0x9b, 0x17, 0xa8, 0xfb,
-		0x87, 0x42, 0x7c, 0x91, 0x1e, 0x14, 0xc6, 0x6f,
-		0xdc, 0xf0, 0x27, 0x30, 0xfa, 0x3f, 0xc4, 0xad,
-		0x57, 0x85, 0xd2, 0xc9, 0x32, 0x2c, 0x13, 0xa6,
-		0x04, 0x04, 0x50, 0x05, 0x2f, 0x72, 0xd9, 0x44,
-		0x55, 0x6e, 0x93, 0x40, 0xed, 0x7e, 0xd4, 0x40,
-		0x3e, 0x88, 0x3b, 0x8b, 0xb6, 0xeb, 0xc6, 0x5d,
-		0x9c, 0x99, 0xa1, 0xcf, 0x30, 0xb2, 0xdc, 0x48,
-		0x8a, 0x01, 0xa7, 0x61, 0x77, 0x50, 0x14, 0xf3,
-		0x0c, 0x49, 0x53, 0xb3, 0xb4, 0xb4, 0x28, 0x41,
-		0x4a, 0x2d, 0xd2, 0x4d, 0x2a, 0x30, 0x31, 0x83,
-		0x03, 0x5e, 0xaa, 0xd3, 0xa3, 0xd1, 0xa1, 0xca,
-		0x62, 0xf0, 0xe1, 0xf2, 0xff, 0xf0, 0x19, 0xa6,
-		0xde, 0x22, 0x47, 0xb5, 0x28, 0x7d, 0xf7, 0x07,
-		0x16, 0x0d, 0xb1, 0x55, 0x81, 0x95, 0xe5, 0x1d,
-		0x4d, 0x78, 0xa9, 0x3e, 0xce, 0xe3, 0x1c, 0xf9,
-		0x47, 0xc8, 0xec, 0xc5, 0xc5, 0x93, 0x4c, 0x34,
-		0x20, 0x6b, 0xee, 0x9a, 0xe6, 0x86, 0x57, 0x58,
-		0xd5, 0x58, 0xf1, 0x33, 0x10, 0x29, 0x9e, 0x93,
-		0x2f, 0xf5, 0x90, 0x00, 0x17, 0x67, 0x4f, 0x39,
-		0x18, 0xe1, 0xcf, 0x55, 0x78, 0xbb, 0xe6, 0x29,
-		0x3e, 0x77, 0xd5, 0x48, 0xb7, 0x42, 0x72, 0x53,
-		0x27, 0xfa, 0x5b, 0xe0, 0x36, 0x14, 0x97, 0xb8,
-		0x9b, 0x3c, 0x09, 0x77, 0xc1, 0x0a, 0xe4, 0xa2,
-		0x63, 0xfc, 0xbe, 0x5c, 0x17, 0xcf, 0x01, 0xf5,
-		0x03, 0x0f, 0x17, 0xbc, 0x93, 0xdd, 0x5f, 0xe2,
-		0xf3, 0x08, 0xa8, 0xb1, 0x85, 0xb6, 0x34, 0x3f,
-		0x87, 0x42, 0xa5, 0x42, 0x3b, 0x0e, 0xd6, 0x83,
-		0x6a, 0xfd, 0x5d, 0xc9, 0x67, 0xd5, 0x51, 0xc9,
-		0x2a, 0x4e, 0x91, 0xb0, 0x59, 0xb2, 0x0f, 0xa2,
-		0xe6, 0x47, 0x73, 0xc2, 0xa2, 0xae, 0xbb, 0xc8,
-		0x42, 0xa3, 0x2a, 0x27, 0x29, 0x48, 0x8c, 0x54,
-		0x6c, 0xec, 0x00, 0x2a, 0x42, 0xa3, 0x7a, 0x0f,
-		0x12, 0x66, 0x6b, 0x96, 0xf6, 0xd0, 0x56, 0x4f,
-		0x49, 0x5c, 0x47, 0xec, 0x05, 0x62, 0x54, 0xb2,
-		0x64, 0x5a, 0x69, 0x1f, 0x19, 0xb4, 0x84, 0x5c,
-		0xbe, 0x48, 0x8e, 0xfc, 0x58, 0x21, 0xce, 0xfa,
-		0xaa, 0x84, 0xd2, 0xc1, 0x08, 0xb3, 0x87, 0x0f,
-		0x4f, 0xa3, 0x3a, 0xb6, 0x44, 0xbe, 0x2e, 0x9a,
-		0xdd, 0xb5, 0x44, 0x80, 0xca, 0xf4, 0xc3, 0x6e,
-		0xba, 0x93, 0x77, 0xe0, 0x53, 0xfb, 0x37, 0xfb,
-		0x88, 0xc3, 0x1f, 0x25, 0xde, 0x3e, 0x11, 0xf4,
-		0x89, 0xe7, 0xd1, 0x3b, 0xb4, 0x23, 0xcb, 0x70,
-		0xba, 0x35, 0x97, 0x7c, 0xbe, 0x84, 0x13, 0xcf,
-		0xe0, 0x4d, 0x33, 0x91, 0x71, 0x85, 0xbb, 0x4b,
-		0x97, 0x32, 0x5d, 0xa0, 0xb9, 0x8f, 0xdc, 0x27,
-		0x5a, 0xeb, 0x71, 0xf1, 0xd5, 0x0d, 0x65, 0xb4,
-		0x22, 0x81, 0xde, 0xa7, 0x58, 0x20, 0x0b, 0x18,
-		0x11, 0x76, 0x5c, 0xe6, 0x6a, 0x2c, 0x99, 0x69,
-		0xdc, 0xed, 0x67, 0x08, 0x5d, 0x5e, 0xe9, 0x1e,
-		0x55, 0x70, 0xc1, 0x5a, 0x76, 0x1b, 0x8d, 0x2e,
-		0x0d, 0xf9, 0xcc, 0x30, 0x8c, 0x44, 0x0f, 0x63,
-		0x8c, 0x42, 0x8a, 0x9f, 0x4c, 0xd1, 0x48, 0x28,
-		0x8a, 0xf5, 0x56, 0x2e, 0x23, 0x12, 0xfe, 0x67,
-		0x9a, 0x13, 0x65, 0x75, 0x83, 0xf1, 0x3c, 0x98,
-		0x07, 0x6b, 0xb7, 0x27, 0x5b, 0xf0, 0x70, 0xda,
-		0x30, 0xf8, 0x74, 0x4e, 0x7a, 0x32, 0x84, 0xcc,
-		0x0e, 0xcd, 0x80, 0x8b, 0x82, 0x31, 0x9a, 0x48,
-		0xcf, 0x75, 0x00, 0x1f, 0x4f, 0xe0, 0x8e, 0xa3,
-		0x6a, 0x2c, 0xd4, 0x73, 0x4c, 0x63, 0x7c, 0xa6,
-		0x4d, 0x5e, 0xfd, 0x43, 0x3b, 0x27, 0xe1, 0x5e,
-		0xa3, 0xa9, 0x5c, 0x3b, 0x60, 0xdd, 0xc6, 0x8d,
-		0x5a, 0xf1, 0x3e, 0x89, 0x4b, 0x24, 0xcf, 0x01,
-		0x3a, 0x2d, 0x44, 0xe7, 0xda, 0xe7, 0xa1, 0xac,
-		0x11, 0x05, 0x0c, 0xa9, 0x7a, 0x82, 0x8c, 0x5c,
-		0x29, 0x68, 0x9c, 0x73, 0x13, 0xcc, 0x67, 0x32,
-		0x11, 0x5e, 0xe5, 0xcc, 0x8c, 0xf5, 0xa7, 0x52,
-		0x83, 0x9a, 0x70, 0xef, 0xde, 0x55, 0x9c, 0xc7,
-		0x8a, 0xed, 0xad, 0x28, 0x4a, 0xc5, 0x92, 0x6d,
-		0x8e, 0x47, 0xca, 0xe3, 0xf8, 0x77, 0xb5, 0x26,
-		0x64, 0x84, 0xc2, 0xf1, 0xd7, 0xae, 0x0c, 0xb9,
-		0x39, 0x0f, 0x43, 0x6b, 0xe9, 0xe0, 0x09, 0x4b,
-		0xe5, 0xe3, 0x17, 0xa6, 0x68, 0x69, 0x46, 0xf4,
-		0xf0, 0x68, 0x7f, 0x2f, 0x1c, 0x7e, 0x4c, 0xd2,
-		0xb5, 0xc6, 0x16, 0x85, 0xcf, 0x02, 0x4c, 0x89,
-		0x0b, 0x25, 0xb0, 0xeb, 0xf3, 0x77, 0x08, 0x6a,
-		0x46, 0x5c, 0xf6, 0x2f, 0xf1, 0x24, 0xc3, 0x4d,
-		0x80, 0x60, 0x4d, 0x69, 0x98, 0xde, 0xc7, 0xa1,
-		0xf6, 0x4e, 0x18, 0x0c, 0x2a, 0xb0, 0xb2, 0xe0,
-		0x46, 0xe7, 0x49, 0x37, 0xc8, 0x5a, 0x23, 0x24,
-		0xe3, 0x0f, 0xcc, 0x92, 0xb4, 0x8d, 0xdc, 0x9e
-};
-
-static const uint8_t AES_CBC_ciphertext_1280B[] = {
-		0x91, 0x99, 0x5e, 0x9e, 0x84, 0xff, 0x59, 0x45,
-		0xc1, 0xf4, 0xbc, 0x9c, 0xb9, 0x30, 0x6c, 0x51,
-		0x73, 0x52, 0xb4, 0x44, 0x09, 0x79, 0xe2, 0x89,
-		0x75, 0xeb, 0x54, 0x26, 0xce, 0xd8, 0x24, 0x98,
-		0xaa, 0xf8, 0x13, 0x16, 0x68, 0x58, 0xc4, 0x82,
-		0x0e, 0x31, 0xd3, 0x6a, 0x13, 0x58, 0x31, 0xe9,
-		0x3a, 0xc1, 0x8b, 0xc5, 0x3f, 0x50, 0x42, 0xd1,
-		0x93, 0xe4, 0x9b, 0x65, 0x2b, 0xf4, 0x1d, 0x9e,
-		0x2d, 0xdb, 0x48, 0xef, 0x9a, 0x01, 0x68, 0xb6,
-		0xea, 0x7a, 0x2b, 0xad, 0xfe, 0x77, 0x44, 0x7e,
-		0x5a, 0xc5, 0x64, 0xb4, 0xfe, 0x5c, 0x80, 0xf3,
-		0x20, 0x7e, 0xaf, 0x5b, 0xf8, 0xd1, 0x38, 0xa0,
-		0x8d, 0x09, 0x77, 0x06, 0xfe, 0xf5, 0xf4, 0xe4,
-		0xee, 0xb8, 0x95, 0x27, 0xed, 0x07, 0xb8, 0xaa,
-		0x25, 0xb4, 0xe1, 0x4c, 0xeb, 0x3f, 0xdb, 0x39,
-		0x66, 0x28, 0x1b, 0x60, 0x42, 0x8b, 0x99, 0xd9,
-		0x49, 0xd6, 0x8c, 0xa4, 0x9d, 0xd8, 0x93, 0x58,
-		0x8f, 0xfa, 0xd3, 0xf7, 0x37, 0x9c, 0x88, 0xab,
-		0x16, 0x50, 0xfe, 0x01, 0x1f, 0x88, 0x48, 0xbe,
-		0x21, 0xa9, 0x90, 0x9e, 0x73, 0xe9, 0x82, 0xf7,
-		0xbf, 0x4b, 0x43, 0xf4, 0xbf, 0x22, 0x3c, 0x45,
-		0x47, 0x95, 0x5b, 0x49, 0x71, 0x07, 0x1c, 0x8b,
-		0x49, 0xa4, 0xa3, 0x49, 0xc4, 0x5f, 0xb1, 0xf5,
-		0xe3, 0x6b, 0xf1, 0xdc, 0xea, 0x92, 0x7b, 0x29,
-		0x40, 0xc9, 0x39, 0x5f, 0xdb, 0xbd, 0xf3, 0x6a,
-		0x09, 0x9b, 0x2a, 0x5e, 0xc7, 0x0b, 0x25, 0x94,
-		0x55, 0x71, 0x9c, 0x7e, 0x0e, 0xb4, 0x08, 0x12,
-		0x8c, 0x6e, 0x77, 0xb8, 0x29, 0xf1, 0xc6, 0x71,
-		0x04, 0x40, 0x77, 0x18, 0x3f, 0x01, 0x09, 0x9c,
-		0x23, 0x2b, 0x5d, 0x2a, 0x88, 0x20, 0x23, 0x59,
-		0x74, 0x2a, 0x67, 0x8f, 0xb7, 0xba, 0x38, 0x9f,
-		0x0f, 0xcf, 0x94, 0xdf, 0xe1, 0x8f, 0x35, 0x5e,
-		0x34, 0x0c, 0x32, 0x92, 0x2b, 0x23, 0x81, 0xf4,
-		0x73, 0xa0, 0x5a, 0x2a, 0xbd, 0xa6, 0x6b, 0xae,
-		0x43, 0xe2, 0xdc, 0x01, 0xc1, 0xc6, 0xc3, 0x04,
-		0x06, 0xbb, 0xb0, 0x89, 0xb3, 0x4e, 0xbd, 0x81,
-		0x1b, 0x03, 0x63, 0x93, 0xed, 0x4e, 0xf6, 0xe5,
-		0x94, 0x6f, 0xd6, 0xf3, 0x20, 0xf3, 0xbc, 0x30,
-		0xc5, 0xd6, 0xbe, 0x1c, 0x05, 0x34, 0x26, 0x4d,
-		0x46, 0x5e, 0x56, 0x63, 0xfb, 0xdb, 0xcd, 0xed,
-		0xb0, 0x7f, 0x83, 0x94, 0x55, 0x54, 0x2f, 0xab,
-		0xc9, 0xb7, 0x16, 0x4f, 0x9e, 0x93, 0x25, 0xd7,
-		0x9f, 0x39, 0x2b, 0x63, 0xcf, 0x1e, 0xa3, 0x0e,
-		0x28, 0x47, 0x8a, 0x5f, 0x40, 0x02, 0x89, 0x1f,
-		0x83, 0xe7, 0x87, 0xd1, 0x90, 0x17, 0xb8, 0x27,
-		0x64, 0xe1, 0xe1, 0x48, 0x5a, 0x55, 0x74, 0x99,
-		0x27, 0x9d, 0x05, 0x67, 0xda, 0x70, 0x12, 0x8f,
-		0x94, 0x96, 0xfd, 0x36, 0xa4, 0x1d, 0x22, 0xe5,
-		0x0b, 0xe5, 0x2f, 0x38, 0x55, 0xa3, 0x5d, 0x0b,
-		0xcf, 0xd4, 0xa9, 0xb8, 0xd6, 0x9a, 0x16, 0x2e,
-		0x6c, 0x4a, 0x25, 0x51, 0x7a, 0x09, 0x48, 0xdd,
-		0xf0, 0xa3, 0x5b, 0x08, 0x1e, 0x2f, 0x03, 0x91,
-		0x80, 0xe8, 0x0f, 0xe9, 0x5a, 0x2f, 0x90, 0xd3,
-		0x64, 0xed, 0xd7, 0x51, 0x17, 0x66, 0x53, 0x40,
-		0x43, 0x74, 0xef, 0x0a, 0x0d, 0x49, 0x41, 0xf2,
-		0x67, 0x6e, 0xea, 0x14, 0xc8, 0x74, 0xd6, 0xa9,
-		0xb9, 0x6a, 0xe3, 0xec, 0x7d, 0xe8, 0x6a, 0x21,
-		0x3a, 0x52, 0x42, 0xfe, 0x9a, 0x15, 0x6d, 0x60,
-		0x64, 0x88, 0xc5, 0xb2, 0x8b, 0x15, 0x2c, 0xff,
-		0xe2, 0x35, 0xc3, 0xee, 0x9f, 0xcd, 0x82, 0xd9,
-		0x14, 0x35, 0x2a, 0xb7, 0xf5, 0x2f, 0x7b, 0xbc,
-		0x01, 0xfd, 0xa8, 0xe0, 0x21, 0x4e, 0x73, 0xf9,
-		0xf2, 0xb0, 0x79, 0xc9, 0x10, 0x52, 0x8f, 0xa8,
-		0x3e, 0x3b, 0xbe, 0xc5, 0xde, 0xf6, 0x53, 0xe3,
-		0x1c, 0x25, 0x3a, 0x1f, 0x13, 0xbf, 0x13, 0xbb,
-		0x94, 0xc2, 0x97, 0x43, 0x64, 0x47, 0x8f, 0x76,
-		0xd7, 0xaa, 0xeb, 0xa4, 0x03, 0x50, 0x0c, 0x10,
-		0x50, 0xd8, 0xf7, 0x75, 0x52, 0x42, 0xe2, 0x94,
-		0x67, 0xf4, 0x60, 0xfb, 0x21, 0x9b, 0x7a, 0x05,
-		0x50, 0x7c, 0x1b, 0x4a, 0x8b, 0x29, 0xe1, 0xac,
-		0xd7, 0x99, 0xfd, 0x0d, 0x65, 0x92, 0xcd, 0x23,
-		0xa7, 0x35, 0x8e, 0x13, 0xf2, 0xe4, 0x10, 0x74,
-		0xc6, 0x4f, 0x19, 0xf7, 0x01, 0x0b, 0x46, 0xab,
-		0xef, 0x8d, 0x4a, 0x4a, 0xfa, 0xda, 0xf3, 0xfb,
-		0x40, 0x28, 0x88, 0xa2, 0x65, 0x98, 0x4d, 0x88,
-		0xc7, 0xbf, 0x00, 0xc8, 0xd0, 0x91, 0xcb, 0x89,
-		0x2f, 0xb0, 0x85, 0xfc, 0xa1, 0xc1, 0x9e, 0x83,
-		0x88, 0xad, 0x95, 0xc0, 0x31, 0xa0, 0xad, 0xa2,
-		0x42, 0xb5, 0xe7, 0x55, 0xd4, 0x93, 0x5a, 0x74,
-		0x4e, 0x41, 0xc3, 0xcf, 0x96, 0x83, 0x46, 0xa1,
-		0xb7, 0x5b, 0xb1, 0x34, 0x67, 0x4e, 0xb1, 0xd7,
-		0x40, 0x20, 0x72, 0xe9, 0xc8, 0x74, 0xb7, 0xde,
-		0x72, 0x29, 0x77, 0x4c, 0x74, 0x7e, 0xcc, 0x18,
-		0xa5, 0x8d, 0x79, 0x8c, 0xd6, 0x6e, 0xcb, 0xd9,
-		0xe1, 0x61, 0xe7, 0x36, 0xbc, 0x37, 0xea, 0xee,
-		0xd8, 0x3c, 0x5e, 0x7c, 0x47, 0x50, 0xd5, 0xec,
-		0x37, 0xc5, 0x63, 0xc3, 0xc9, 0x99, 0x23, 0x9f,
-		0x64, 0x39, 0xdf, 0x13, 0x96, 0x6d, 0xea, 0x08,
-		0x0c, 0x27, 0x2d, 0xfe, 0x0f, 0xc2, 0xa3, 0x97,
-		0x04, 0x12, 0x66, 0x0d, 0x94, 0xbf, 0xbe, 0x3e,
-		0xb9, 0xcf, 0x8e, 0xc1, 0x9d, 0xb1, 0x64, 0x17,
-		0x54, 0x92, 0x3f, 0x0a, 0x51, 0xc8, 0xf5, 0x82,
-		0x98, 0x73, 0x03, 0xc0, 0x5a, 0x51, 0x01, 0x67,
-		0xb4, 0x01, 0x04, 0x06, 0xbc, 0x37, 0xde, 0x96,
-		0x23, 0x3c, 0xce, 0x98, 0x3f, 0xd6, 0x51, 0x1b,
-		0x01, 0x83, 0x0a, 0x1c, 0xf9, 0xeb, 0x7e, 0x72,
-		0xa9, 0x51, 0x23, 0xc8, 0xd7, 0x2f, 0x12, 0xbc,
-		0x08, 0xac, 0x07, 0xe7, 0xa7, 0xe6, 0x46, 0xae,
-		0x54, 0xa3, 0xc2, 0xf2, 0x05, 0x2d, 0x06, 0x5e,
-		0xfc, 0xe2, 0xa2, 0x23, 0xac, 0x86, 0xf2, 0x54,
-		0x83, 0x4a, 0xb6, 0x48, 0x93, 0xa1, 0x78, 0xc2,
-		0x07, 0xec, 0x82, 0xf0, 0x74, 0xa9, 0x18, 0xe9,
-		0x53, 0x44, 0x49, 0xc2, 0x94, 0xf8, 0x94, 0x92,
-		0x08, 0x3f, 0xbf, 0xa6, 0xe5, 0xc6, 0x03, 0x8a,
-		0xc6, 0x90, 0x48, 0x6c, 0xee, 0xbd, 0x44, 0x92,
-		0x1f, 0x2a, 0xce, 0x1d, 0xb8, 0x31, 0xa2, 0x9d,
-		0x24, 0x93, 0xa8, 0x9f, 0x36, 0x00, 0x04, 0x7b,
-		0xcb, 0x93, 0x59, 0xa1, 0x53, 0xdb, 0x13, 0x7a,
-		0x54, 0xb1, 0x04, 0xdb, 0xce, 0x48, 0x4f, 0xe5,
-		0x2f, 0xcb, 0xdf, 0x8f, 0x50, 0x7c, 0xfc, 0x76,
-		0x80, 0xb4, 0xdc, 0x3b, 0xc8, 0x98, 0x95, 0xf5,
-		0x50, 0xba, 0x70, 0x5a, 0x97, 0xd5, 0xfc, 0x98,
-		0x4d, 0xf3, 0x61, 0x0f, 0xcf, 0xac, 0x49, 0x0a,
-		0xdb, 0xc1, 0x42, 0x8f, 0xb6, 0x29, 0xd5, 0x65,
-		0xef, 0x83, 0xf1, 0x30, 0x4b, 0x84, 0xd0, 0x69,
-		0xde, 0xd2, 0x99, 0xe5, 0xec, 0xd3, 0x90, 0x86,
-		0x39, 0x2a, 0x6e, 0xd5, 0x32, 0xe3, 0x0d, 0x2d,
-		0x01, 0x8b, 0x17, 0x55, 0x1d, 0x65, 0x57, 0xbf,
-		0xd8, 0x75, 0xa4, 0x85, 0xb6, 0x4e, 0x35, 0x14,
-		0x58, 0xe4, 0x89, 0xb8, 0x7a, 0x58, 0x86, 0x0c,
-		0xbd, 0x8b, 0x05, 0x7b, 0x63, 0xc0, 0x86, 0x80,
-		0x33, 0x46, 0xd4, 0x9b, 0xb6, 0x0a, 0xeb, 0x6c,
-		0xae, 0xd6, 0x57, 0x7a, 0xc7, 0x59, 0x33, 0xa0,
-		0xda, 0xa4, 0x12, 0xbf, 0x52, 0x22, 0x05, 0x8d,
-		0xeb, 0xee, 0xd5, 0xec, 0xea, 0x29, 0x9b, 0x76,
-		0x95, 0x50, 0x6d, 0x99, 0xe1, 0x45, 0x63, 0x09,
-		0x16, 0x5f, 0xb0, 0xf2, 0x5b, 0x08, 0x33, 0xdd,
-		0x8f, 0xb7, 0x60, 0x7a, 0x8e, 0xc6, 0xfc, 0xac,
-		0xa9, 0x56, 0x2c, 0xa9, 0x8b, 0x74, 0x33, 0xad,
-		0x2a, 0x7e, 0x96, 0xb6, 0xba, 0x22, 0x28, 0xcf,
-		0x4d, 0x96, 0xb7, 0xd1, 0xfa, 0x99, 0x4a, 0x61,
-		0xe6, 0x84, 0xd1, 0x94, 0xca, 0xf5, 0x86, 0xb0,
-		0xba, 0x34, 0x7a, 0x04, 0xcc, 0xd4, 0x81, 0xcd,
-		0xd9, 0x86, 0xb6, 0xe0, 0x5a, 0x6f, 0x9b, 0x99,
-		0xf0, 0xdf, 0x49, 0xae, 0x6d, 0xc2, 0x54, 0x67,
-		0xe0, 0xb4, 0x34, 0x2d, 0x1c, 0x46, 0xdf, 0x73,
-		0x3b, 0x45, 0x43, 0xe7, 0x1f, 0xa3, 0x36, 0x35,
-		0x25, 0x33, 0xd9, 0xc0, 0x54, 0x38, 0x6e, 0x6b,
-		0x80, 0xcf, 0x50, 0xa4, 0xb6, 0x21, 0x17, 0xfd,
-		0x9b, 0x5c, 0x36, 0xca, 0xcc, 0x73, 0x73, 0xad,
-		0xe0, 0x57, 0x77, 0x90, 0x0e, 0x7f, 0x0f, 0x87,
-		0x7f, 0xdb, 0x73, 0xbf, 0xda, 0xc2, 0xb3, 0x05,
-		0x22, 0x06, 0xf5, 0xa3, 0xfc, 0x1e, 0x8f, 0xda,
-		0xcf, 0x49, 0xd6, 0xb3, 0x66, 0x2c, 0xb5, 0x00,
-		0xaf, 0x85, 0x6e, 0xb8, 0x5b, 0x8c, 0xa1, 0xa4,
-		0x21, 0xce, 0x40, 0xf3, 0x98, 0xac, 0xec, 0x88,
-		0x62, 0x43, 0x2a, 0xac, 0xca, 0xcf, 0xb9, 0x30,
-		0xeb, 0xfc, 0xef, 0xf0, 0x6e, 0x64, 0x6d, 0xe7,
-		0x54, 0x88, 0x6b, 0x22, 0x29, 0xbe, 0xa5, 0x8c,
-		0x31, 0x23, 0x3b, 0x4a, 0x80, 0x37, 0xe6, 0xd0,
-		0x05, 0xfc, 0x10, 0x0e, 0xdd, 0xbb, 0x00, 0xc5,
-		0x07, 0x20, 0x59, 0xd3, 0x41, 0x17, 0x86, 0x46,
-		0xab, 0x68, 0xf6, 0x48, 0x3c, 0xea, 0x5a, 0x06,
-		0x30, 0x21, 0x19, 0xed, 0x74, 0xbe, 0x0b, 0x97,
-		0xee, 0x91, 0x35, 0x94, 0x1f, 0xcb, 0x68, 0x7f,
-		0xe4, 0x48, 0xb0, 0x16, 0xfb, 0xf0, 0x74, 0xdb,
-		0x06, 0x59, 0x2e, 0x5a, 0x9c, 0xce, 0x8f, 0x7d,
-		0xba, 0x48, 0xd5, 0x3f, 0x5c, 0xb0, 0xc2, 0x33,
-		0x48, 0x60, 0x17, 0x08, 0x85, 0xba, 0xff, 0xb9,
-		0x34, 0x0a, 0x3d, 0x8f, 0x21, 0x13, 0x12, 0x1b
-};
-
-static const uint8_t AES_CBC_ciphertext_1536B[] = {
-		0x89, 0x93, 0x05, 0x99, 0xa9, 0xed, 0xea, 0x62,
-		0xc9, 0xda, 0x51, 0x15, 0xce, 0x42, 0x91, 0xc3,
-		0x80, 0xc8, 0x03, 0x88, 0xc2, 0x63, 0xda, 0x53,
-		0x1a, 0xf3, 0xeb, 0xd5, 0xba, 0x6f, 0x23, 0xb2,
-		0xed, 0x8f, 0x89, 0xb1, 0xb3, 0xca, 0x90, 0x7a,
-		0xdd, 0x3f, 0xf6, 0xca, 0x86, 0x58, 0x54, 0xbc,
-		0xab, 0x0f, 0xf4, 0xab, 0x6d, 0x5d, 0x42, 0xd0,
-		0x17, 0x49, 0x17, 0xd1, 0x93, 0xea, 0xe8, 0x22,
-		0xc1, 0x34, 0x9f, 0x3a, 0x3b, 0xaa, 0xe9, 0x1b,
-		0x93, 0xff, 0x6b, 0x68, 0xba, 0xe6, 0xd2, 0x39,
-		0x3d, 0x55, 0x34, 0x8f, 0x98, 0x86, 0xb4, 0xd8,
-		0x7c, 0x0d, 0x3e, 0x01, 0x63, 0x04, 0x01, 0xff,
-		0x16, 0x0f, 0x51, 0x5f, 0x73, 0x53, 0xf0, 0x3a,
-		0x38, 0xb4, 0x4d, 0x8d, 0xaf, 0xa3, 0xca, 0x2f,
-		0x6f, 0xdf, 0xc0, 0x41, 0x6c, 0x48, 0x60, 0x1a,
-		0xe4, 0xe7, 0x8a, 0x65, 0x6f, 0x8d, 0xd7, 0xe1,
-		0x10, 0xab, 0x78, 0x5b, 0xb9, 0x69, 0x1f, 0xe0,
-		0x5c, 0xf1, 0x19, 0x12, 0x21, 0xc7, 0x51, 0xbc,
-		0x61, 0x5f, 0xc0, 0x36, 0x17, 0xc0, 0x28, 0xd9,
-		0x51, 0xcb, 0x43, 0xd9, 0xfa, 0xd1, 0xad, 0x79,
-		0x69, 0x86, 0x49, 0xc5, 0xe5, 0x69, 0x27, 0xce,
-		0x22, 0xd0, 0xe1, 0x6a, 0xf9, 0x02, 0xca, 0x6c,
-		0x34, 0xc7, 0xb8, 0x02, 0xc1, 0x38, 0x7f, 0xd5,
-		0x15, 0xf5, 0xd6, 0xeb, 0xf9, 0x30, 0x40, 0x43,
-		0xea, 0x87, 0xde, 0x35, 0xf6, 0x83, 0x59, 0x09,
-		0x68, 0x62, 0x00, 0x87, 0xb8, 0xe7, 0xca, 0x05,
-		0x0f, 0xac, 0x42, 0x58, 0x45, 0xaa, 0xc9, 0x9b,
-		0xfd, 0x2a, 0xda, 0x65, 0x33, 0x93, 0x9d, 0xc6,
-		0x93, 0x8d, 0xe2, 0xc5, 0x71, 0xc1, 0x5c, 0x13,
-		0xde, 0x7b, 0xd4, 0xb9, 0x4c, 0x35, 0x61, 0x85,
-		0x90, 0x78, 0xf7, 0x81, 0x98, 0x45, 0x99, 0x24,
-		0x58, 0x73, 0x28, 0xf8, 0x31, 0xab, 0x54, 0x2e,
-		0xc0, 0x38, 0x77, 0x25, 0x5c, 0x06, 0x9c, 0xc3,
-		0x69, 0x21, 0x92, 0x76, 0xe1, 0x16, 0xdc, 0xa9,
-		0xee, 0xb6, 0x80, 0x66, 0x43, 0x11, 0x24, 0xb3,
-		0x07, 0x17, 0x89, 0x0f, 0xcb, 0xe0, 0x60, 0xa8,
-		0x9d, 0x06, 0x4b, 0x6e, 0x72, 0xb7, 0xbc, 0x4f,
-		0xb8, 0xc0, 0x80, 0xa2, 0xfb, 0x46, 0x5b, 0x8f,
-		0x11, 0x01, 0x92, 0x9d, 0x37, 0x09, 0x98, 0xc8,
-		0x0a, 0x46, 0xae, 0x12, 0xac, 0x61, 0x3f, 0xe7,
-		0x41, 0x1a, 0xaa, 0x2e, 0xdc, 0xd7, 0x2a, 0x47,
-		0xee, 0xdf, 0x08, 0xd1, 0xff, 0xea, 0x13, 0xc6,
-		0x05, 0xdb, 0x29, 0xcc, 0x03, 0xba, 0x7b, 0x6d,
-		0x40, 0xc1, 0xc9, 0x76, 0x75, 0x03, 0x7a, 0x71,
-		0xc9, 0x5f, 0xd9, 0xe0, 0x61, 0x69, 0x36, 0x8f,
-		0xb2, 0xbc, 0x28, 0xf3, 0x90, 0x71, 0xda, 0x5f,
-		0x08, 0xd5, 0x0d, 0xc1, 0xe6, 0xbd, 0x2b, 0xc6,
-		0x6c, 0x42, 0xfd, 0xbf, 0x10, 0xe8, 0x5f, 0x87,
-		0x3d, 0x21, 0x42, 0x85, 0x01, 0x0a, 0xbf, 0x8e,
-		0x49, 0xd3, 0x9c, 0x89, 0x3b, 0xea, 0xe1, 0xbf,
-		0xe9, 0x9b, 0x5e, 0x0e, 0xb8, 0xeb, 0xcd, 0x3a,
-		0xf6, 0x29, 0x41, 0x35, 0xdd, 0x9b, 0x13, 0x24,
-		0xe0, 0x1d, 0x8a, 0xcb, 0x20, 0xf8, 0x41, 0x51,
-		0x3e, 0x23, 0x8c, 0x67, 0x98, 0x39, 0x53, 0x77,
-		0x2a, 0x68, 0xf4, 0x3c, 0x7e, 0xd6, 0xc4, 0x6e,
-		0xf1, 0x53, 0xe9, 0xd8, 0x5c, 0xc1, 0xa9, 0x38,
-		0x6f, 0x5e, 0xe4, 0xd4, 0x29, 0x1c, 0x6c, 0xee,
-		0x2f, 0xea, 0xde, 0x61, 0x71, 0x5a, 0xea, 0xce,
-		0x23, 0x6e, 0x1b, 0x16, 0x43, 0xb7, 0xc0, 0xe3,
-		0x87, 0xa1, 0x95, 0x1e, 0x97, 0x4d, 0xea, 0xa6,
-		0xf7, 0x25, 0xac, 0x82, 0x2a, 0xd3, 0xa6, 0x99,
-		0x75, 0xdd, 0xc1, 0x55, 0x32, 0x6b, 0xea, 0x33,
-		0x88, 0xce, 0x06, 0xac, 0x15, 0x39, 0x19, 0xa3,
-		0x59, 0xaf, 0x7a, 0x1f, 0xd9, 0x72, 0x5e, 0xf7,
-		0x4c, 0xf3, 0x5d, 0x6b, 0xf2, 0x16, 0x92, 0xa8,
-		0x9e, 0x3d, 0xd4, 0x4c, 0x72, 0x55, 0x4e, 0x4a,
-		0xf7, 0x8b, 0x2f, 0x67, 0x5a, 0x90, 0xb7, 0xcf,
-		0x16, 0xd3, 0x7b, 0x5a, 0x9a, 0xc8, 0x9f, 0xbf,
-		0x01, 0x76, 0x3b, 0x86, 0x2c, 0x2a, 0x78, 0x10,
-		0x70, 0x05, 0x38, 0xf9, 0xdd, 0x2a, 0x1d, 0x00,
-		0x25, 0xb7, 0x10, 0xac, 0x3b, 0x3c, 0x4d, 0x3c,
-		0x01, 0x68, 0x3c, 0x5a, 0x29, 0xc2, 0xa0, 0x1b,
-		0x95, 0x67, 0xf9, 0x0a, 0x60, 0xb7, 0x11, 0x9c,
-		0x40, 0x45, 0xd7, 0xb0, 0xda, 0x49, 0x87, 0xcd,
-		0xb0, 0x9b, 0x61, 0x8c, 0xf4, 0x0d, 0x94, 0x1d,
-		0x79, 0x66, 0x13, 0x0b, 0xc6, 0x6b, 0x19, 0xee,
-		0xa0, 0x6b, 0x64, 0x7d, 0xc4, 0xff, 0x98, 0x72,
-		0x60, 0xab, 0x7f, 0x0f, 0x4d, 0x5d, 0x6b, 0xc3,
-		0xba, 0x5e, 0x0d, 0x04, 0xd9, 0x59, 0x17, 0xd0,
-		0x64, 0xbe, 0xfb, 0x58, 0xfc, 0xed, 0x18, 0xf6,
-		0xac, 0x19, 0xa4, 0xfd, 0x16, 0x59, 0x80, 0x58,
-		0xb8, 0x0f, 0x79, 0x24, 0x60, 0x18, 0x62, 0xa9,
-		0xa3, 0xa0, 0xe8, 0x81, 0xd6, 0xec, 0x5b, 0xfe,
-		0x5b, 0xb8, 0xa4, 0x00, 0xa9, 0xd0, 0x90, 0x17,
-		0xe5, 0x50, 0x3d, 0x2b, 0x12, 0x6e, 0x2a, 0x13,
-		0x65, 0x7c, 0xdf, 0xdf, 0xa7, 0xdd, 0x9f, 0x78,
-		0x5f, 0x8f, 0x4e, 0x90, 0xa6, 0x10, 0xe4, 0x7b,
-		0x68, 0x6b, 0xfd, 0xa9, 0x6d, 0x47, 0xfa, 0xec,
-		0x42, 0x35, 0x07, 0x12, 0x3e, 0x78, 0x23, 0x15,
-		0xff, 0xe2, 0x65, 0xc7, 0x47, 0x89, 0x2f, 0x97,
-		0x7c, 0xd7, 0x6b, 0x69, 0x35, 0x79, 0x6f, 0x85,
-		0xb4, 0xa9, 0x75, 0x04, 0x32, 0x9a, 0xfe, 0xf0,
-		0xce, 0xe3, 0xf1, 0xab, 0x15, 0x47, 0xe4, 0x9c,
-		0xc1, 0x48, 0x32, 0x3c, 0xbe, 0x44, 0x72, 0xc9,
-		0xaa, 0x50, 0x37, 0xa6, 0xbe, 0x41, 0xcf, 0xe8,
-		0x17, 0x4e, 0x37, 0xbe, 0xf1, 0x34, 0x2c, 0xd9,
-		0x60, 0x48, 0x09, 0xa5, 0x26, 0x00, 0x31, 0x77,
-		0x4e, 0xac, 0x7c, 0x89, 0x75, 0xe3, 0xde, 0x26,
-		0x4c, 0x32, 0x54, 0x27, 0x8e, 0x92, 0x26, 0x42,
-		0x85, 0x76, 0x01, 0x76, 0x62, 0x4c, 0x29, 0xe9,
-		0x38, 0x05, 0x51, 0x54, 0x97, 0xa3, 0x03, 0x59,
-		0x5e, 0xec, 0x0c, 0xe4, 0x96, 0xb7, 0x15, 0xa8,
-		0x41, 0x06, 0x2b, 0x78, 0x95, 0x24, 0xf6, 0x32,
-		0xc5, 0xec, 0xd7, 0x89, 0x28, 0x1e, 0xec, 0xb1,
-		0xc7, 0x21, 0x0c, 0xd3, 0x80, 0x7c, 0x5a, 0xe6,
-		0xb1, 0x3a, 0x52, 0x33, 0x84, 0x4e, 0x32, 0x6e,
-		0x7a, 0xf6, 0x43, 0x15, 0x5b, 0xa6, 0xba, 0xeb,
-		0xa8, 0xe4, 0xff, 0x4f, 0xbd, 0xbd, 0xa8, 0x5e,
-		0xbe, 0x27, 0xaf, 0xc5, 0xf7, 0x9e, 0xdf, 0x48,
-		0x22, 0xca, 0x6a, 0x0b, 0x3c, 0xd7, 0xe0, 0xdc,
-		0xf3, 0x71, 0x08, 0xdc, 0x28, 0x13, 0x08, 0xf2,
-		0x08, 0x1d, 0x9d, 0x7b, 0xd9, 0xde, 0x6f, 0xe6,
-		0xe8, 0x88, 0x18, 0xc2, 0xcd, 0x93, 0xc5, 0x38,
-		0x21, 0x68, 0x4c, 0x9a, 0xfb, 0xb6, 0x18, 0x16,
-		0x73, 0x2c, 0x1d, 0x6f, 0x95, 0xfb, 0x65, 0x4f,
-		0x7c, 0xec, 0x8d, 0x6c, 0xa8, 0xc0, 0x55, 0x28,
-		0xc6, 0xc3, 0xea, 0xeb, 0x05, 0xf5, 0x65, 0xeb,
-		0x53, 0xe1, 0x54, 0xef, 0xb8, 0x64, 0x98, 0x2d,
-		0x98, 0x9e, 0xc8, 0xfe, 0xa2, 0x07, 0x30, 0xf7,
-		0xf7, 0xae, 0xdb, 0x32, 0xf8, 0x71, 0x9d, 0x06,
-		0xdf, 0x9b, 0xda, 0x61, 0x7d, 0xdb, 0xae, 0x06,
-		0x24, 0x63, 0x74, 0xb6, 0xf3, 0x1b, 0x66, 0x09,
-		0x60, 0xff, 0x2b, 0x29, 0xf5, 0xa9, 0x9d, 0x61,
-		0x5d, 0x55, 0x10, 0x82, 0x21, 0xbb, 0x64, 0x0d,
-		0xef, 0x5c, 0xe3, 0x30, 0x1b, 0x60, 0x1e, 0x5b,
-		0xfe, 0x6c, 0xf5, 0x15, 0xa3, 0x86, 0x27, 0x58,
-		0x46, 0x00, 0x20, 0xcb, 0x86, 0x9a, 0x52, 0x29,
-		0x20, 0x68, 0x4d, 0x67, 0x88, 0x70, 0xc2, 0x31,
-		0xd8, 0xbb, 0xa5, 0xa7, 0x88, 0x7f, 0x66, 0xbc,
-		0xaa, 0x0f, 0xe1, 0x78, 0x7b, 0x97, 0x3c, 0xb7,
-		0xd7, 0xd8, 0x04, 0xe0, 0x09, 0x60, 0xc8, 0xd0,
-		0x9e, 0xe5, 0x6b, 0x31, 0x7f, 0x88, 0xfe, 0xc3,
-		0xfd, 0x89, 0xec, 0x76, 0x4b, 0xb3, 0xa7, 0x37,
-		0x03, 0xb7, 0xc6, 0x10, 0x7c, 0x9d, 0x0c, 0x75,
-		0xd3, 0x08, 0x14, 0x94, 0x03, 0x42, 0x25, 0x26,
-		0x85, 0xf7, 0xf0, 0x90, 0x06, 0x3e, 0x6f, 0x60,
-		0x52, 0x55, 0xd5, 0x0f, 0x79, 0x64, 0x69, 0x69,
-		0x46, 0xf9, 0x7f, 0x7f, 0x03, 0xf1, 0x1f, 0xdb,
-		0x39, 0x05, 0xba, 0x4a, 0x8f, 0x17, 0xe7, 0xba,
-		0xe2, 0x07, 0x7c, 0x1d, 0x9e, 0xbc, 0x94, 0xc0,
-		0x61, 0x59, 0x8e, 0x72, 0xaf, 0xfc, 0x99, 0xe4,
-		0xd5, 0xa8, 0xee, 0x0a, 0x48, 0x2d, 0x82, 0x8b,
-		0x34, 0x54, 0x8a, 0xce, 0xc7, 0xfa, 0xdd, 0xba,
-		0x54, 0xdf, 0xb3, 0x30, 0x33, 0x73, 0x2e, 0xd5,
-		0x52, 0xab, 0x49, 0x91, 0x4e, 0x0a, 0xd6, 0x2f,
-		0x67, 0xe4, 0xdd, 0x64, 0x48, 0x16, 0xd9, 0x85,
-		0xaa, 0x52, 0xa5, 0x0b, 0xd3, 0xb4, 0x2d, 0x77,
-		0x5e, 0x52, 0x77, 0x17, 0xcf, 0xbe, 0x88, 0x04,
-		0x01, 0x52, 0xe2, 0xf1, 0x46, 0xe2, 0x91, 0x30,
-		0x65, 0xcf, 0xc0, 0x65, 0x45, 0xc3, 0x7e, 0xf4,
-		0x2e, 0xb5, 0xaf, 0x6f, 0xab, 0x1a, 0xfa, 0x70,
-		0x35, 0xb8, 0x4f, 0x2d, 0x78, 0x90, 0x33, 0xb5,
-		0x9a, 0x67, 0xdb, 0x2f, 0x28, 0x32, 0xb6, 0x54,
-		0xab, 0x4c, 0x6b, 0x85, 0xed, 0x6c, 0x3e, 0x05,
-		0x2a, 0xc7, 0x32, 0xe8, 0xf5, 0xa3, 0x7b, 0x4e,
-		0x7b, 0x58, 0x24, 0x73, 0xf7, 0xfd, 0xc7, 0xc8,
-		0x6c, 0x71, 0x68, 0xb1, 0xf6, 0xc5, 0x9e, 0x1e,
-		0xe3, 0x5c, 0x25, 0xc0, 0x5b, 0x3e, 0x59, 0xa1,
-		0x18, 0x5a, 0xe8, 0xb5, 0xd1, 0x44, 0x13, 0xa3,
-		0xe6, 0x05, 0x76, 0xd2, 0x8d, 0x6e, 0x54, 0x68,
-		0x0c, 0xa4, 0x7b, 0x8b, 0xd3, 0x8c, 0x42, 0x13,
-		0x87, 0xda, 0xdf, 0x8f, 0xa5, 0x83, 0x7a, 0x42,
-		0x99, 0xb7, 0xeb, 0xe2, 0x79, 0xe0, 0xdb, 0xda,
-		0x33, 0xa8, 0x50, 0x3a, 0xd7, 0xe7, 0xd3, 0x61,
-		0x18, 0xb8, 0xaa, 0x2d, 0xc8, 0xd8, 0x2c, 0x28,
-		0xe5, 0x97, 0x0a, 0x7c, 0x6c, 0x7f, 0x09, 0xd7,
-		0x88, 0x80, 0xac, 0x12, 0xed, 0xf8, 0xc6, 0xb5,
-		0x2d, 0xd6, 0x63, 0x9b, 0x98, 0x35, 0x26, 0xde,
-		0xf6, 0x31, 0xee, 0x7e, 0xa0, 0xfb, 0x16, 0x98,
-		0xb1, 0x96, 0x1d, 0xee, 0xe3, 0x2f, 0xfb, 0x41,
-		0xdd, 0xea, 0x10, 0x1e, 0x03, 0x89, 0x18, 0xd2,
-		0x47, 0x0c, 0xa0, 0x57, 0xda, 0x76, 0x3a, 0x37,
-		0x2c, 0xe4, 0xf9, 0x77, 0xc8, 0x43, 0x5f, 0xcb,
-		0xd6, 0x85, 0xf7, 0x22, 0xe4, 0x32, 0x25, 0xa8,
-		0xdc, 0x21, 0xc0, 0xf5, 0x95, 0xb2, 0xf8, 0x83,
-		0xf0, 0x65, 0x61, 0x15, 0x48, 0x94, 0xb7, 0x03,
-		0x7f, 0x66, 0xa1, 0x39, 0x1f, 0xdd, 0xce, 0x96,
-		0xfe, 0x58, 0x81, 0x3d, 0x41, 0x11, 0x87, 0x13,
-		0x26, 0x1b, 0x6d, 0xf3, 0xca, 0x2e, 0x2c, 0x76,
-		0xd3, 0x2f, 0x6d, 0x49, 0x70, 0x53, 0x05, 0x96,
-		0xcc, 0x30, 0x2b, 0x83, 0xf2, 0xc6, 0xb2, 0x4b,
-		0x22, 0x13, 0x95, 0x42, 0xeb, 0x56, 0x4d, 0x22,
-		0xe6, 0x43, 0x6f, 0xba, 0xe7, 0x3b, 0xe5, 0x59,
-		0xce, 0x57, 0x88, 0x85, 0xb6, 0xbf, 0x15, 0x37,
-		0xb3, 0x7a, 0x7e, 0xc4, 0xbc, 0x99, 0xfc, 0xe4,
-		0x89, 0x00, 0x68, 0x39, 0xbc, 0x5a, 0xba, 0xab,
-		0x52, 0xab, 0xe6, 0x81, 0xfd, 0x93, 0x62, 0xe9,
-		0xb7, 0x12, 0xd1, 0x18, 0x1a, 0xb9, 0x55, 0x4a,
-		0x0f, 0xae, 0x35, 0x11, 0x04, 0x27, 0xf3, 0x42,
-		0x4e, 0xca, 0xdf, 0x9f, 0x12, 0x62, 0xea, 0x03,
-		0xc0, 0xa9, 0x22, 0x7b, 0x6c, 0x6c, 0xe3, 0xdf,
-		0x16, 0xad, 0x03, 0xc9, 0xfe, 0xa4, 0xdd, 0x4f
-};
-
-static const uint8_t AES_CBC_ciphertext_1792B[] = {
-		0x59, 0xcc, 0xfe, 0x8f, 0xb4, 0x9d, 0x0e, 0xd1,
-		0x85, 0xfc, 0x9b, 0x43, 0xc1, 0xb7, 0x54, 0x67,
-		0x01, 0xef, 0xb8, 0x71, 0x36, 0xdb, 0x50, 0x48,
-		0x7a, 0xea, 0xcf, 0xce, 0xba, 0x30, 0x10, 0x2e,
-		0x96, 0x2b, 0xfd, 0xcf, 0x00, 0xe3, 0x1f, 0xac,
-		0x66, 0x14, 0x30, 0x86, 0x49, 0xdb, 0x01, 0x8b,
-		0x07, 0xdd, 0x00, 0x9d, 0x0d, 0x5c, 0x19, 0x11,
-		0xe8, 0x44, 0x2b, 0x25, 0x70, 0xed, 0x7c, 0x33,
-		0x0d, 0xe3, 0x34, 0x93, 0x63, 0xad, 0x26, 0xb1,
-		0x11, 0x91, 0x34, 0x2e, 0x1d, 0x50, 0xaa, 0xd4,
-		0xef, 0x3a, 0x6d, 0xd7, 0x33, 0x20, 0x0d, 0x3f,
-		0x9b, 0xdd, 0xc3, 0xa5, 0xc5, 0xf1, 0x99, 0xdc,
-		0xea, 0x52, 0xda, 0x55, 0xea, 0xa2, 0x7a, 0xc5,
-		0x78, 0x44, 0x4a, 0x02, 0x33, 0x19, 0x62, 0x37,
-		0xf8, 0x8b, 0xd1, 0x0c, 0x21, 0xdf, 0x40, 0x19,
-		0x81, 0xea, 0xfb, 0x1c, 0xa7, 0xcc, 0x60, 0xfe,
-		0x63, 0x25, 0x8f, 0xf3, 0x73, 0x0f, 0x45, 0xe6,
-		0x6a, 0x18, 0xbf, 0xbe, 0xad, 0x92, 0x2a, 0x1e,
-		0x15, 0x65, 0x6f, 0xef, 0x92, 0xcd, 0x0e, 0x19,
-		0x3d, 0x42, 0xa8, 0xfc, 0x0d, 0x32, 0x58, 0xe0,
-		0x56, 0x9f, 0xd6, 0x9b, 0x8b, 0xec, 0xe0, 0x45,
-		0x4d, 0x7e, 0x73, 0x87, 0xff, 0x74, 0x92, 0x59,
-		0x60, 0x13, 0x93, 0xda, 0xec, 0xbf, 0xfa, 0x20,
-		0xb6, 0xe7, 0xdf, 0xc7, 0x10, 0xf5, 0x79, 0xb4,
-		0xd7, 0xac, 0xaf, 0x2b, 0x37, 0x52, 0x30, 0x1d,
-		0xbe, 0x0f, 0x60, 0x77, 0x3d, 0x03, 0x63, 0xa9,
-		0xae, 0xb1, 0xf3, 0xca, 0xca, 0xb4, 0x21, 0xd7,
-		0x6f, 0x2e, 0x5e, 0x9b, 0x68, 0x53, 0x80, 0xab,
-		0x30, 0x23, 0x0a, 0x72, 0x6b, 0xb1, 0xd8, 0x25,
-		0x5d, 0x3a, 0x62, 0x9b, 0x4f, 0x59, 0x3b, 0x79,
-		0xa8, 0x9e, 0x08, 0x6d, 0x37, 0xb0, 0xfc, 0x42,
-		0x51, 0x25, 0x86, 0xbd, 0x54, 0x5a, 0x95, 0x20,
-		0x6c, 0xac, 0xb9, 0x30, 0x1c, 0x03, 0xc9, 0x49,
-		0x38, 0x55, 0x31, 0x49, 0xed, 0xa9, 0x0e, 0xc3,
-		0x65, 0xb4, 0x68, 0x6b, 0x07, 0x4c, 0x0a, 0xf9,
-		0x21, 0x69, 0x7c, 0x9f, 0x28, 0x80, 0xe9, 0x49,
-		0x22, 0x7c, 0xec, 0x97, 0xf7, 0x70, 0xb4, 0xb8,
-		0x25, 0xe7, 0x80, 0x2c, 0x43, 0x24, 0x8a, 0x2e,
-		0xac, 0xa2, 0x84, 0x20, 0xe7, 0xf4, 0x6b, 0x86,
-		0x37, 0x05, 0xc7, 0x59, 0x04, 0x49, 0x2a, 0x99,
-		0x80, 0x46, 0x32, 0x19, 0xe6, 0x30, 0xce, 0xc0,
-		0xef, 0x6e, 0xec, 0xe5, 0x2f, 0x24, 0xc1, 0x78,
-		0x45, 0x02, 0xd3, 0x64, 0x99, 0xf5, 0xc7, 0xbc,
-		0x8f, 0x8c, 0x75, 0xb1, 0x0a, 0xc8, 0xc3, 0xbd,
-		0x5e, 0x7e, 0xbd, 0x0e, 0xdf, 0x4b, 0x96, 0x6a,
-		0xfd, 0x03, 0xdb, 0xd1, 0x31, 0x1e, 0x27, 0xf9,
-		0xe5, 0x83, 0x9a, 0xfc, 0x13, 0x4c, 0xd3, 0x04,
-		0xdb, 0xdb, 0x3f, 0x35, 0x93, 0x4e, 0x14, 0x6b,
-		0x00, 0x5c, 0xb6, 0x11, 0x50, 0xee, 0x61, 0x5c,
-		0x10, 0x5c, 0xd0, 0x90, 0x02, 0x2e, 0x12, 0xe0,
-		0x50, 0x44, 0xad, 0x75, 0xcd, 0x94, 0xcf, 0x92,
-		0xcb, 0xe3, 0xe8, 0x77, 0x4b, 0xd7, 0x1a, 0x7c,
-		0xdd, 0x6b, 0x49, 0x21, 0x7c, 0xe8, 0x2c, 0x25,
-		0x49, 0x86, 0x1e, 0x54, 0xae, 0xfc, 0x0e, 0x80,
-		0xb1, 0xd5, 0xa5, 0x23, 0xcf, 0xcc, 0x0e, 0x11,
-		0xe2, 0x7c, 0x3c, 0x25, 0x78, 0x64, 0x03, 0xa1,
-		0xdd, 0x9f, 0x74, 0x12, 0x7b, 0x21, 0xb5, 0x73,
-		0x15, 0x3c, 0xed, 0xad, 0x07, 0x62, 0x21, 0x79,
-		0xd4, 0x2f, 0x0d, 0x72, 0xe9, 0x7c, 0x6b, 0x96,
-		0x6e, 0xe5, 0x36, 0x4a, 0xd2, 0x38, 0xe1, 0xff,
-		0x6e, 0x26, 0xa4, 0xac, 0x83, 0x07, 0xe6, 0x67,
-		0x74, 0x6c, 0xec, 0x8b, 0x4b, 0x79, 0x33, 0x50,
-		0x2f, 0x8f, 0xa0, 0x8f, 0xfa, 0x38, 0x6a, 0xa2,
-		0x3a, 0x42, 0x85, 0x15, 0x90, 0xd0, 0xb3, 0x0d,
-		0x8a, 0xe4, 0x60, 0x03, 0xef, 0xf9, 0x65, 0x8a,
-		0x4e, 0x50, 0x8c, 0x65, 0xba, 0x61, 0x16, 0xc3,
-		0x93, 0xb7, 0x75, 0x21, 0x98, 0x25, 0x60, 0x6e,
-		0x3d, 0x68, 0xba, 0x7c, 0xe4, 0xf3, 0xd9, 0x9b,
-		0xfb, 0x7a, 0xed, 0x1f, 0xb3, 0x4b, 0x88, 0x74,
-		0x2c, 0xb8, 0x8c, 0x22, 0x95, 0xce, 0x90, 0xf1,
-		0xdb, 0x80, 0xa6, 0x39, 0xae, 0x82, 0xa1, 0xef,
-		0x75, 0xec, 0xfe, 0xf1, 0xe8, 0x04, 0xfd, 0x99,
-		0x1b, 0x5f, 0x45, 0x87, 0x4f, 0xfa, 0xa2, 0x3e,
-		0x3e, 0xb5, 0x01, 0x4b, 0x46, 0xeb, 0x13, 0x9a,
-		0xe4, 0x7d, 0x03, 0x87, 0xb1, 0x59, 0x91, 0x8e,
-		0x37, 0xd3, 0x16, 0xce, 0xef, 0x4b, 0xe9, 0x46,
-		0x8d, 0x2a, 0x50, 0x2f, 0x41, 0xd3, 0x7b, 0xcf,
-		0xf0, 0xb7, 0x8b, 0x65, 0x0f, 0xa3, 0x27, 0x10,
-		0xe9, 0xa9, 0xe9, 0x2c, 0xbe, 0xbb, 0x82, 0xe3,
-		0x7b, 0x0b, 0x81, 0x3e, 0xa4, 0x6a, 0x4f, 0x3b,
-		0xd5, 0x61, 0xf8, 0x47, 0x04, 0x99, 0x5b, 0xff,
-		0xf3, 0x14, 0x6e, 0x57, 0x5b, 0xbf, 0x1b, 0xb4,
-		0x3f, 0xf9, 0x31, 0xf6, 0x95, 0xd5, 0x10, 0xa9,
-		0x72, 0x28, 0x23, 0xa9, 0x6a, 0xa2, 0xcf, 0x7d,
-		0xe3, 0x18, 0x95, 0xda, 0xbc, 0x6f, 0xe9, 0xd8,
-		0xef, 0x49, 0x3f, 0xd3, 0xef, 0x1f, 0xe1, 0x50,
-		0xe8, 0x8a, 0xc0, 0xce, 0xcc, 0xb7, 0x5e, 0x0e,
-		0x8b, 0x95, 0x80, 0xfd, 0x58, 0x2a, 0x9b, 0xc8,
-		0xb4, 0x17, 0x04, 0x46, 0x74, 0xd4, 0x68, 0x91,
-		0x33, 0xc8, 0x31, 0x15, 0x84, 0x16, 0x35, 0x03,
-		0x64, 0x6d, 0xa9, 0x4e, 0x20, 0xeb, 0xa9, 0x3f,
-		0x21, 0x5e, 0x9b, 0x09, 0xc3, 0x45, 0xf8, 0x7c,
-		0x59, 0x62, 0x29, 0x9a, 0x5c, 0xcf, 0xb4, 0x27,
-		0x5e, 0x13, 0xea, 0xb3, 0xef, 0xd9, 0x01, 0x2a,
-		0x65, 0x5f, 0x14, 0xf4, 0xbf, 0x28, 0x89, 0x3d,
-		0xdd, 0x9d, 0x52, 0xbd, 0x9e, 0x5b, 0x3b, 0xd2,
-		0xc2, 0x81, 0x35, 0xb6, 0xac, 0xdd, 0x27, 0xc3,
-		0x7b, 0x01, 0x5a, 0x6d, 0x4c, 0x5e, 0x2c, 0x30,
-		0xcb, 0x3a, 0xfa, 0xc1, 0xd7, 0x31, 0x67, 0x3e,
-		0x08, 0x6a, 0xe8, 0x8c, 0x75, 0xac, 0x1a, 0x6a,
-		0x52, 0xf7, 0x51, 0xcd, 0x85, 0x3f, 0x3c, 0xa7,
-		0xea, 0xbc, 0xd7, 0x18, 0x9e, 0x27, 0x73, 0xe6,
-		0x2b, 0x58, 0xb6, 0xd2, 0x29, 0x68, 0xd5, 0x8f,
-		0x00, 0x4d, 0x55, 0xf6, 0x61, 0x5a, 0xcc, 0x51,
-		0xa6, 0x5e, 0x85, 0xcb, 0x0b, 0xfd, 0x06, 0xca,
-		0xf5, 0xbf, 0x0d, 0x13, 0x74, 0x78, 0x6d, 0x9e,
-		0x20, 0x11, 0x84, 0x3e, 0x78, 0x17, 0x04, 0x4f,
-		0x64, 0x2c, 0x3b, 0x3e, 0x93, 0x7b, 0x58, 0x33,
-		0x07, 0x52, 0xf7, 0x60, 0x6a, 0xa8, 0x3b, 0x19,
-		0x27, 0x7a, 0x93, 0xc5, 0x53, 0xad, 0xec, 0xf6,
-		0xc8, 0x94, 0xee, 0x92, 0xea, 0xee, 0x7e, 0xea,
-		0xb9, 0x5f, 0xac, 0x59, 0x5d, 0x2e, 0x78, 0x53,
-		0x72, 0x81, 0x92, 0xdd, 0x1c, 0x63, 0xbe, 0x02,
-		0xeb, 0xa8, 0x1b, 0x2a, 0x6e, 0x72, 0xe3, 0x2d,
-		0x84, 0x0d, 0x8a, 0x22, 0xf6, 0xba, 0xab, 0x04,
-		0x8e, 0x04, 0x24, 0xdb, 0xcc, 0xe2, 0x69, 0xeb,
-		0x4e, 0xfa, 0x6b, 0x5b, 0xc8, 0xc0, 0xd9, 0x25,
-		0xcb, 0x40, 0x8d, 0x4b, 0x8e, 0xa0, 0xd4, 0x72,
-		0x98, 0x36, 0x46, 0x3b, 0x4f, 0x5f, 0x96, 0x84,
-		0x03, 0x28, 0x86, 0x4d, 0xa1, 0x8a, 0xd7, 0xb2,
-		0x5b, 0x27, 0x01, 0x80, 0x62, 0x49, 0x56, 0xb9,
-		0xa0, 0xa1, 0xe3, 0x6e, 0x22, 0x2a, 0x5d, 0x03,
-		0x86, 0x40, 0x36, 0x22, 0x5e, 0xd2, 0xe5, 0xc0,
-		0x6b, 0xfa, 0xac, 0x80, 0x4e, 0x09, 0x99, 0xbc,
-		0x2f, 0x9b, 0xcc, 0xf3, 0x4e, 0xf7, 0x99, 0x98,
-		0x11, 0x6e, 0x6f, 0x62, 0x22, 0x6b, 0x92, 0x95,
-		0x3b, 0xc3, 0xd2, 0x8e, 0x0f, 0x07, 0xc2, 0x51,
-		0x5c, 0x4d, 0xb2, 0x6e, 0xc0, 0x27, 0x73, 0xcd,
-		0x57, 0xb7, 0xf0, 0xe9, 0x2e, 0xc8, 0xe2, 0x0c,
-		0xd1, 0xb5, 0x0f, 0xff, 0xf9, 0xec, 0x38, 0xba,
-		0x97, 0xd6, 0x94, 0x9b, 0xd1, 0x79, 0xb6, 0x6a,
-		0x01, 0x17, 0xe4, 0x7e, 0xa6, 0xd5, 0x86, 0x19,
-		0xae, 0xf3, 0xf0, 0x62, 0x73, 0xc0, 0xf0, 0x0a,
-		0x7a, 0x96, 0x93, 0x72, 0x89, 0x7e, 0x25, 0x57,
-		0xf8, 0xf7, 0xd5, 0x1e, 0xe5, 0xac, 0xd6, 0x38,
-		0x4f, 0xe8, 0x81, 0xd1, 0x53, 0x41, 0x07, 0x2d,
-		0x58, 0x34, 0x1c, 0xef, 0x74, 0x2e, 0x61, 0xca,
-		0xd3, 0xeb, 0xd6, 0x93, 0x0a, 0xf2, 0xf2, 0x86,
-		0x9c, 0xe3, 0x7a, 0x52, 0xf5, 0x42, 0xf1, 0x8b,
-		0x10, 0xf2, 0x25, 0x68, 0x7e, 0x61, 0xb1, 0x19,
-		0xcf, 0x8f, 0x5a, 0x53, 0xb7, 0x68, 0x4f, 0x1a,
-		0x71, 0xe9, 0x83, 0x91, 0x3a, 0x78, 0x0f, 0xf7,
-		0xd4, 0x74, 0xf5, 0x06, 0xd2, 0x88, 0xb0, 0x06,
-		0xe5, 0xc0, 0xfb, 0xb3, 0x91, 0xad, 0xc0, 0x84,
-		0x31, 0xf2, 0x3a, 0xcf, 0x63, 0xe6, 0x4a, 0xd3,
-		0x78, 0xbe, 0xde, 0x73, 0x3e, 0x02, 0x8e, 0xb8,
-		0x3a, 0xf6, 0x55, 0xa7, 0xf8, 0x5a, 0xb5, 0x0e,
-		0x0c, 0xc5, 0xe5, 0x66, 0xd5, 0xd2, 0x18, 0xf3,
-		0xef, 0xa5, 0xc9, 0x68, 0x69, 0xe0, 0xcd, 0x00,
-		0x33, 0x99, 0x6e, 0xea, 0xcb, 0x06, 0x7a, 0xe1,
-		0xe1, 0x19, 0x0b, 0xe7, 0x08, 0xcd, 0x09, 0x1b,
-		0x85, 0xec, 0xc4, 0xd4, 0x75, 0xf0, 0xd6, 0xfb,
-		0x84, 0x95, 0x07, 0x44, 0xca, 0xa5, 0x2a, 0x6c,
-		0xc2, 0x00, 0x58, 0x08, 0x87, 0x9e, 0x0a, 0xd4,
-		0x06, 0xe2, 0x91, 0x5f, 0xb7, 0x1b, 0x11, 0xfa,
-		0x85, 0xfc, 0x7c, 0xf2, 0x0f, 0x6e, 0x3c, 0x8a,
-		0xe1, 0x0f, 0xa0, 0x33, 0x84, 0xce, 0x81, 0x4d,
-		0x32, 0x4d, 0xeb, 0x41, 0xcf, 0x5a, 0x05, 0x60,
-		0x47, 0x6c, 0x2a, 0xc4, 0x17, 0xd5, 0x16, 0x3a,
-		0xe4, 0xe7, 0xab, 0x84, 0x94, 0x22, 0xff, 0x56,
-		0xb0, 0x0c, 0x92, 0x6c, 0x19, 0x11, 0x4c, 0xb3,
-		0xed, 0x58, 0x48, 0x84, 0x2a, 0xe2, 0x19, 0x2a,
-		0xe1, 0xc0, 0x56, 0x82, 0x3c, 0x83, 0xb4, 0x58,
-		0x2d, 0xf0, 0xb5, 0x1e, 0x76, 0x85, 0x51, 0xc2,
-		0xe4, 0x95, 0x27, 0x96, 0xd1, 0x90, 0xc3, 0x17,
-		0x75, 0xa1, 0xbb, 0x46, 0x5f, 0xa6, 0xf2, 0xef,
-		0x71, 0x56, 0x92, 0xc5, 0x8a, 0x85, 0x52, 0xe4,
-		0x63, 0x21, 0x6f, 0x55, 0x85, 0x2b, 0x6b, 0x0d,
-		0xc9, 0x92, 0x77, 0x67, 0xe3, 0xff, 0x2a, 0x2b,
-		0x90, 0x01, 0x3d, 0x74, 0x63, 0x04, 0x61, 0x3c,
-		0x8e, 0xf8, 0xfc, 0x04, 0xdd, 0x21, 0x85, 0x92,
-		0x1e, 0x4d, 0x51, 0x8d, 0xb5, 0x6b, 0xf1, 0xda,
-		0x96, 0xf5, 0x8e, 0x3c, 0x38, 0x5a, 0xac, 0x9b,
-		0xba, 0x0c, 0x84, 0x5d, 0x50, 0x12, 0xc7, 0xc5,
-		0x7a, 0xcb, 0xb1, 0xfa, 0x16, 0x93, 0xdf, 0x98,
-		0xda, 0x3f, 0x49, 0xa3, 0x94, 0x78, 0x70, 0xc7,
-		0x0b, 0xb6, 0x91, 0xa6, 0x16, 0x2e, 0xcf, 0xfd,
-		0x51, 0x6a, 0x5b, 0xad, 0x7a, 0xdd, 0xa9, 0x48,
-		0x48, 0xac, 0xd6, 0x45, 0xbc, 0x23, 0x31, 0x1d,
-		0x86, 0x54, 0x8a, 0x7f, 0x04, 0x97, 0x71, 0x9e,
-		0xbc, 0x2e, 0x6b, 0xd9, 0x33, 0xc8, 0x20, 0xc9,
-		0xe0, 0x25, 0x86, 0x59, 0x15, 0xcf, 0x63, 0xe5,
-		0x99, 0xf1, 0x24, 0xf1, 0xba, 0xc4, 0x15, 0x02,
-		0xe2, 0xdb, 0xfe, 0x4a, 0xf8, 0x3b, 0x91, 0x13,
-		0x8d, 0x03, 0x81, 0x9f, 0xb3, 0x3f, 0x04, 0x03,
-		0x58, 0xc0, 0xef, 0x27, 0x82, 0x14, 0xd2, 0x7f,
-		0x93, 0x70, 0xb7, 0xb2, 0x02, 0x21, 0xb3, 0x07,
-		0x7f, 0x1c, 0xef, 0x88, 0xee, 0x29, 0x7a, 0x0b,
-		0x3d, 0x75, 0x5a, 0x93, 0xfe, 0x7f, 0x14, 0xf7,
-		0x4e, 0x4b, 0x7f, 0x21, 0x02, 0xad, 0xf9, 0x43,
-		0x29, 0x1a, 0xe8, 0x1b, 0xf5, 0x32, 0xb2, 0x96,
-		0xe6, 0xe8, 0x96, 0x20, 0x9b, 0x96, 0x8e, 0x7b,
-		0xfe, 0xd8, 0xc9, 0x9c, 0x65, 0x16, 0xd6, 0x68,
-		0x95, 0xf8, 0x22, 0xe2, 0xae, 0x84, 0x03, 0xfd,
-		0x87, 0xa2, 0x72, 0x79, 0x74, 0x95, 0xfa, 0xe1,
-		0xfe, 0xd0, 0x4e, 0x3d, 0x39, 0x2e, 0x67, 0x55,
-		0x71, 0x6c, 0x89, 0x33, 0x49, 0x0c, 0x1b, 0x46,
-		0x92, 0x31, 0x6f, 0xa6, 0xf0, 0x09, 0xbd, 0x2d,
-		0xe2, 0xca, 0xda, 0x18, 0x33, 0xce, 0x67, 0x37,
-		0xfd, 0x6f, 0xcb, 0x9d, 0xbd, 0x42, 0xbc, 0xb2,
-		0x9c, 0x28, 0xcd, 0x65, 0x3c, 0x61, 0xbc, 0xde,
-		0x9d, 0xe1, 0x2a, 0x3e, 0xbf, 0xee, 0x3c, 0xcb,
-		0xb1, 0x50, 0xa9, 0x2c, 0xbe, 0xb5, 0x43, 0xd0,
-		0xec, 0x29, 0xf9, 0x16, 0x6f, 0x31, 0xd9, 0x9b,
-		0x92, 0xb1, 0x32, 0xae, 0x0f, 0xb6, 0x9d, 0x0e,
-		0x25, 0x7f, 0x89, 0x1f, 0x1d, 0x01, 0x68, 0xab,
-		0x3d, 0xd1, 0x74, 0x5b, 0x4c, 0x38, 0x7f, 0x3d,
-		0x33, 0xa5, 0xa2, 0x9f, 0xda, 0x84, 0xa5, 0x82,
-		0x2d, 0x16, 0x66, 0x46, 0x08, 0x30, 0x14, 0x48,
-		0x5e, 0xca, 0xe3, 0xf4, 0x8c, 0xcb, 0x32, 0xc6,
-		0xf1, 0x43, 0x62, 0xc6, 0xef, 0x16, 0xfa, 0x43,
-		0xae, 0x9c, 0x53, 0xe3, 0x49, 0x45, 0x80, 0xfd,
-		0x1d, 0x8c, 0xa9, 0x6d, 0x77, 0x76, 0xaa, 0x40,
-		0xc4, 0x4e, 0x7b, 0x78, 0x6b, 0xe0, 0x1d, 0xce,
-		0x56, 0x3d, 0xf0, 0x11, 0xfe, 0x4f, 0x6a, 0x6d,
-		0x0f, 0x4f, 0x90, 0x38, 0x92, 0x17, 0xfa, 0x56,
-		0x12, 0xa6, 0xa1, 0x0a, 0xea, 0x2f, 0x50, 0xf9,
-		0x60, 0x66, 0x6c, 0x7d, 0x5a, 0x08, 0x8e, 0x3c,
-		0xf3, 0xf0, 0x33, 0x02, 0x11, 0x02, 0xfe, 0x4c,
-		0x56, 0x2b, 0x9f, 0x0c, 0xbd, 0x65, 0x8a, 0x83,
-		0xde, 0x7c, 0x05, 0x26, 0x93, 0x19, 0xcc, 0xf3,
-		0x71, 0x0e, 0xad, 0x2f, 0xb3, 0xc9, 0x38, 0x50,
-		0x64, 0xd5, 0x4c, 0x60, 0x5f, 0x02, 0x13, 0x34,
-		0xc9, 0x75, 0xc4, 0x60, 0xab, 0x2e, 0x17, 0x7d
-};
-
-static const uint8_t AES_CBC_ciphertext_2048B[] = {
-		0x8b, 0x55, 0xbd, 0xfd, 0x2b, 0x35, 0x76, 0x5c,
-		0xd1, 0x90, 0xd7, 0x6a, 0x63, 0x1e, 0x39, 0x71,
-		0x0d, 0x5c, 0xd8, 0x03, 0x00, 0x75, 0xf1, 0x07,
-		0x03, 0x8d, 0x76, 0xeb, 0x3b, 0x00, 0x1e, 0x33,
-		0x88, 0xfc, 0x8f, 0x08, 0x4d, 0x33, 0xf1, 0x3c,
-		0xee, 0xd0, 0x5d, 0x19, 0x8b, 0x3c, 0x50, 0x86,
-		0xfd, 0x8d, 0x58, 0x21, 0xb4, 0xae, 0x0f, 0x81,
-		0xe9, 0x9f, 0xc9, 0xc0, 0x90, 0xf7, 0x04, 0x6f,
-		0x39, 0x1d, 0x8a, 0x3f, 0x8d, 0x32, 0x23, 0xb5,
-		0x1f, 0xcc, 0x8a, 0x12, 0x2d, 0x46, 0x82, 0x5e,
-		0x6a, 0x34, 0x8c, 0xb1, 0x93, 0x70, 0x3b, 0xde,
-		0x55, 0xaf, 0x16, 0x35, 0x99, 0x84, 0xd5, 0x88,
-		0xc9, 0x54, 0xb1, 0xb2, 0xd3, 0xeb, 0x9e, 0x55,
-		0x9a, 0xa9, 0xa7, 0xf5, 0xda, 0x29, 0xcf, 0xe1,
-		0x98, 0x64, 0x45, 0x77, 0xf2, 0x12, 0x69, 0x8f,
-		0x78, 0xd8, 0x82, 0x41, 0xb2, 0x9f, 0xe2, 0x1c,
-		0x63, 0x9b, 0x24, 0x81, 0x67, 0x95, 0xa2, 0xff,
-		0x26, 0x9d, 0x65, 0x48, 0x61, 0x30, 0x66, 0x41,
-		0x68, 0x84, 0xbb, 0x59, 0x14, 0x8e, 0x9a, 0x62,
-		0xb6, 0xca, 0xda, 0xbe, 0x7c, 0x41, 0x52, 0x6e,
-		0x1b, 0x86, 0xbf, 0x08, 0xeb, 0x37, 0x84, 0x60,
-		0xe4, 0xc4, 0x1e, 0xa8, 0x4c, 0x84, 0x60, 0x2f,
-		0x70, 0x90, 0xf2, 0x26, 0xe7, 0x65, 0x0c, 0xc4,
-		0x58, 0x36, 0x8e, 0x4d, 0xdf, 0xff, 0x9a, 0x39,
-		0x93, 0x01, 0xcf, 0x6f, 0x6d, 0xde, 0xef, 0x79,
-		0xb0, 0xce, 0xe2, 0x98, 0xdb, 0x85, 0x8d, 0x62,
-		0x9d, 0xb9, 0x63, 0xfd, 0xf0, 0x35, 0xb5, 0xa9,
-		0x1b, 0xf9, 0xe5, 0xd4, 0x2e, 0x22, 0x2d, 0xcc,
-		0x42, 0xbf, 0x0e, 0x51, 0xf7, 0x15, 0x07, 0x32,
-		0x75, 0x5b, 0x74, 0xbb, 0x00, 0xef, 0xd4, 0x66,
-		0x8b, 0xad, 0x71, 0x53, 0x94, 0xd7, 0x7d, 0x2c,
-		0x40, 0x3e, 0x69, 0xa0, 0x4c, 0x86, 0x5e, 0x06,
-		0xed, 0xdf, 0x22, 0xe2, 0x24, 0x25, 0x4e, 0x9b,
-		0x5f, 0x49, 0x74, 0xba, 0xed, 0xb1, 0xa6, 0xeb,
-		0xae, 0x3f, 0xc6, 0x9e, 0x0b, 0x29, 0x28, 0x9a,
-		0xb6, 0xb2, 0x74, 0x58, 0xec, 0xa6, 0x4a, 0xed,
-		0xe5, 0x10, 0x00, 0x85, 0xe1, 0x63, 0x41, 0x61,
-		0x30, 0x7c, 0x97, 0xcf, 0x75, 0xcf, 0xb6, 0xf3,
-		0xf7, 0xda, 0x35, 0x3f, 0x85, 0x8c, 0x64, 0xca,
-		0xb7, 0xea, 0x7f, 0xe4, 0xa3, 0x4d, 0x30, 0x84,
-		0x8c, 0x9c, 0x80, 0x5a, 0x50, 0xa5, 0x64, 0xae,
-		0x26, 0xd3, 0xb5, 0x01, 0x73, 0x36, 0x8a, 0x92,
-		0x49, 0xc4, 0x1a, 0x94, 0x81, 0x9d, 0xf5, 0x6c,
-		0x50, 0xe1, 0x58, 0x0b, 0x75, 0xdd, 0x6b, 0x6a,
-		0xca, 0x69, 0xea, 0xc3, 0x33, 0x90, 0x9f, 0x3b,
-		0x65, 0x5d, 0x5e, 0xee, 0x31, 0xb7, 0x32, 0xfd,
-		0x56, 0x83, 0xb6, 0xfb, 0xa8, 0x04, 0xfc, 0x1e,
-		0x11, 0xfb, 0x02, 0x23, 0x53, 0x49, 0x45, 0xb1,
-		0x07, 0xfc, 0xba, 0xe7, 0x5f, 0x5d, 0x2d, 0x7f,
-		0x9e, 0x46, 0xba, 0xe9, 0xb0, 0xdb, 0x32, 0x04,
-		0xa4, 0xa7, 0x98, 0xab, 0x91, 0xcd, 0x02, 0x05,
-		0xf5, 0x74, 0x31, 0x98, 0x83, 0x3d, 0x33, 0x11,
-		0x0e, 0xe3, 0x8d, 0xa8, 0xc9, 0x0e, 0xf3, 0xb9,
-		0x47, 0x67, 0xe9, 0x79, 0x2b, 0x34, 0xcd, 0x9b,
-		0x45, 0x75, 0x29, 0xf0, 0xbf, 0xcc, 0xda, 0x3a,
-		0x91, 0xb2, 0x15, 0x27, 0x7a, 0xe5, 0xf5, 0x6a,
-		0x5e, 0xbe, 0x2c, 0x98, 0xe8, 0x40, 0x96, 0x4f,
-		0x8a, 0x09, 0xfd, 0xf6, 0xb2, 0xe7, 0x45, 0xb6,
-		0x08, 0xc1, 0x69, 0xe1, 0xb3, 0xc4, 0x24, 0x34,
-		0x07, 0x85, 0xd5, 0xa9, 0x78, 0xca, 0xfa, 0x4b,
-		0x01, 0x19, 0x4d, 0x95, 0xdc, 0xa5, 0xc1, 0x9c,
-		0xec, 0x27, 0x5b, 0xa6, 0x54, 0x25, 0xbd, 0xc8,
-		0x0a, 0xb7, 0x11, 0xfb, 0x4e, 0xeb, 0x65, 0x2e,
-		0xe1, 0x08, 0x9c, 0x3a, 0x45, 0x44, 0x33, 0xef,
-		0x0d, 0xb9, 0xff, 0x3e, 0x68, 0x9c, 0x61, 0x2b,
-		0x11, 0xb8, 0x5c, 0x47, 0x0f, 0x94, 0xf2, 0xf8,
-		0x0b, 0xbb, 0x99, 0x18, 0x85, 0xa3, 0xba, 0x44,
-		0xf3, 0x79, 0xb3, 0x63, 0x2c, 0x1f, 0x2a, 0x35,
-		0x3b, 0x23, 0x98, 0xab, 0xf4, 0x16, 0x36, 0xf8,
-		0xde, 0x86, 0xa4, 0xd4, 0x75, 0xff, 0x51, 0xf9,
-		0xeb, 0x42, 0x5f, 0x55, 0xe2, 0xbe, 0xd1, 0x5b,
-		0xb5, 0x38, 0xeb, 0xb4, 0x4d, 0xec, 0xec, 0x99,
-		0xe1, 0x39, 0x43, 0xaa, 0x64, 0xf7, 0xc9, 0xd8,
-		0xf2, 0x9a, 0x71, 0x43, 0x39, 0x17, 0xe8, 0xa8,
-		0xa2, 0xe2, 0xa4, 0x2c, 0x18, 0x11, 0x49, 0xdf,
-		0x18, 0xdd, 0x85, 0x6e, 0x65, 0x96, 0xe2, 0xba,
-		0xa1, 0x0a, 0x2c, 0xca, 0xdc, 0x5f, 0xe4, 0xf4,
-		0x35, 0x03, 0xb2, 0xa9, 0xda, 0xcf, 0xb7, 0x6d,
-		0x65, 0x82, 0x82, 0x67, 0x9d, 0x0e, 0xf3, 0xe8,
-		0x85, 0x6c, 0x69, 0xb8, 0x4c, 0xa6, 0xc6, 0x2e,
-		0x40, 0xb5, 0x54, 0x28, 0x95, 0xe4, 0x57, 0xe0,
-		0x5b, 0xf8, 0xde, 0x59, 0xe0, 0xfd, 0x89, 0x48,
-		0xac, 0x56, 0x13, 0x54, 0xb9, 0x1b, 0xf5, 0x59,
-		0x97, 0xb6, 0xb3, 0xe8, 0xac, 0x2d, 0xfc, 0xd2,
-		0xea, 0x57, 0x96, 0x57, 0xa8, 0x26, 0x97, 0x2c,
-		0x01, 0x89, 0x56, 0xea, 0xec, 0x8c, 0x53, 0xd5,
-		0xd7, 0x9e, 0xc9, 0x98, 0x0b, 0xad, 0x03, 0x75,
-		0xa0, 0x6e, 0x98, 0x8b, 0x97, 0x8d, 0x8d, 0x85,
-		0x7d, 0x74, 0xa7, 0x2d, 0xde, 0x67, 0x0c, 0xcd,
-		0x54, 0xb8, 0x15, 0x7b, 0xeb, 0xf5, 0x84, 0xb9,
-		0x78, 0xab, 0xd8, 0x68, 0x91, 0x1f, 0x6a, 0xa6,
-		0x28, 0x22, 0xf7, 0x00, 0x49, 0x00, 0xbe, 0x41,
-		0x71, 0x0a, 0xf5, 0xe7, 0x9f, 0xb4, 0x11, 0x41,
-		0x3f, 0xcd, 0xa9, 0xa9, 0x01, 0x8b, 0x6a, 0xeb,
-		0x54, 0x4c, 0x58, 0x92, 0x68, 0x02, 0x0e, 0xe9,
-		0xed, 0x65, 0x4c, 0xfb, 0x95, 0x48, 0x58, 0xa2,
-		0xaa, 0x57, 0x69, 0x13, 0x82, 0x0c, 0x2c, 0x4b,
-		0x5d, 0x4e, 0x18, 0x30, 0xef, 0x1c, 0xb1, 0x9d,
-		0x05, 0x05, 0x02, 0x1c, 0x97, 0xc9, 0x48, 0xfe,
-		0x5e, 0x7b, 0x77, 0xa3, 0x1f, 0x2a, 0x81, 0x42,
-		0xf0, 0x4b, 0x85, 0x12, 0x9c, 0x1f, 0x44, 0xb1,
-		0x14, 0x91, 0x92, 0x65, 0x77, 0xb1, 0x87, 0xa2,
-		0xfc, 0xa4, 0xe7, 0xd2, 0x9b, 0xf2, 0x17, 0xf0,
-		0x30, 0x1c, 0x8d, 0x33, 0xbc, 0x25, 0x28, 0x48,
-		0xfd, 0x30, 0x79, 0x0a, 0x99, 0x3e, 0xb4, 0x0f,
-		0x1e, 0xa6, 0x68, 0x76, 0x19, 0x76, 0x29, 0xac,
-		0x5d, 0xb8, 0x1e, 0x42, 0xd6, 0x85, 0x04, 0xbf,
-		0x64, 0x1c, 0x2d, 0x53, 0xe9, 0x92, 0x78, 0xf8,
-		0xc3, 0xda, 0x96, 0x92, 0x10, 0x6f, 0x45, 0x85,
-		0xaf, 0x5e, 0xcc, 0xa8, 0xc0, 0xc6, 0x2e, 0x73,
-		0x51, 0x3f, 0x5e, 0xd7, 0x52, 0x33, 0x71, 0x12,
-		0x6d, 0x85, 0xee, 0xea, 0x85, 0xa8, 0x48, 0x2b,
-		0x40, 0x64, 0x6d, 0x28, 0x73, 0x16, 0xd7, 0x82,
-		0xd9, 0x90, 0xed, 0x1f, 0xa7, 0x5c, 0xb1, 0x5c,
-		0x27, 0xb9, 0x67, 0x8b, 0xb4, 0x17, 0x13, 0x83,
-		0x5f, 0x09, 0x72, 0x0a, 0xd7, 0xa0, 0xec, 0x81,
-		0x59, 0x19, 0xb9, 0xa6, 0x5a, 0x37, 0x34, 0x14,
-		0x47, 0xf6, 0xe7, 0x6c, 0xd2, 0x09, 0x10, 0xe7,
-		0xdd, 0xbb, 0x02, 0xd1, 0x28, 0xfa, 0x01, 0x2c,
-		0x93, 0x64, 0x2e, 0x1b, 0x4c, 0x02, 0x52, 0xcb,
-		0x07, 0xa1, 0xb6, 0x46, 0x02, 0x80, 0xd9, 0x8f,
-		0x5c, 0x62, 0xbe, 0x78, 0x9e, 0x75, 0xc4, 0x97,
-		0x91, 0x39, 0x12, 0x65, 0xb9, 0x3b, 0xc2, 0xd1,
-		0xaf, 0xf2, 0x1f, 0x4e, 0x4d, 0xd1, 0xf0, 0x9f,
-		0xb7, 0x12, 0xfd, 0xe8, 0x75, 0x18, 0xc0, 0x9d,
-		0x8c, 0x70, 0xff, 0x77, 0x05, 0xb6, 0x1a, 0x1f,
-		0x96, 0x48, 0xf6, 0xfe, 0xd5, 0x5d, 0x98, 0xa5,
-		0x72, 0x1c, 0x84, 0x76, 0x3e, 0xb8, 0x87, 0x37,
-		0xdd, 0xd4, 0x3a, 0x45, 0xdd, 0x09, 0xd8, 0xe7,
-		0x09, 0x2f, 0x3e, 0x33, 0x9e, 0x7b, 0x8c, 0xe4,
-		0x85, 0x12, 0x4e, 0xf8, 0x06, 0xb7, 0xb1, 0x85,
-		0x24, 0x96, 0xd8, 0xfe, 0x87, 0x92, 0x81, 0xb1,
-		0xa3, 0x38, 0xb9, 0x56, 0xe1, 0xf6, 0x36, 0x41,
-		0xbb, 0xd6, 0x56, 0x69, 0x94, 0x57, 0xb3, 0xa4,
-		0xca, 0xa4, 0xe1, 0x02, 0x3b, 0x96, 0x71, 0xe0,
-		0xb2, 0x2f, 0x85, 0x48, 0x1b, 0x4a, 0x41, 0x80,
-		0x4b, 0x9c, 0xe0, 0xc9, 0x39, 0xb8, 0xb1, 0xca,
-		0x64, 0x77, 0x46, 0x58, 0xe6, 0x84, 0xd5, 0x2b,
-		0x65, 0xce, 0xe9, 0x09, 0xa3, 0xaa, 0xfb, 0x83,
-		0xa9, 0x28, 0x68, 0xfd, 0xcd, 0xfd, 0x76, 0x83,
-		0xe1, 0x20, 0x22, 0x77, 0x3a, 0xa3, 0xb2, 0x93,
-		0x14, 0x91, 0xfc, 0xe2, 0x17, 0x63, 0x2b, 0xa6,
-		0x29, 0x38, 0x7b, 0x9b, 0x8b, 0x15, 0x77, 0xd6,
-		0xaa, 0x92, 0x51, 0x53, 0x50, 0xff, 0xa0, 0x35,
-		0xa0, 0x59, 0x7d, 0xf0, 0x11, 0x23, 0x49, 0xdf,
-		0x5a, 0x21, 0xc2, 0xfe, 0x35, 0xa0, 0x1d, 0xe2,
-		0xae, 0xa2, 0x8a, 0x61, 0x5b, 0xf7, 0xf1, 0x1c,
-		0x1c, 0xec, 0xc4, 0xf6, 0xdc, 0xaa, 0xc8, 0xc2,
-		0xe5, 0xa1, 0x2e, 0x14, 0xe5, 0xc6, 0xc9, 0x73,
-		0x03, 0x78, 0xeb, 0xed, 0xe0, 0x3e, 0xc5, 0xf4,
-		0xf1, 0x50, 0xb2, 0x01, 0x91, 0x96, 0xf5, 0xbb,
-		0xe1, 0x32, 0xcd, 0xa8, 0x66, 0xbf, 0x73, 0x85,
-		0x94, 0xd6, 0x7e, 0x68, 0xc5, 0xe4, 0xed, 0xd5,
-		0xe3, 0x67, 0x4c, 0xa5, 0xb3, 0x1f, 0xdf, 0xf8,
-		0xb3, 0x73, 0x5a, 0xac, 0xeb, 0x46, 0x16, 0x24,
-		0xab, 0xca, 0xa4, 0xdd, 0x87, 0x0e, 0x24, 0x83,
-		0x32, 0x04, 0x4c, 0xd8, 0xda, 0x7d, 0xdc, 0xe3,
-		0x01, 0x93, 0xf3, 0xc1, 0x5b, 0xbd, 0xc3, 0x1d,
-		0x40, 0x62, 0xde, 0x94, 0x03, 0x85, 0x91, 0x2a,
-		0xa0, 0x25, 0x10, 0xd3, 0x32, 0x9f, 0x93, 0x00,
-		0xa7, 0x8a, 0xfa, 0x77, 0x7c, 0xaf, 0x4d, 0xc8,
-		0x7a, 0xf3, 0x16, 0x2b, 0xba, 0xeb, 0x74, 0x51,
-		0xb8, 0xdd, 0x32, 0xad, 0x68, 0x7d, 0xdd, 0xca,
-		0x60, 0x98, 0xc9, 0x9b, 0xb6, 0x5d, 0x4d, 0x3a,
-		0x66, 0x8a, 0xbe, 0x05, 0xf9, 0x0c, 0xc5, 0xba,
-		0x52, 0x82, 0x09, 0x1f, 0x5a, 0x66, 0x89, 0x69,
-		0xa3, 0x5d, 0x93, 0x50, 0x7d, 0x44, 0xc3, 0x2a,
-		0xb8, 0xab, 0xec, 0xa6, 0x5a, 0xae, 0x4a, 0x6a,
-		0xcd, 0xfd, 0xb6, 0xff, 0x3d, 0x98, 0x05, 0xd9,
-		0x5b, 0x29, 0xc4, 0x6f, 0xe0, 0x76, 0xe2, 0x3f,
-		0xec, 0xd7, 0xa4, 0x91, 0x63, 0xf5, 0x4e, 0x4b,
-		0xab, 0x20, 0x8c, 0x3a, 0x41, 0xed, 0x8b, 0x4b,
-		0xb9, 0x01, 0x21, 0xc0, 0x6d, 0xfd, 0x70, 0x5b,
-		0x20, 0x92, 0x41, 0x89, 0x74, 0xb7, 0xe9, 0x8b,
-		0xfc, 0x6d, 0x17, 0x3f, 0x7f, 0x89, 0x3d, 0x6b,
-		0x8f, 0xbc, 0xd2, 0x57, 0xe9, 0xc9, 0x6e, 0xa7,
-		0x19, 0x26, 0x18, 0xad, 0xef, 0xb5, 0x87, 0xbf,
-		0xb8, 0xa8, 0xd6, 0x7d, 0xdd, 0x5f, 0x94, 0x54,
-		0x09, 0x92, 0x2b, 0xf5, 0x04, 0xf7, 0x36, 0x69,
-		0x8e, 0xf4, 0xdc, 0x1d, 0x6e, 0x55, 0xbb, 0xe9,
-		0x13, 0x05, 0x83, 0x35, 0x9c, 0xed, 0xcf, 0x8c,
-		0x26, 0x8c, 0x7b, 0xc7, 0x0b, 0xba, 0xfd, 0xe2,
-		0x84, 0x5c, 0x2a, 0x79, 0x43, 0x99, 0xb2, 0xc3,
-		0x82, 0x87, 0xc8, 0xcd, 0x37, 0x6d, 0xa1, 0x2b,
-		0x39, 0xb2, 0x38, 0x99, 0xd9, 0xfc, 0x02, 0x15,
-		0x55, 0x21, 0x62, 0x59, 0xeb, 0x00, 0x86, 0x08,
-		0x20, 0xbe, 0x1a, 0x62, 0x4d, 0x7e, 0xdf, 0x68,
-		0x73, 0x5b, 0x5f, 0xaf, 0x84, 0x96, 0x2e, 0x1f,
-		0x6b, 0x03, 0xc9, 0xa6, 0x75, 0x18, 0xe9, 0xd4,
-		0xbd, 0xc8, 0xec, 0x9a, 0x5a, 0xb3, 0x99, 0xab,
-		0x5f, 0x7c, 0x08, 0x7f, 0x69, 0x4d, 0x52, 0xa2,
-		0x30, 0x17, 0x3b, 0x16, 0x15, 0x1b, 0x11, 0x62,
-		0x3e, 0x80, 0x4b, 0x85, 0x7c, 0x9c, 0xd1, 0x3a,
-		0x13, 0x01, 0x5e, 0x45, 0xf1, 0xc8, 0x5f, 0xcd,
-		0x0e, 0x21, 0xf5, 0x82, 0xd4, 0x7b, 0x5c, 0x45,
-		0x27, 0x6b, 0xef, 0xfe, 0xb8, 0xc0, 0x6f, 0xdc,
-		0x60, 0x7b, 0xe4, 0xd5, 0x75, 0x71, 0xe6, 0xe8,
-		0x7d, 0x6b, 0x6d, 0x80, 0xaf, 0x76, 0x41, 0x58,
-		0xb7, 0xac, 0xb7, 0x13, 0x2f, 0x81, 0xcc, 0xf9,
-		0x19, 0x97, 0xe8, 0xee, 0x40, 0x91, 0xfc, 0x89,
-		0x13, 0x1e, 0x67, 0x9a, 0xdb, 0x8f, 0x8f, 0xc7,
-		0x4a, 0xc9, 0xaf, 0x2f, 0x67, 0x01, 0x3c, 0xb8,
-		0xa8, 0x3e, 0x78, 0x93, 0x1b, 0xdf, 0xbb, 0x34,
-		0x0b, 0x1a, 0xfa, 0xc2, 0x2d, 0xc5, 0x1c, 0xec,
-		0x97, 0x4f, 0x48, 0x41, 0x15, 0x0e, 0x75, 0xed,
-		0x66, 0x8c, 0x17, 0x7f, 0xb1, 0x48, 0x13, 0xc1,
-		0xfb, 0x60, 0x06, 0xf9, 0x72, 0x41, 0x3e, 0xcf,
-		0x6e, 0xb6, 0xc8, 0xeb, 0x4b, 0x5a, 0xd2, 0x0c,
-		0x28, 0xda, 0x02, 0x7a, 0x46, 0x21, 0x42, 0xb5,
-		0x34, 0xda, 0xcb, 0x5e, 0xbd, 0x66, 0x5c, 0xca,
-		0xff, 0x52, 0x43, 0x89, 0xf9, 0x10, 0x9a, 0x9e,
-		0x9b, 0xe3, 0xb0, 0x51, 0xe9, 0xf3, 0x0a, 0x35,
-		0x77, 0x54, 0xcc, 0xac, 0xa6, 0xf1, 0x2e, 0x36,
-		0x89, 0xac, 0xc5, 0xc6, 0x62, 0x5a, 0xc0, 0x6d,
-		0xc4, 0xe1, 0xf7, 0x64, 0x30, 0xff, 0x11, 0x40,
-		0x13, 0x89, 0xd8, 0xd7, 0x73, 0x3f, 0x93, 0x08,
-		0x68, 0xab, 0x66, 0x09, 0x1a, 0xea, 0x78, 0xc9,
-		0x52, 0xf2, 0xfd, 0x93, 0x1b, 0x94, 0xbe, 0x5c,
-		0xe5, 0x00, 0x6e, 0x00, 0xb9, 0xea, 0x27, 0xaa,
-		0xb3, 0xee, 0xe3, 0xc8, 0x6a, 0xb0, 0xc1, 0x8e,
-		0x9b, 0x54, 0x40, 0x10, 0x96, 0x06, 0xe8, 0xb3,
-		0xf5, 0x55, 0x77, 0xd7, 0x5c, 0x94, 0xc1, 0x74,
-		0xf3, 0x07, 0x64, 0xac, 0x1c, 0xde, 0xc7, 0x22,
-		0xb0, 0xbf, 0x2a, 0x5a, 0xc0, 0x8f, 0x8a, 0x83,
-		0x50, 0xc2, 0x5e, 0x97, 0xa0, 0xbe, 0x49, 0x7e,
-		0x47, 0xaf, 0xa7, 0x20, 0x02, 0x35, 0xa4, 0x57,
-		0xd9, 0x26, 0x63, 0xdb, 0xf1, 0x34, 0x42, 0x89,
-		0x36, 0xd1, 0x77, 0x6f, 0xb1, 0xea, 0x79, 0x7e,
-		0x95, 0x10, 0x5a, 0xee, 0xa3, 0xae, 0x6f, 0xba,
-		0xa9, 0xef, 0x5a, 0x7e, 0x34, 0x03, 0x04, 0x07,
-		0x92, 0xd6, 0x07, 0x79, 0xaa, 0x14, 0x90, 0x97,
-		0x05, 0x4d, 0xa6, 0x27, 0x10, 0x5c, 0x25, 0x24,
-		0xcb, 0xcc, 0xf6, 0x77, 0x9e, 0x43, 0x23, 0xd4,
-		0x98, 0xef, 0x22, 0xa8, 0xad, 0xf2, 0x26, 0x08,
-		0x59, 0x69, 0xa4, 0xc3, 0x97, 0xe0, 0x5c, 0x6f,
-		0xeb, 0x3d, 0xd4, 0x62, 0x6e, 0x80, 0x61, 0x02,
-		0xf4, 0xfc, 0x94, 0x79, 0xbb, 0x4e, 0x6d, 0xd7,
-		0x30, 0x5b, 0x10, 0x11, 0x5a, 0x3d, 0xa7, 0x50,
-		0x1d, 0x9a, 0x13, 0x5f, 0x4f, 0xa8, 0xa7, 0xb6,
-		0x39, 0xc7, 0xea, 0xe6, 0x19, 0x61, 0x69, 0xc7,
-		0x9a, 0x3a, 0xeb, 0x9d, 0xdc, 0xf7, 0x06, 0x37,
-		0xbd, 0xac, 0xe3, 0x18, 0xff, 0xfe, 0x11, 0xdb,
-		0x67, 0x42, 0xb4, 0xea, 0xa8, 0xbd, 0xb0, 0x76,
-		0xd2, 0x74, 0x32, 0xc2, 0xa4, 0x9c, 0xe7, 0x60,
-		0xc5, 0x30, 0x9a, 0x57, 0x66, 0xcd, 0x0f, 0x02,
-		0x4c, 0xea, 0xe9, 0xd3, 0x2a, 0x5c, 0x09, 0xc2,
-		0xff, 0x6a, 0xde, 0x5d, 0xb7, 0xe9, 0x75, 0x6b,
-		0x29, 0x94, 0xd6, 0xf7, 0xc3, 0xdf, 0xfb, 0x70,
-		0xec, 0xb5, 0x8c, 0xb0, 0x78, 0x7a, 0xee, 0x52,
-		0x5f, 0x8c, 0xae, 0x85, 0xe5, 0x98, 0xa2, 0xb7,
-		0x7c, 0x02, 0x2a, 0xcc, 0x9e, 0xde, 0x99, 0x5f,
-		0x84, 0x20, 0xbb, 0xdc, 0xf2, 0xd2, 0x13, 0x46,
-		0x3c, 0xd6, 0x4d, 0xe7, 0x50, 0xef, 0x55, 0xc3,
-		0x96, 0x9f, 0xec, 0x6c, 0xd8, 0xe2, 0xea, 0xed,
-		0xc7, 0x33, 0xc9, 0xb3, 0x1c, 0x4f, 0x1d, 0x83,
-		0x1d, 0xe4, 0xdd, 0xb2, 0x24, 0x8f, 0xf9, 0xf5
-};
-
-
-static const uint8_t HMAC_SHA256_ciphertext_64B_digest[] = {
-		0xc5, 0x6d, 0x4f, 0x29, 0xf4, 0xd2, 0xcc, 0x87,
-		0x3c, 0x81, 0x02, 0x6d, 0x38, 0x7a, 0x67, 0x3e,
-		0x95, 0x9c, 0x5c, 0x8f, 0xda, 0x5c, 0x06, 0xe0,
-		0x65, 0xf1, 0x6c, 0x51, 0x52, 0x49, 0x3e, 0x5f
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_128B_digest[] = {
-		0x76, 0x64, 0x2d, 0x69, 0x71, 0x5d, 0x6a, 0xd8,
-		0x9f, 0x74, 0x11, 0x2f, 0x58, 0xe0, 0x4a, 0x2f,
-		0x6c, 0x88, 0x5e, 0x4d, 0x9c, 0x79, 0x83, 0x1c,
-		0x8a, 0x14, 0xd0, 0x07, 0xfb, 0xbf, 0x6c, 0x8f
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_256B_digest[] = {
-		0x05, 0xa7, 0x44, 0xcd, 0x91, 0x8c, 0x95, 0xcf,
-		0x7b, 0x8f, 0xd3, 0x90, 0x86, 0x7e, 0x7b, 0xb9,
-		0x05, 0xd6, 0x6e, 0x7a, 0xc1, 0x7b, 0x26, 0xff,
-		0xd3, 0x4b, 0xe0, 0x22, 0x8b, 0xa8, 0x47, 0x52
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_512B_digest[] = {
-		0x08, 0xb7, 0x29, 0x54, 0x18, 0x7e, 0x97, 0x49,
-		0xc6, 0x7c, 0x9f, 0x94, 0xa5, 0x4f, 0xa2, 0x25,
-		0xd0, 0xe2, 0x30, 0x7b, 0xad, 0x93, 0xc9, 0x12,
-		0x0f, 0xf0, 0xf0, 0x71, 0xc2, 0xf6, 0x53, 0x8f
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_768B_digest[] = {
-		0xe4, 0x3e, 0x73, 0x93, 0x03, 0xaf, 0x6f, 0x9c,
-		0xca, 0x57, 0x3b, 0x4a, 0x6e, 0x83, 0x58, 0xf5,
-		0x66, 0xc2, 0xb4, 0xa7, 0xe0, 0xee, 0x63, 0x6b,
-		0x48, 0xb7, 0x50, 0x45, 0x69, 0xdf, 0x5c, 0x5b
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_1024B_digest[] = {
-		0x03, 0xb9, 0x96, 0x26, 0xdc, 0x1c, 0xab, 0xe2,
-		0xf5, 0x70, 0x55, 0x15, 0x67, 0x6e, 0x48, 0x11,
-		0xe7, 0x67, 0xea, 0xfa, 0x5c, 0x6b, 0x28, 0x22,
-		0xc9, 0x0e, 0x67, 0x04, 0xb3, 0x71, 0x7f, 0x88
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_1280B_digest[] = {
-		0x01, 0x91, 0xb8, 0x78, 0xd3, 0x21, 0x74, 0xa5,
-		0x1c, 0x8b, 0xd4, 0xd2, 0xc0, 0x49, 0xd7, 0xd2,
-		0x16, 0x46, 0x66, 0x85, 0x50, 0x6d, 0x08, 0xcc,
-		0xc7, 0x0a, 0xa3, 0x71, 0xcc, 0xde, 0xee, 0xdc
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_1536B_digest[] = {
-		0xf2, 0xe5, 0xe9, 0x57, 0x53, 0xd7, 0x69, 0x28,
-		0x7b, 0x69, 0xb5, 0x49, 0xa3, 0x31, 0x56, 0x5f,
-		0xa4, 0xe9, 0x87, 0x26, 0x2f, 0xe0, 0x2d, 0xd6,
-		0x08, 0x44, 0x01, 0x71, 0x0c, 0x93, 0x85, 0x84
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_1792B_digest[] = {
-		0xf6, 0x57, 0x62, 0x01, 0xbf, 0x2d, 0xea, 0x4a,
-		0xef, 0x43, 0x85, 0x60, 0x18, 0xdf, 0x8b, 0xb4,
-		0x60, 0xc0, 0xfd, 0x2f, 0x90, 0x15, 0xe6, 0x91,
-		0x56, 0x61, 0x68, 0x7f, 0x5e, 0x92, 0xa8, 0xdd
-};
-
-static const uint8_t HMAC_SHA256_ciphertext_2048B_digest[] = {
-		0x81, 0x1a, 0x29, 0xbc, 0x6b, 0x9f, 0xbb, 0xb8,
-		0xef, 0x71, 0x7b, 0x1f, 0x6f, 0xd4, 0x7e, 0x68,
-		0x3a, 0x9c, 0xb9, 0x98, 0x22, 0x81, 0xfa, 0x95,
-		0xee, 0xbc, 0x7f, 0x23, 0x29, 0x88, 0x76, 0xb8
-};
-
-struct crypto_data_params {
-	const char *name;
-	uint16_t length;
-	const char *plaintext;
-	struct crypto_expected_output {
-		const uint8_t *ciphertext;
-		const uint8_t *digest;
-	} expected;
-};
-
-#define MAX_PACKET_SIZE_INDEX	10
-
-struct crypto_data_params aes_cbc_hmac_sha256_output[MAX_PACKET_SIZE_INDEX] = {
-	{ "64B", 64, &plaintext_quote[sizeof(plaintext_quote) - 1 - 64],
-		{ AES_CBC_ciphertext_64B, HMAC_SHA256_ciphertext_64B_digest } },
-	{ "128B", 128, &plaintext_quote[sizeof(plaintext_quote) - 1 - 128],
-		{ AES_CBC_ciphertext_128B, HMAC_SHA256_ciphertext_128B_digest } },
-	{ "256B", 256, &plaintext_quote[sizeof(plaintext_quote) - 1 - 256],
-		{ AES_CBC_ciphertext_256B, HMAC_SHA256_ciphertext_256B_digest } },
-	{ "512B", 512, &plaintext_quote[sizeof(plaintext_quote) - 1 - 512],
-		{ AES_CBC_ciphertext_512B, HMAC_SHA256_ciphertext_512B_digest } },
-	{ "768B", 768, &plaintext_quote[sizeof(plaintext_quote) - 1 - 768],
-		{ AES_CBC_ciphertext_768B, HMAC_SHA256_ciphertext_768B_digest } },
-	{ "1024B", 1024, &plaintext_quote[sizeof(plaintext_quote) - 1 - 1024],
-		{ AES_CBC_ciphertext_1024B, HMAC_SHA256_ciphertext_1024B_digest } },
-	{ "1280B", 1280, &plaintext_quote[sizeof(plaintext_quote) - 1 - 1280],
-		{ AES_CBC_ciphertext_1280B, HMAC_SHA256_ciphertext_1280B_digest } },
-	{ "1536B", 1536, &plaintext_quote[sizeof(plaintext_quote) - 1 - 1536],
-		{ AES_CBC_ciphertext_1536B, HMAC_SHA256_ciphertext_1536B_digest } },
-	{ "1792B", 1792, &plaintext_quote[sizeof(plaintext_quote) - 1 - 1792],
-		{ AES_CBC_ciphertext_1792B, HMAC_SHA256_ciphertext_1792B_digest } },
-	{ "2048B", 2048, &plaintext_quote[sizeof(plaintext_quote) - 1 - 2048],
-		{ AES_CBC_ciphertext_2048B, HMAC_SHA256_ciphertext_2048B_digest } }
-};
-
-static int
-test_perf_crypto_qp_vary_burst_size(uint16_t dev_num)
-{
-	uint32_t num_to_submit = 4096;
-	struct rte_crypto_op *c_ops[num_to_submit];
-	struct rte_crypto_op *proc_ops[num_to_submit];
-	uint64_t failed_polls, retries, start_cycles, end_cycles, total_cycles = 0;
-	uint32_t burst_sent, burst_received;
-	uint32_t i, burst_size, num_sent, num_received;
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct crypto_unittest_params *ut_params = &unittest_params;
-	struct crypto_data_params *data_params = aes_cbc_hmac_sha256_output;
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices available. Is kernel driver loaded?\n");
-		return TEST_FAILED;
-	}
-
-	/* Setup Cipher Parameters */
-	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
-	ut_params->cipher_xform.next = &ut_params->auth_xform;
-
-	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
-	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
-	ut_params->cipher_xform.cipher.key.data = aes_cbc_128_key;
-	ut_params->cipher_xform.cipher.key.length = CIPHER_IV_LENGTH_AES_CBC;
-	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
-	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
-
-	/* Setup HMAC Parameters */
-	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
-	ut_params->auth_xform.next = NULL;
-
-	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
-	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA256_HMAC;
-	ut_params->auth_xform.auth.key.data = hmac_sha256_key;
-	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA256;
-	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA256;
-
-	/* Create Crypto session*/
-
-	test_crypto_session = rte_cryptodev_sym_session_create(ts_params->sess_mp);
-
-	rte_cryptodev_sym_session_init(ts_params->dev_id, test_crypto_session,
-			&ut_params->cipher_xform, ts_params->sess_mp);
-
-	TEST_ASSERT_NOT_NULL(test_crypto_session, "Session creation failed");
-
-	/* Generate Crypto op data structure(s) */
-	for (i = 0; i < num_to_submit ; i++) {
-		struct rte_mbuf *m = setup_test_string(ts_params->mbuf_mp,
-				data_params[0].expected.ciphertext,
-				data_params[0].length, 0);
-		TEST_ASSERT_NOT_NULL(m, "Failed to allocate tx_buf");
-
-		ut_params->digest = (uint8_t *)rte_pktmbuf_append(m,
-				DIGEST_BYTE_LENGTH_SHA256);
-		TEST_ASSERT_NOT_NULL(ut_params->digest,
-				"no room to append digest");
-
-		rte_memcpy(ut_params->digest, data_params[0].expected.digest,
-			DIGEST_BYTE_LENGTH_SHA256);
-
-
-		struct rte_crypto_op *op =
-				rte_crypto_op_alloc(ts_params->op_mpool,
-						RTE_CRYPTO_OP_TYPE_SYMMETRIC);
-
-		rte_crypto_op_attach_sym_session(op, test_crypto_session);
-
-		op->sym->auth.digest.data = ut_params->digest;
-		op->sym->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(m,
-				data_params[0].length);
-
-		op->sym->auth.data.offset = 0;
-		op->sym->auth.data.length = data_params[0].length;
-
-		rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
-				aes_cbc_128_iv, CIPHER_IV_LENGTH_AES_CBC);
-
-		op->sym->cipher.data.offset = 0;
-		op->sym->cipher.data.length = data_params[0].length;
-
-		op->sym->m_src = m;
-
-		c_ops[i] = op;
-	}
-
-	printf("\nTest to measure the IA cycle cost using AES128_CBC_SHA256_HMAC "
-			"algorithm with a constant request size of %u.",
-			data_params[0].length);
-	printf("\nThis test will keep retries at 0 and only measure IA cycle "
-			"cost for each request.");
-	printf("\nDev No\tQP No\tNum Sent\tNum Received\tTx/Rx burst");
-	printf("\tRetries (Device Busy)\tAverage IA cycle cost "
-			"(assuming 0 retries)");
-	for (i = 2; i <= 128 ; i *= 2) {
-		num_sent = 0;
-		num_received = 0;
-		retries = 0;
-		failed_polls = 0;
-		burst_size = i;
-		total_cycles = 0;
-		while (num_sent < num_to_submit) {
-			start_cycles = rte_rdtsc_precise();
-			burst_sent = rte_cryptodev_enqueue_burst(dev_num,
-					0, &c_ops[num_sent],
-					((num_to_submit-num_sent) < burst_size) ?
-					num_to_submit-num_sent : burst_size);
-			if (burst_sent == 0)
-				retries++;
-			else
-				num_sent += burst_sent;
-			end_cycles = rte_rdtsc_precise();
-			total_cycles += (end_cycles - start_cycles);
-			/*
-			 * Wait until requests have been sent.
-			 */
-			rte_delay_ms(1);
-
-			start_cycles = rte_rdtsc_precise();
-			burst_received = rte_cryptodev_dequeue_burst(
-					dev_num, 0, proc_ops, burst_size);
-			if (burst_received == 0)
-				failed_polls++;
-			else
-				num_received += burst_received;
-			end_cycles = rte_rdtsc_precise();
-			total_cycles += end_cycles - start_cycles;
-		}
-
-		while (num_received != num_to_submit) {
-			if (gbl_driver_id ==
-					rte_cryptodev_driver_id_get(
-					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
-				rte_cryptodev_enqueue_burst(dev_num, 0,
-						NULL, 0);
-
-			burst_received = rte_cryptodev_dequeue_burst(
-					dev_num, 0, proc_ops, burst_size);
-			if (burst_received == 0)
-				failed_polls++;
-			else
-				num_received += burst_received;
-		}
-
-		printf("\n%u\t%u\t%u\t\t%u\t\t%u", dev_num, 0,
-					num_sent, num_received, burst_size);
-		printf("\t\t%"PRIu64, retries);
-		printf("\t\t\t%"PRIu64, total_cycles/num_received);
-	}
-	printf("\n");
-
-	for (i = 0; i < num_to_submit ; i++) {
-		rte_pktmbuf_free(c_ops[i]->sym->m_src);
-		rte_crypto_op_free(c_ops[i]);
-	}
-	return TEST_SUCCESS;
-}
-
-static int
-test_perf_snow3G_optimise_cyclecount(struct perf_test_params *pparams)
-{
-	uint32_t num_to_submit = pparams->total_operations;
-	struct rte_crypto_op *c_ops[num_to_submit];
-	struct rte_crypto_op *proc_ops[num_to_submit];
-	uint64_t failed_polls, retries, start_cycles, end_cycles, total_cycles = 0;
-	uint32_t burst_sent = 0, burst_received = 0;
-	uint32_t i, burst_size, num_sent, num_ops_received;
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	static struct rte_cryptodev_sym_session *sess;
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices found. Is PMD build configured?\n");
-		printf("\nAnd is kernel driver loaded for HW PMDs?\n");
-		return TEST_FAILED;
-	}
-
-	/* Create Crypto session*/
-	if (test_perf_create_snow3g_session(ts_params->dev_id,
-			pparams->chain, pparams->cipher_algo,
-			pparams->key_length, pparams->auth_algo) == 0)
-		sess = test_crypto_session;
-	else
-		sess = NULL;
-	TEST_ASSERT_NOT_NULL(sess, "Session creation failed");
-
-	/* Generate Crypto op data structure(s)*/
-	for (i = 0; i < num_to_submit ; i++) {
-		struct rte_mbuf *m = test_perf_create_pktmbuf(
-						ts_params->mbuf_mp,
-						pparams->buf_size);
-		TEST_ASSERT_NOT_NULL(m, "Failed to allocate tx_buf");
-
-		struct rte_crypto_op *op =
-				rte_crypto_op_alloc(ts_params->op_mpool,
-						RTE_CRYPTO_OP_TYPE_SYMMETRIC);
-		TEST_ASSERT_NOT_NULL(op, "Failed to allocate op");
-
-		op = test_perf_set_crypto_op_snow3g(op, m, sess, pparams->buf_size);
-		TEST_ASSERT_NOT_NULL(op, "Failed to attach op to session");
-
-		c_ops[i] = op;
-	}
-
-	if (pparams->chain == AEAD)
-		printf("\nOn %s dev%u qp%u, %s, aead algo:%s, "
-			"Packet Size %u bytes",
-			pmd_name(gbl_driver_id),
-			ts_params->dev_id, 0,
-			chain_mode_name(pparams->chain),
-			rte_crypto_aead_algorithm_strings[pparams->aead_algo],
-			pparams->buf_size);
-	else
-		printf("\nOn %s dev%u qp%u, %s, cipher algo:%s, auth_algo:%s, "
-			"Packet Size %u bytes",
-			pmd_name(gbl_driver_id),
-			ts_params->dev_id, 0,
-			chain_mode_name(pparams->chain),
-			rte_crypto_cipher_algorithm_strings[pparams->cipher_algo],
-			rte_crypto_auth_algorithm_strings[pparams->auth_algo],
-			pparams->buf_size);
-	printf("\nOps Tx\tOps Rx\tOps/burst  ");
-	printf("Retries  EmptyPolls\tIACycles/CyOp\tIACycles/Burst\tIACycles/Byte");
-
-	for (i = 2; i <= 128 ; i *= 2) {
-		num_sent = 0;
-		num_ops_received = 0;
-		retries = 0;
-		failed_polls = 0;
-		burst_size = i;
-		total_cycles = 0;
-		while (num_sent < num_to_submit) {
-			start_cycles = rte_rdtsc_precise();
-			burst_sent = rte_cryptodev_enqueue_burst(ts_params->dev_id,
-					0, &c_ops[num_sent],
-					((num_to_submit-num_sent) < burst_size) ?
-					num_to_submit-num_sent : burst_size);
-			end_cycles = rte_rdtsc_precise();
-			if (burst_sent == 0)
-				retries++;
-			num_sent += burst_sent;
-			total_cycles += (end_cycles - start_cycles);
-
-			/* Wait until requests have been sent. */
-
-			rte_delay_ms(1);
-
-			start_cycles = rte_rdtsc_precise();
-			burst_received = rte_cryptodev_dequeue_burst(
-					ts_params->dev_id, 0, proc_ops, burst_size);
-			end_cycles = rte_rdtsc_precise();
-			if (burst_received < burst_sent)
-				failed_polls++;
-			num_ops_received += burst_received;
-
-			total_cycles += end_cycles - start_cycles;
-		}
-
-		while (num_ops_received != num_to_submit) {
-			if (gbl_driver_id ==
-					rte_cryptodev_driver_id_get(
-					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
-				rte_cryptodev_enqueue_burst(ts_params->dev_id, 0,
-						NULL, 0);
-			start_cycles = rte_rdtsc_precise();
-			burst_received = rte_cryptodev_dequeue_burst(
-					ts_params->dev_id, 0, proc_ops, burst_size);
-			end_cycles = rte_rdtsc_precise();
-			total_cycles += end_cycles - start_cycles;
-			if (burst_received == 0)
-				failed_polls++;
-			num_ops_received += burst_received;
-		}
-
-		printf("\n%u\t%u\t%u", num_sent, num_ops_received, burst_size);
-		printf("\t\t%"PRIu64, retries);
-		printf("\t%"PRIu64, failed_polls);
-		printf("\t\t%"PRIu64, total_cycles/num_ops_received);
-		printf("\t\t%"PRIu64, (total_cycles/num_ops_received)*burst_size);
-		printf("\t\t%"PRIu64, total_cycles/(num_ops_received*pparams->buf_size));
-	}
-	printf("\n");
-
-	for (i = 0; i < num_to_submit ; i++) {
-		rte_pktmbuf_free(c_ops[i]->sym->m_src);
-		rte_crypto_op_free(c_ops[i]);
-	}
-
-	rte_cryptodev_sym_session_clear(ts_params->dev_id,
-				sess);
-	rte_cryptodev_sym_session_free(sess);
-
-	return TEST_SUCCESS;
-}
-
-static int
-test_perf_snow3G_vary_burst_size(void)
-{
-	unsigned total_operations = 4096;
-	/*no need to vary pkt size for QAT, should have no effect on IA cycles */
-	uint16_t buf_lengths[] = {40};
-	uint8_t i, j;
-
-	struct perf_test_params params_set[] = {
-			{
-					.chain = CIPHER_ONLY,
-					.cipher_algo  = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
-					.key_length = 16,
-					.auth_algo  = RTE_CRYPTO_AUTH_NULL,
-			},
-			{
-					.chain = HASH_ONLY,
-					.cipher_algo = RTE_CRYPTO_CIPHER_NULL,
-					.auth_algo  = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
-					.key_length = 16
-			},
-	};
-
-	printf("\n\nStart %s.", __func__);
-	printf("\nThis Test measures the average IA cycle cost using a "
-			"constant request(packet) size. ");
-	printf("Cycle cost is only valid when indicators show device is not busy,"
-			" i.e. Retries and EmptyPolls = 0");
-
-	for (i = 0; i < RTE_DIM(params_set); i++) {
-		printf("\n");
-		params_set[i].total_operations = total_operations;
-
-		for (j = 0;
-			j < RTE_DIM(buf_lengths);
-			j++) {
-
-			params_set[i].buf_size = buf_lengths[j];
-
-			test_perf_snow3G_optimise_cyclecount(&params_set[i]);
-		}
-
-	}
-
-	return 0;
-}
-
-static int
-test_perf_openssl_optimise_cyclecount(struct perf_test_params *pparams)
-{
-	uint32_t num_to_submit = pparams->total_operations;
-	struct rte_crypto_op *c_ops[num_to_submit];
-	struct rte_crypto_op *proc_ops[num_to_submit];
-	uint64_t failed_polls, retries, start_cycles,
-		end_cycles, total_cycles = 0;
-	uint32_t burst_sent = 0, burst_received = 0;
-	uint32_t i, burst_size, num_sent, num_ops_received;
-
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-
-	static struct rte_cryptodev_sym_session *sess;
-
-	static struct rte_crypto_op *(*test_perf_set_crypto_op)
-			(struct rte_crypto_op *, struct rte_mbuf *,
-					struct rte_cryptodev_sym_session *,
-					unsigned int,
-					enum chain_mode);
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices found. Is PMD build configured?\n");
-		return TEST_FAILED;
-	}
-
-	/* Create Crypto session*/
-	if (test_perf_create_openssl_session(ts_params->dev_id,
-			pparams->chain, pparams->cipher_algo,
-			pparams->key_length, pparams->auth_algo,
-			pparams->aead_algo) == 0)
-		sess = test_crypto_session;
-	else
-		sess = NULL;
-	TEST_ASSERT_NOT_NULL(sess, "Session creation failed");
-
-	/* Generate Crypto op data structure(s)*/
-	for (i = 0; i < num_to_submit ; i++) {
-		struct rte_mbuf *m = test_perf_create_pktmbuf(
-						ts_params->mbuf_mp,
-						pparams->buf_size);
-		TEST_ASSERT_NOT_NULL(m, "Failed to allocate tx_buf");
-
-		struct rte_crypto_op *op =
-				rte_crypto_op_alloc(ts_params->op_mpool,
-						RTE_CRYPTO_OP_TYPE_SYMMETRIC);
-		TEST_ASSERT_NOT_NULL(op, "Failed to allocate op");
-
-		if (pparams->chain == AEAD)
-			test_perf_set_crypto_op =
-						test_perf_set_crypto_op_aes_gcm;
-		else {
-			switch (pparams->cipher_algo) {
-			case RTE_CRYPTO_CIPHER_3DES_CBC:
-			case RTE_CRYPTO_CIPHER_3DES_CTR:
-				test_perf_set_crypto_op = test_perf_set_crypto_op_3des;
-				break;
-			case RTE_CRYPTO_CIPHER_AES_CBC:
-			case RTE_CRYPTO_CIPHER_AES_CTR:
-				test_perf_set_crypto_op = test_perf_set_crypto_op_aes;
-				break;
-			default:
-				return TEST_FAILED;
-			}
-		}
-
-		op = test_perf_set_crypto_op(op, m, sess, pparams->buf_size,
-				pparams->chain);
-		TEST_ASSERT_NOT_NULL(op, "Failed to attach op to session");
-
-		c_ops[i] = op;
-	}
-
-	if (pparams->chain == AEAD)
-		printf("\nOn %s dev%u qp%u, %s, aead_algo:%s, "
-			"key length:%u, Packet Size %u bytes",
-			pmd_name(gbl_driver_id),
-			ts_params->dev_id, 0,
-			chain_mode_name(pparams->chain),
-			rte_crypto_aead_algorithm_strings[pparams->aead_algo],
-			pparams->key_length,
-			pparams->buf_size);
-	else
-		printf("\nOn %s dev%u qp%u, %s, cipher algo:%s, auth_algo:%s, "
-			"key length:%u, Packet Size %u bytes",
-			pmd_name(gbl_driver_id),
-			ts_params->dev_id, 0,
-			chain_mode_name(pparams->chain),
-			rte_crypto_cipher_algorithm_strings[pparams->cipher_algo],
-			rte_crypto_auth_algorithm_strings[pparams->auth_algo],
-			pparams->key_length,
-			pparams->buf_size);
-	printf("\nOps Tx\tOps Rx\tOps/burst  ");
-	printf("Retries  EmptyPolls\tIACycles/CyOp\tIACycles/Burst\t"
-			"IACycles/Byte");
-
-	for (i = 2; i <= 128 ; i *= 2) {
-		num_sent = 0;
-		num_ops_received = 0;
-		retries = 0;
-		failed_polls = 0;
-		burst_size = i;
-		total_cycles = 0;
-		while (num_sent < num_to_submit) {
-			start_cycles = rte_rdtsc_precise();
-			burst_sent = rte_cryptodev_enqueue_burst(
-					ts_params->dev_id,
-					0, &c_ops[num_sent],
-					((num_to_submit - num_sent) <
-						burst_size) ?
-					num_to_submit - num_sent : burst_size);
-			end_cycles = rte_rdtsc_precise();
-			if (burst_sent == 0)
-				retries++;
-			num_sent += burst_sent;
-			total_cycles += (end_cycles - start_cycles);
-
-			/* Wait until requests have been sent. */
-			rte_delay_ms(1);
-
-			start_cycles = rte_rdtsc_precise();
-			burst_received = rte_cryptodev_dequeue_burst(
-					ts_params->dev_id, 0, proc_ops,
-					burst_size);
-			end_cycles = rte_rdtsc_precise();
-			if (burst_received < burst_sent)
-				failed_polls++;
-			num_ops_received += burst_received;
-
-			total_cycles += end_cycles - start_cycles;
-		}
-
-		while (num_ops_received != num_to_submit) {
-			/* Sending 0 length burst to flush sw crypto device */
-			rte_cryptodev_enqueue_burst(ts_params->dev_id, 0,
-					NULL, 0);
-
-			start_cycles = rte_rdtsc_precise();
-			burst_received = rte_cryptodev_dequeue_burst(
-					ts_params->dev_id, 0, proc_ops,
-					burst_size);
-			end_cycles = rte_rdtsc_precise();
-
-			total_cycles += end_cycles - start_cycles;
-			if (burst_received == 0)
-				failed_polls++;
-			num_ops_received += burst_received;
-		}
-
-		printf("\n%u\t%u\t%u", num_sent, num_ops_received, burst_size);
-		printf("\t\t%"PRIu64, retries);
-		printf("\t%"PRIu64, failed_polls);
-		printf("\t\t%"PRIu64, total_cycles/num_ops_received);
-		printf("\t\t%"PRIu64, (total_cycles/num_ops_received) *
-				burst_size);
-		printf("\t\t%"PRIu64,
-				total_cycles /
-				(num_ops_received * pparams->buf_size));
-	}
-	printf("\n");
-
-	for (i = 0; i < num_to_submit ; i++) {
-		rte_pktmbuf_free(c_ops[i]->sym->m_src);
-		rte_crypto_op_free(c_ops[i]);
-	}
-
-	rte_cryptodev_sym_session_clear(ts_params->dev_id, sess);
-	rte_cryptodev_sym_session_free(sess);
-
-	return TEST_SUCCESS;
-}
-
-static int
-test_perf_armv8_optimise_cyclecount(struct perf_test_params *pparams)
-{
-	uint32_t num_to_submit = pparams->total_operations;
-	struct rte_crypto_op *c_ops[num_to_submit];
-	struct rte_crypto_op *proc_ops[num_to_submit];
-	uint64_t failed_polls, retries, start_cycles, end_cycles,
-		 total_cycles = 0;
-	uint32_t burst_sent = 0, burst_received = 0;
-	uint32_t i, burst_size, num_sent, num_ops_received;
-	uint32_t nb_ops;
-
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-
-	static struct rte_cryptodev_sym_session *sess;
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices found. Is PMD build configured?\n");
-		return TEST_FAILED;
-	}
-
-	/* Create Crypto session*/
-	if (test_perf_create_armv8_session(ts_params->dev_id,
-			pparams->chain, pparams->cipher_algo,
-			pparams->key_length, pparams->auth_algo) == 0)
-		sess = test_crypto_session;
-	else
-		sess = NULL;
-
-	/* Generate Crypto op data structure(s)*/
-	for (i = 0; i < num_to_submit ; i++) {
-		struct rte_mbuf *m = test_perf_create_pktmbuf(
-						ts_params->mbuf_mp,
-						pparams->buf_size);
-		TEST_ASSERT_NOT_NULL(m, "Failed to allocate tx_buf");
-
-		struct rte_crypto_op *op =
-				rte_crypto_op_alloc(ts_params->op_mpool,
-						RTE_CRYPTO_OP_TYPE_SYMMETRIC);
-		TEST_ASSERT_NOT_NULL(op, "Failed to allocate op");
-
-		op = test_perf_set_crypto_op_aes(op, m, sess, pparams->buf_size,
-				pparams->chain);
-		TEST_ASSERT_NOT_NULL(op, "Failed to attach op to session");
-
-		c_ops[i] = op;
-	}
-
-	printf("\nOn %s dev%u qp%u, %s, cipher algo:%s, cipher key length:%u, "
-			"auth_algo:%s, Packet Size %u bytes",
-			pmd_name(gbl_driver_id),
-			ts_params->dev_id, 0,
-			chain_mode_name(pparams->chain),
-			rte_crypto_cipher_algorithm_strings[pparams->cipher_algo],
-			pparams->key_length,
-			rte_crypto_auth_algorithm_strings[pparams->auth_algo],
-			pparams->buf_size);
-	printf("\nOps Tx\tOps Rx\tOps/burst  ");
-	printf("Retries  "
-		"EmptyPolls\tIACycles/CyOp\tIACycles/Burst\tIACycles/Byte");
-
-	for (i = 2; i <= 128 ; i *= 2) {
-		num_sent = 0;
-		num_ops_received = 0;
-		retries = 0;
-		failed_polls = 0;
-		burst_size = i;
-		total_cycles = 0;
-		while (num_sent < num_to_submit) {
-			if ((num_to_submit - num_sent) < burst_size)
-				nb_ops = num_to_submit - num_sent;
-			else
-				nb_ops = burst_size;
-
-			start_cycles = rte_rdtsc();
-			burst_sent = rte_cryptodev_enqueue_burst(
-				ts_params->dev_id,
-				0, &c_ops[num_sent],
-				nb_ops);
-			end_cycles = rte_rdtsc();
-
-			if (burst_sent == 0)
-				retries++;
-			num_sent += burst_sent;
-			total_cycles += (end_cycles - start_cycles);
-
-			start_cycles = rte_rdtsc();
-			burst_received = rte_cryptodev_dequeue_burst(
-					ts_params->dev_id, 0, proc_ops,
-					burst_size);
-			end_cycles = rte_rdtsc();
-			if (burst_received < burst_sent)
-				failed_polls++;
-			num_ops_received += burst_received;
-
-			total_cycles += end_cycles - start_cycles;
-		}
-
-		while (num_ops_received != num_to_submit) {
-			/* Sending 0 length burst to flush sw crypto device */
-			rte_cryptodev_enqueue_burst(
-						ts_params->dev_id, 0, NULL, 0);
-
-			start_cycles = rte_rdtsc();
-			burst_received = rte_cryptodev_dequeue_burst(
-				ts_params->dev_id, 0, proc_ops, burst_size);
-			end_cycles = rte_rdtsc();
-
-			total_cycles += end_cycles - start_cycles;
-			if (burst_received == 0)
-				failed_polls++;
-			num_ops_received += burst_received;
-		}
-
-		printf("\n%u\t%u\t%u", num_sent, num_ops_received, burst_size);
-		printf("\t\t%"PRIu64, retries);
-		printf("\t%"PRIu64, failed_polls);
-		printf("\t\t%"PRIu64, total_cycles/num_ops_received);
-		printf("\t\t%"PRIu64,
-			(total_cycles/num_ops_received)*burst_size);
-		printf("\t\t%"PRIu64,
-			total_cycles/(num_ops_received*pparams->buf_size));
-	}
-	printf("\n");
-
-	for (i = 0; i < num_to_submit ; i++) {
-		rte_pktmbuf_free(c_ops[i]->sym->m_src);
-		rte_crypto_op_free(c_ops[i]);
-	}
-
-	return TEST_SUCCESS;
-}
-
-static uint32_t get_auth_key_max_length(enum rte_crypto_auth_algorithm algo)
-{
-	switch (algo) {
-	case RTE_CRYPTO_AUTH_SNOW3G_UIA2:
-		return 16;
-	case RTE_CRYPTO_AUTH_SHA1_HMAC:
-		return 64;
-	case RTE_CRYPTO_AUTH_SHA224_HMAC:
-		return 64;
-	case RTE_CRYPTO_AUTH_SHA256_HMAC:
-		return 64;
-	case RTE_CRYPTO_AUTH_SHA384_HMAC:
-		return 128;
-	case RTE_CRYPTO_AUTH_SHA512_HMAC:
-		return 128;
-	default:
-		return 0;
-	}
-}
-
-static uint32_t get_auth_digest_length(enum rte_crypto_auth_algorithm algo)
-{
-	switch (algo) {
-	case RTE_CRYPTO_AUTH_SNOW3G_UIA2:
-		return 4;
-	case RTE_CRYPTO_AUTH_SHA1_HMAC:
-		return TRUNCATED_DIGEST_BYTE_LENGTH_SHA1;
-	case RTE_CRYPTO_AUTH_SHA224_HMAC:
-		return TRUNCATED_DIGEST_BYTE_LENGTH_SHA224;
-	case RTE_CRYPTO_AUTH_SHA256_HMAC:
-		return TRUNCATED_DIGEST_BYTE_LENGTH_SHA256;
-	case RTE_CRYPTO_AUTH_SHA384_HMAC:
-		return TRUNCATED_DIGEST_BYTE_LENGTH_SHA384;
-	case RTE_CRYPTO_AUTH_SHA512_HMAC:
-		return TRUNCATED_DIGEST_BYTE_LENGTH_SHA512;
-	default:
-		return 0;
-	}
-}
-
-static uint32_t get_aead_digest_length(enum rte_crypto_aead_algorithm algo)
-{
-	switch (algo) {
-	case RTE_CRYPTO_AEAD_AES_GCM:
-		return DIGEST_BYTE_LENGTH_AES_GCM;
-	default:
-		return 0;
-	}
-}
-
-static uint8_t aes_key[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-static uint8_t aes_iv[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-static uint8_t aes_gcm_aad[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-static uint8_t triple_des_key[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
-static uint8_t triple_des_iv[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
-static uint8_t hmac_sha_key[] = {
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-static uint8_t snow3g_cipher_key[] = {
-		0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC5, 0xB3, 0x00,
-		0x95, 0x2C, 0x49, 0x10, 0x48, 0x81, 0xFF, 0x48
-};
-
-static uint8_t snow3g_iv[] = {
-		0x72, 0xA4, 0xF2, 0x0F, 0x64, 0x00, 0x00, 0x00,
-		0x72, 0xA4, 0xF2, 0x0F, 0x64, 0x00, 0x00, 0x00
-};
-
-static uint8_t snow3g_hash_key[] = {
-		0xC7, 0x36, 0xC6, 0xAA, 0xB2, 0x2B, 0xFF, 0xF9,
-		0x1E, 0x26, 0x98, 0xD2, 0xE2, 0x2A, 0xD5, 0x7E
-};
-
-static int
-test_perf_create_aes_sha_session(uint8_t dev_id, enum chain_mode chain,
-		enum rte_crypto_cipher_algorithm cipher_algo,
-		unsigned cipher_key_len,
-		enum rte_crypto_auth_algorithm auth_algo)
-{
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct rte_crypto_sym_xform cipher_xform = { 0 };
-	struct rte_crypto_sym_xform auth_xform = { 0 };
-
-
-	/* Setup Cipher Parameters */
-	cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
-	cipher_xform.cipher.algo = cipher_algo;
-	cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
-
-	cipher_xform.cipher.key.data = aes_key;
-	cipher_xform.cipher.key.length = cipher_key_len;
-	cipher_xform.cipher.iv.offset = IV_OFFSET;
-	cipher_xform.cipher.iv.length = AES_CIPHER_IV_LENGTH;
-	if (chain != CIPHER_ONLY) {
-		/* Setup HMAC Parameters */
-		auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
-		auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
-		auth_xform.auth.algo = auth_algo;
-		auth_xform.auth.key.data = hmac_sha_key;
-		auth_xform.auth.key.length = get_auth_key_max_length(auth_algo);
-		auth_xform.auth.digest_length =
-					get_auth_digest_length(auth_algo);
-	}
-
-	test_crypto_session = rte_cryptodev_sym_session_create(ts_params->sess_mp);
-	switch (chain) {
-	case CIPHER_HASH:
-		cipher_xform.next = &auth_xform;
-		auth_xform.next = NULL;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &cipher_xform,
-				ts_params->sess_mp);
-	case HASH_CIPHER:
-		auth_xform.next = &cipher_xform;
-		cipher_xform.next = NULL;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &auth_xform,
-				ts_params->sess_mp);
-	case CIPHER_ONLY:
-		cipher_xform.next = NULL;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &cipher_xform,
-				ts_params->sess_mp);
-	default:
-		return -1;
-	}
-}
-
-#define SNOW3G_CIPHER_IV_LENGTH 16
-
-static int
-test_perf_create_snow3g_session(uint8_t dev_id, enum chain_mode chain,
-		enum rte_crypto_cipher_algorithm cipher_algo, unsigned cipher_key_len,
-		enum rte_crypto_auth_algorithm auth_algo)
-{
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct rte_crypto_sym_xform cipher_xform = {0};
-	struct rte_crypto_sym_xform auth_xform = {0};
-
-
-	/* Setup Cipher Parameters */
-	cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
-	cipher_xform.cipher.algo = cipher_algo;
-	cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
-
-	cipher_xform.cipher.key.data = snow3g_cipher_key;
-	cipher_xform.cipher.key.length = cipher_key_len;
-	cipher_xform.cipher.iv.offset = IV_OFFSET;
-	cipher_xform.cipher.iv.length = SNOW3G_CIPHER_IV_LENGTH;
-
-
-	/* Setup HMAC Parameters */
-	auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
-	auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
-	auth_xform.auth.algo = auth_algo;
-
-	auth_xform.auth.key.data = snow3g_hash_key;
-	auth_xform.auth.key.length =  get_auth_key_max_length(auth_algo);
-	auth_xform.auth.digest_length = get_auth_digest_length(auth_algo);
-	/* Auth IV will be after cipher IV */
-	auth_xform.auth.iv.offset = IV_OFFSET + SNOW3G_CIPHER_IV_LENGTH;
-	auth_xform.auth.iv.length = SNOW3G_CIPHER_IV_LENGTH;
-
-	test_crypto_session = rte_cryptodev_sym_session_create(ts_params->sess_mp);
-	switch (chain) {
-	case CIPHER_HASH:
-		cipher_xform.next = &auth_xform;
-		auth_xform.next = NULL;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &cipher_xform,
-				ts_params->sess_mp);
-	case HASH_CIPHER:
-		auth_xform.next = &cipher_xform;
-		cipher_xform.next = NULL;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &auth_xform,
-				ts_params->sess_mp);
-	case CIPHER_ONLY:
-		cipher_xform.next = NULL;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &cipher_xform,
-				ts_params->sess_mp);
-	case HASH_ONLY:
-		auth_xform.next = NULL;
-		/* Create Crypto session */
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &auth_xform,
-				ts_params->sess_mp);
-	default:
-		return -1;
-	}
-}
-
-static int
-test_perf_create_openssl_session(uint8_t dev_id, enum chain_mode chain,
-		enum rte_crypto_cipher_algorithm cipher_algo,
-		unsigned int key_len,
-		enum rte_crypto_auth_algorithm auth_algo,
-		enum rte_crypto_aead_algorithm aead_algo)
-{
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct rte_crypto_sym_xform cipher_xform = { 0 };
-	struct rte_crypto_sym_xform auth_xform = { 0 };
-	struct rte_crypto_sym_xform aead_xform = { 0 };
-
-	if (chain == CIPHER_HASH || chain == HASH_CIPHER) {
-		/* Setup Cipher Parameters */
-		cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
-		cipher_xform.cipher.algo = cipher_algo;
-		cipher_xform.cipher.iv.offset = IV_OFFSET;
-		cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
-
-		switch (cipher_algo) {
-		case RTE_CRYPTO_CIPHER_3DES_CBC:
-		case RTE_CRYPTO_CIPHER_3DES_CTR:
-			cipher_xform.cipher.key.data = triple_des_key;
-			cipher_xform.cipher.iv.length = TRIPLE_DES_CIPHER_IV_LENGTH;
-			break;
-		case RTE_CRYPTO_CIPHER_AES_CBC:
-		case RTE_CRYPTO_CIPHER_AES_CTR:
-			cipher_xform.cipher.key.data = aes_key;
-			cipher_xform.cipher.iv.length = AES_CIPHER_IV_LENGTH;
-			break;
-		default:
-			return -1;
-		}
-
-		cipher_xform.cipher.key.length = key_len;
-
-		/* Setup Auth Parameters */
-		auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
-		auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
-		auth_xform.auth.algo = auth_algo;
-
-		switch (auth_algo) {
-		case RTE_CRYPTO_AUTH_SHA1_HMAC:
-			auth_xform.auth.key.data = hmac_sha_key;
-			break;
-		default:
-			return -1;
-		}
-
-		auth_xform.auth.key.length =  get_auth_key_max_length(auth_algo);
-		auth_xform.auth.digest_length = get_auth_digest_length(auth_algo);
-	} else if (chain == AEAD) {
-		/* Setup AEAD Parameters */
-		aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
-		aead_xform.aead.op = RTE_CRYPTO_AEAD_OP_ENCRYPT;
-		aead_xform.aead.algo = aead_algo;
-		aead_xform.aead.iv.offset = IV_OFFSET;
-
-		switch (aead_algo) {
-		case RTE_CRYPTO_AEAD_AES_GCM:
-			aead_xform.aead.key.data = aes_key;
-			aead_xform.aead.iv.length = AES_CIPHER_IV_LENGTH;
-			aead_xform.aead.aad_length = AES_GCM_AAD_LENGTH;
-			aead_xform.aead.digest_length = get_aead_digest_length(aead_algo);
-			break;
-		default:
-			return -1;
-		}
-
-		aead_xform.aead.key.length = key_len;
-	}
-
-	test_crypto_session = rte_cryptodev_sym_session_create(ts_params->sess_mp);
-	switch (chain) {
-	case CIPHER_HASH:
-		cipher_xform.next = &auth_xform;
-		auth_xform.next = NULL;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &cipher_xform,
-				ts_params->sess_mp);
-	case HASH_CIPHER:
-		auth_xform.next = &cipher_xform;
-		cipher_xform.next = NULL;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &auth_xform,
-				ts_params->sess_mp);
-	case AEAD:
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &aead_xform,
-				ts_params->sess_mp);
-	default:
-		return -1;
-	}
-}
-
-static int
-test_perf_create_armv8_session(uint8_t dev_id, enum chain_mode chain,
-		enum rte_crypto_cipher_algorithm cipher_algo,
-		unsigned int cipher_key_len,
-		enum rte_crypto_auth_algorithm auth_algo)
-{
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct rte_crypto_sym_xform cipher_xform = { 0 };
-	struct rte_crypto_sym_xform auth_xform = { 0 };
-
-	/* Setup Cipher Parameters */
-	cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
-	cipher_xform.cipher.algo = cipher_algo;
-
-	switch (cipher_algo) {
-	case RTE_CRYPTO_CIPHER_AES_CBC:
-		cipher_xform.cipher.key.data = aes_cbc_128_key;
-		break;
-	default:
-		return -1;
-	}
-
-	cipher_xform.cipher.key.length = cipher_key_len;
-	cipher_xform.cipher.iv.offset = IV_OFFSET;
-	cipher_xform.cipher.iv.length = AES_CIPHER_IV_LENGTH;
-
-	/* Setup Auth Parameters */
-	auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
-	auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
-	auth_xform.auth.algo = auth_algo;
-
-	auth_xform.auth.digest_length = get_auth_digest_length(auth_algo);
-
-	test_crypto_session = rte_cryptodev_sym_session_create(ts_params->sess_mp);
-
-	switch (chain) {
-	case CIPHER_HASH:
-		cipher_xform.next = &auth_xform;
-		auth_xform.next = NULL;
-		/* Encrypt and hash the result */
-		cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &cipher_xform,
-				ts_params->sess_mp);
-	case HASH_CIPHER:
-		auth_xform.next = &cipher_xform;
-		cipher_xform.next = NULL;
-		/* Hash encrypted message and decrypt */
-		cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
-		/* Create Crypto session*/
-		return rte_cryptodev_sym_session_init(dev_id,
-				test_crypto_session, &auth_xform,
-				ts_params->sess_mp);
-	default:
-		return -1;
-	}
-}
-
-static struct rte_mbuf *
-test_perf_create_pktmbuf(struct rte_mempool *mpool, unsigned buf_sz)
-{
-	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
-
-	if (rte_pktmbuf_append(m, buf_sz) == NULL) {
-		rte_pktmbuf_free(m);
-		return NULL;
-	}
-
-	memset(rte_pktmbuf_mtod(m, uint8_t *), 0, buf_sz);
-
-	return m;
-}
-
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_aes(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess, unsigned int data_len,
-		enum chain_mode chain)
-{
-	if (rte_crypto_op_attach_sym_session(op, sess) != 0) {
-		rte_crypto_op_free(op);
-		return NULL;
-	}
-
-	/* Authentication Parameters */
-	if (chain == CIPHER_ONLY) {
-		op->sym->auth.digest.data = NULL;
-		op->sym->auth.digest.phys_addr = 0;
-		op->sym->auth.data.offset = 0;
-		op->sym->auth.data.length = 0;
-	} else {
-		op->sym->auth.digest.data = rte_pktmbuf_mtod_offset(m,
-				 uint8_t *, data_len);
-		op->sym->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(m,
-				data_len);
-		op->sym->auth.data.offset = 0;
-		op->sym->auth.data.length = data_len;
-	}
-
-
-	/* Copy the IV at the end of the crypto operation */
-	rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
-			aes_iv, AES_CIPHER_IV_LENGTH);
-
-	/* Cipher Parameters */
-	op->sym->cipher.data.offset = 0;
-	op->sym->cipher.data.length = data_len;
-
-	op->sym->m_src = m;
-
-	return op;
-}
-
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_aes_gcm(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess, unsigned int data_len,
-		enum chain_mode chain __rte_unused)
-{
-	if (rte_crypto_op_attach_sym_session(op, sess) != 0) {
-		rte_crypto_op_free(op);
-		return NULL;
-	}
-
-	/* Authentication Parameters */
-	op->sym->aead.digest.data = (uint8_t *)m->buf_addr +
-					(m->data_off + data_len);
-	op->sym->aead.digest.phys_addr =
-				rte_pktmbuf_mtophys_offset(m, data_len);
-	op->sym->aead.aad.data = aes_gcm_aad;
-
-	/* Copy IV at the end of the crypto operation */
-	rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
-			aes_iv, AES_CIPHER_IV_LENGTH);
-
-	/* Data lengths/offsets Parameters */
-	op->sym->aead.data.offset = 0;
-	op->sym->aead.data.length = data_len;
-
-	op->sym->m_src = m;
-
-	return op;
-}
-
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_snow3g(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess, unsigned int data_len)
-{
-	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op,
-			uint8_t *, IV_OFFSET);
-
-	if (rte_crypto_op_attach_sym_session(op, sess) != 0) {
-		rte_crypto_op_free(op);
-		return NULL;
-	}
-
-	rte_memcpy(iv_ptr, snow3g_iv, SNOW3G_CIPHER_IV_LENGTH);
-
-	/* Authentication Parameters */
-	op->sym->auth.digest.data = (uint8_t *)m->buf_addr +
-						(m->data_off + data_len);
-	op->sym->auth.digest.phys_addr =
-				rte_pktmbuf_mtophys_offset(m, data_len);
-
-	/* Data lengths/offsets Parameters */
-	op->sym->auth.data.offset = 0;
-	op->sym->auth.data.length = data_len << 3;
-
-	op->sym->cipher.data.offset = 0;
-	op->sym->cipher.data.length = data_len << 3;
-
-	op->sym->m_src = m;
-
-	return op;
-}
-
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_snow3g_cipher(struct rte_crypto_op *op,
-		struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess,
-		unsigned data_len)
-{
-	if (rte_crypto_op_attach_sym_session(op, sess) != 0) {
-		rte_crypto_op_free(op);
-		return NULL;
-	}
-
-	/* Copy IV at the end of the crypto operation */
-	rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
-			snow3g_iv, SNOW3G_CIPHER_IV_LENGTH);
-
-	/* Cipher Parameters */
-	op->sym->cipher.data.offset = 0;
-	op->sym->cipher.data.length = data_len << 3;
-
-	rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
-			snow3g_iv,
-			SNOW3G_CIPHER_IV_LENGTH);
-
-	op->sym->m_src = m;
-
-	return op;
-}
-
-
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_snow3g_hash(struct rte_crypto_op *op,
-		struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess,
-		unsigned int data_len)
-{
-	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op,
-			uint8_t *, IV_OFFSET);
-
-	if (rte_crypto_op_attach_sym_session(op, sess) != 0) {
-		rte_crypto_op_free(op);
-		return NULL;
-	}
-
-	rte_memcpy(iv_ptr, snow3g_iv, SNOW3G_CIPHER_IV_LENGTH);
-
-	/* Authentication Parameters */
-
-	op->sym->auth.digest.data =
-			(uint8_t *)rte_pktmbuf_mtod_offset(m, uint8_t *,
-			data_len);
-	op->sym->auth.digest.phys_addr =
-				rte_pktmbuf_mtophys_offset(m, data_len +
-					SNOW3G_CIPHER_IV_LENGTH);
-
-	/* Data lengths/offsets Parameters */
-	op->sym->auth.data.offset = 0;
-	op->sym->auth.data.length = data_len << 3;
-
-	op->sym->m_src = m;
-
-	return op;
-}
-
-
-static inline struct rte_crypto_op *
-test_perf_set_crypto_op_3des(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess, unsigned int data_len,
-		enum chain_mode chain __rte_unused)
-{
-	if (rte_crypto_op_attach_sym_session(op, sess) != 0) {
-		rte_crypto_op_free(op);
-		return NULL;
-	}
-
-	/* Authentication Parameters */
-	op->sym->auth.digest.data = (uint8_t *)m->buf_addr +
-					(m->data_off + data_len);
-	op->sym->auth.digest.phys_addr =
-				rte_pktmbuf_mtophys_offset(m, data_len);
-
-	/* Copy IV at the end of the crypto operation */
-	rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
-			triple_des_iv, TRIPLE_DES_CIPHER_IV_LENGTH);
-
-	/* Data lengths/offsets Parameters */
-	op->sym->auth.data.offset = 0;
-	op->sym->auth.data.length = data_len;
-
-	op->sym->cipher.data.offset = 0;
-	op->sym->cipher.data.length = data_len;
-
-	op->sym->m_src = m;
-
-	return op;
-}
-
-/* An mbuf set is used in each burst. An mbuf can be used by multiple bursts at
- * same time, i.e. as they're not dereferenced there's no need to wait until
- * finished with to re-use */
-#define NUM_MBUF_SETS 8
-
-static int
-test_perf_aes_sha(uint8_t dev_id, uint16_t queue_id,
-		struct perf_test_params *pparams)
-{
-	uint16_t i, k, l, m;
-	uint16_t j = 0;
-	uint16_t ops_unused = 0;
-
-	uint64_t burst_enqueued = 0, total_enqueued = 0, burst_dequeued = 0;
-	uint64_t processed = 0, failed_polls = 0, retries = 0;
-	uint64_t tsc_start = 0, tsc_end = 0;
-
-	uint16_t digest_length = get_auth_digest_length(pparams->auth_algo);
-
-	struct rte_crypto_op *ops[pparams->burst_size];
-	struct rte_crypto_op *proc_ops[pparams->burst_size];
-
-	struct rte_mbuf *mbufs[pparams->burst_size * 8];
-
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-
-	static struct rte_cryptodev_sym_session *sess;
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices available. Is kernel driver loaded?\n");
-		return TEST_FAILED;
-	}
-
-	/* Create Crypto session*/
-	if (test_perf_create_aes_sha_session(ts_params->dev_id,
-			pparams->chain, pparams->cipher_algo,
-			pparams->key_length, pparams->auth_algo) == 0)
-		sess = test_crypto_session;
-	else
-		sess = NULL;
-	TEST_ASSERT_NOT_NULL(sess, "Session creation failed");
-
-	/* Generate a burst of crypto operations */
-	for (i = 0; i < (pparams->burst_size * NUM_MBUF_SETS); i++) {
-		mbufs[i] = test_perf_create_pktmbuf(
-				ts_params->mbuf_mp,
-				pparams->buf_size);
-
-		if (mbufs[i] == NULL) {
-			printf("\nFailed to get mbuf - freeing the rest.\n");
-			for (k = 0; k < i; k++)
-				rte_pktmbuf_free(mbufs[k]);
-			return -1;
-		}
-
-		/* Make room for Digest in mbuf */
-		if (pparams->chain != CIPHER_ONLY)
-			rte_pktmbuf_append(mbufs[i], digest_length);
-	}
-
-
-	tsc_start = rte_rdtsc_precise();
-
-	while (total_enqueued < pparams->total_operations) {
-		uint16_t burst_size =
-		total_enqueued+pparams->burst_size <= pparams->total_operations ?
-		pparams->burst_size : pparams->total_operations-total_enqueued;
-		uint16_t ops_needed = burst_size-ops_unused;
-
-		if (ops_needed != rte_crypto_op_bulk_alloc(ts_params->op_mpool,
-				RTE_CRYPTO_OP_TYPE_SYMMETRIC, ops, ops_needed)){
-			printf("\nFailed to alloc enough ops, finish dequeuing "
-				"and free ops below.");
-		} else {
-			for (i = 0; i < ops_needed; i++)
-				ops[i] = test_perf_set_crypto_op_aes(ops[i],
-					mbufs[i + (pparams->burst_size *
-						(j % NUM_MBUF_SETS))],
-					sess, pparams->buf_size,
-					pparams->chain);
-
-			/* enqueue burst */
-			burst_enqueued = rte_cryptodev_enqueue_burst(dev_id,
-					queue_id, ops, burst_size);
-
-			if (burst_enqueued < burst_size)
-				retries++;
-
-			ops_unused = burst_size-burst_enqueued;
-			total_enqueued += burst_enqueued;
-		}
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-
-			for (l = 0; l < burst_dequeued; l++)
-				rte_crypto_op_free(proc_ops[l]);
-		}
-		j++;
-	}
-
-	/* Dequeue any operations still in the crypto device */
-	while (processed < pparams->total_operations) {
-		/* Sending 0 length burst to flush sw crypto device */
-		rte_cryptodev_enqueue_burst(dev_id, queue_id, NULL, 0);
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-
-			for (m = 0; m < burst_dequeued; m++)
-				rte_crypto_op_free(proc_ops[m]);
-		}
-	}
-
-	tsc_end = rte_rdtsc_precise();
-
-	double ops_s = ((double)processed / (tsc_end - tsc_start)) * rte_get_tsc_hz();
-	double throughput = (ops_s * pparams->buf_size * 8) / 1000000000;
-
-	printf("\t%u\t%6.2f\t%10.2f\t%8"PRIu64"\t%8"PRIu64, pparams->buf_size, ops_s/1000000,
-			throughput, retries, failed_polls);
-
-	for (i = 0; i < pparams->burst_size * NUM_MBUF_SETS; i++)
-		rte_pktmbuf_free(mbufs[i]);
-
-	rte_cryptodev_sym_session_clear(ts_params->dev_id, sess);
-	rte_cryptodev_sym_session_free(sess);
-
-	printf("\n");
-	return TEST_SUCCESS;
-}
-
-
-static int
-test_perf_snow3g(uint8_t dev_id, uint16_t queue_id,
-		struct perf_test_params *pparams)
-{
-	uint16_t i, k, l, m;
-	uint16_t j = 0;
-	uint16_t ops_unused = 0;
-	uint64_t burst_enqueued = 0, total_enqueued = 0, burst_dequeued = 0;
-	uint64_t processed = 0, failed_polls = 0, retries = 0;
-	uint64_t tsc_start = 0, tsc_end = 0;
-
-	uint16_t digest_length = get_auth_digest_length(pparams->auth_algo);
-
-	struct rte_crypto_op *ops[pparams->burst_size];
-	struct rte_crypto_op *proc_ops[pparams->burst_size];
-
-	struct rte_mbuf *mbufs[pparams->burst_size * NUM_MBUF_SETS];
-
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-
-	static struct rte_cryptodev_sym_session *sess;
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices found. Is PMD build configured?\n");
-		printf("\nAnd is kernel driver loaded for HW PMDs?\n");
-		return TEST_FAILED;
-	}
-
-	/* Create Crypto session*/
-	if (test_perf_create_snow3g_session(ts_params->dev_id,
-			pparams->chain, pparams->cipher_algo,
-			pparams->key_length, pparams->auth_algo) == 0)
-		sess = test_crypto_session;
-	else
-		sess = NULL;
-	TEST_ASSERT_NOT_NULL(sess, "Session creation failed");
-
-	/* Generate a burst of crypto operations */
-	for (i = 0; i < (pparams->burst_size * NUM_MBUF_SETS); i++) {
-		/*
-		 * Buffer size is allocated, for perf tests they
-		 * are equal + digest len.
-		 */
-		mbufs[i] = test_perf_create_pktmbuf(
-				ts_params->mbuf_mp,
-				pparams->buf_size  +
-				digest_length);
-
-		if (mbufs[i] == NULL) {
-			printf("\nFailed to get mbuf - freeing the rest.\n");
-			for (k = 0; k < i; k++)
-				rte_pktmbuf_free(mbufs[k]);
-			return -1;
-		}
-
-	}
-
-	tsc_start = rte_rdtsc_precise();
-
-	while (total_enqueued < pparams->total_operations) {
-		uint16_t burst_size =
-				(total_enqueued+pparams->burst_size)
-						<= pparams->total_operations ?
-		pparams->burst_size : pparams->total_operations-total_enqueued;
-		uint16_t ops_needed = burst_size-ops_unused;
-		/* Handle the last burst correctly */
-		uint16_t op_offset = pparams->burst_size - burst_size;
-
-		if (ops_needed !=
-			rte_crypto_op_bulk_alloc(ts_params->op_mpool,
-						RTE_CRYPTO_OP_TYPE_SYMMETRIC,
-						ops+op_offset, ops_needed)) {
-			printf("\nFailed to alloc enough ops.");
-			/*Don't exit, dequeue, more ops should become available*/
-		} else {
-			for (i = 0; i < ops_needed; i++) {
-				if (pparams->chain == HASH_ONLY)
-					ops[i+op_offset] =
-					test_perf_set_crypto_op_snow3g_hash(ops[i+op_offset],
-					mbufs[i +
-					  (pparams->burst_size * (j % NUM_MBUF_SETS))],
-					sess,
-					pparams->buf_size);
-				else if (pparams->chain == CIPHER_ONLY)
-					ops[i+op_offset] =
-					test_perf_set_crypto_op_snow3g_cipher(ops[i+op_offset],
-					mbufs[i +
-					  (pparams->burst_size * (j % NUM_MBUF_SETS))],
-					sess,
-					pparams->buf_size);
-				else
-					return 1;
-			}
-
-			/* enqueue burst */
-			burst_enqueued =
-				rte_cryptodev_enqueue_burst(dev_id, queue_id,
-						ops+op_offset, burst_size);
-
-			if (burst_enqueued < burst_size)
-				retries++;
-
-			ops_unused = burst_size-burst_enqueued;
-			total_enqueued += burst_enqueued;
-		}
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-					proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0) {
-			failed_polls++;
-		} else {
-			processed += burst_dequeued;
-			for (l = 0; l < burst_dequeued; l++)
-				rte_crypto_op_free(proc_ops[l]);
-		}
-		j++;
-	}
-
-	/* Dequeue any operations still in the crypto device */
-	while (processed < pparams->total_operations) {
-		/* Sending 0 length burst to flush sw crypto device */
-		rte_cryptodev_enqueue_burst(dev_id, queue_id, NULL, 0);
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-			for (m = 0; m < burst_dequeued; m++)
-				rte_crypto_op_free(proc_ops[m]);
-		}
-	}
-
-	tsc_end = rte_rdtsc_precise();
-
-	double ops_s = ((double)processed / (tsc_end - tsc_start)) * rte_get_tsc_hz();
-	double cycles_burst = (double) (tsc_end - tsc_start) /
-					(double) processed * pparams->burst_size;
-	double cycles_buff = (double) (tsc_end - tsc_start) / (double) processed;
-	double cycles_B = cycles_buff / pparams->buf_size;
-	double throughput = (ops_s * pparams->buf_size * 8) / 1000000;
-
-	if (gbl_driver_id == rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))) {
-		/* Cycle count misleading on HW devices for this test, so don't print */
-		printf("%4u\t%6.2f\t%10.2f\t n/a \t\t n/a "
-			"\t\t n/a \t\t%8"PRIu64"\t%8"PRIu64,
-			pparams->buf_size, ops_s/1000000,
-			throughput, retries, failed_polls);
-	} else {
-		printf("%4u\t%6.2f\t%10.2f\t%10.2f\t%8.2f"
-			"\t%8.2f\t%8"PRIu64"\t%8"PRIu64,
-			pparams->buf_size, ops_s/1000000, throughput, cycles_burst,
-			cycles_buff, cycles_B, retries, failed_polls);
-	}
-
-	for (i = 0; i < pparams->burst_size * NUM_MBUF_SETS; i++)
-		rte_pktmbuf_free(mbufs[i]);
-
-	rte_cryptodev_sym_session_clear(ts_params->dev_id, sess);
-	rte_cryptodev_sym_session_free(sess);
-
-	printf("\n");
-	return TEST_SUCCESS;
-}
-
-static int
-test_perf_openssl(uint8_t dev_id, uint16_t queue_id,
-		struct perf_test_params *pparams)
-{
-	uint16_t i, k, l, m;
-	uint16_t j = 0;
-	uint16_t ops_unused = 0;
-
-	uint64_t burst_enqueued = 0, total_enqueued = 0, burst_dequeued = 0;
-	uint64_t processed = 0, failed_polls = 0, retries = 0;
-	uint64_t tsc_start = 0, tsc_end = 0;
-
-	struct rte_crypto_op *ops[pparams->burst_size];
-	struct rte_crypto_op *proc_ops[pparams->burst_size];
-
-	struct rte_mbuf *mbufs[pparams->burst_size * NUM_MBUF_SETS];
-
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-
-	static struct rte_cryptodev_sym_session *sess;
-
-	static struct rte_crypto_op *(*test_perf_set_crypto_op)
-			(struct rte_crypto_op *, struct rte_mbuf *,
-					struct rte_cryptodev_sym_session *,
-					unsigned int,
-					enum chain_mode);
-
-	if (pparams->chain == AEAD)
-		test_perf_set_crypto_op =
-					test_perf_set_crypto_op_aes_gcm;
-	else {
-		switch (pparams->cipher_algo) {
-		case RTE_CRYPTO_CIPHER_3DES_CBC:
-		case RTE_CRYPTO_CIPHER_3DES_CTR:
-			test_perf_set_crypto_op = test_perf_set_crypto_op_3des;
-			break;
-		case RTE_CRYPTO_CIPHER_AES_CBC:
-		case RTE_CRYPTO_CIPHER_AES_CTR:
-			test_perf_set_crypto_op = test_perf_set_crypto_op_aes;
-			break;
-		default:
-			return TEST_FAILED;
-		}
-	}
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices found. Is PMD build configured?\n");
-		return TEST_FAILED;
-	}
-
-	/* Create Crypto session*/
-	if (test_perf_create_openssl_session(ts_params->dev_id,
-			pparams->chain, pparams->cipher_algo,
-			pparams->key_length, pparams->auth_algo,
-			pparams->aead_algo) == 0)
-		sess = test_crypto_session;
-	else
-		sess = NULL;
-	TEST_ASSERT_NOT_NULL(sess, "Session creation failed");
-
-	/* Generate a burst of crypto operations */
-	for (i = 0; i < (pparams->burst_size * NUM_MBUF_SETS); i++) {
-		mbufs[i] = test_perf_create_pktmbuf(
-				ts_params->mbuf_mp,
-				pparams->buf_size);
-
-		if (mbufs[i] == NULL) {
-			printf("\nFailed to get mbuf - freeing the rest.\n");
-			for (k = 0; k < i; k++)
-				rte_pktmbuf_free(mbufs[k]);
-			return -1;
-		}
-	}
-
-	tsc_start = rte_rdtsc_precise();
-
-	while (total_enqueued < pparams->total_operations) {
-		uint16_t burst_size =
-		total_enqueued + pparams->burst_size <=
-		pparams->total_operations ? pparams->burst_size :
-				pparams->total_operations - total_enqueued;
-		uint16_t ops_needed = burst_size - ops_unused;
-
-		if (ops_needed != rte_crypto_op_bulk_alloc(ts_params->op_mpool,
-				RTE_CRYPTO_OP_TYPE_SYMMETRIC, ops, ops_needed)){
-			printf("\nFailed to alloc enough ops, finish dequeuing "
-				"and free ops below.");
-		} else {
-			for (i = 0; i < ops_needed; i++)
-				ops[i] = test_perf_set_crypto_op(ops[i],
-					mbufs[i + (pparams->burst_size *
-						(j % NUM_MBUF_SETS))],
-					sess, pparams->buf_size,
-					pparams->chain);
-
-			/* enqueue burst */
-			burst_enqueued = rte_cryptodev_enqueue_burst(dev_id,
-					queue_id, ops, burst_size);
-
-			if (burst_enqueued < burst_size)
-				retries++;
-
-			ops_unused = burst_size - burst_enqueued;
-			total_enqueued += burst_enqueued;
-		}
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-
-			for (l = 0; l < burst_dequeued; l++)
-				rte_crypto_op_free(proc_ops[l]);
-		}
-		j++;
-	}
-
-	/* Dequeue any operations still in the crypto device */
-	while (processed < pparams->total_operations) {
-		/* Sending 0 length burst to flush sw crypto device */
-		rte_cryptodev_enqueue_burst(dev_id, queue_id, NULL, 0);
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-
-			for (m = 0; m < burst_dequeued; m++)
-				rte_crypto_op_free(proc_ops[m]);
-		}
-	}
-
-	tsc_end = rte_rdtsc_precise();
-
-	double ops_s = ((double)processed / (tsc_end - tsc_start))
-					* rte_get_tsc_hz();
-	double throughput = (ops_s * pparams->buf_size * NUM_MBUF_SETS)
-					/ 1000000000;
-
-	printf("\t%u\t%6.2f\t%10.2f\t%8"PRIu64"\t%8"PRIu64, pparams->buf_size,
-			ops_s / 1000000, throughput, retries, failed_polls);
-
-	for (i = 0; i < pparams->burst_size * NUM_MBUF_SETS; i++)
-		rte_pktmbuf_free(mbufs[i]);
-
-	rte_cryptodev_sym_session_clear(ts_params->dev_id, sess);
-	rte_cryptodev_sym_session_free(sess);
-
-	printf("\n");
-	return TEST_SUCCESS;
-}
-
-static int
-test_perf_armv8(uint8_t dev_id, uint16_t queue_id,
-		struct perf_test_params *pparams)
-{
-	uint16_t i, k, l, m;
-	uint16_t j = 0;
-	uint16_t ops_unused = 0;
-	uint16_t burst_size;
-	uint16_t ops_needed;
-
-	uint64_t burst_enqueued = 0, total_enqueued = 0, burst_dequeued = 0;
-	uint64_t processed = 0, failed_polls = 0, retries = 0;
-	uint64_t tsc_start = 0, tsc_end = 0;
-
-	struct rte_crypto_op *ops[pparams->burst_size];
-	struct rte_crypto_op *proc_ops[pparams->burst_size];
-
-	struct rte_mbuf *mbufs[pparams->burst_size * NUM_MBUF_SETS];
-
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-
-	static struct rte_cryptodev_sym_session *sess;
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices found. Is PMD build configured?\n");
-		return TEST_FAILED;
-	}
-
-	/* Create Crypto session*/
-	if (test_perf_create_armv8_session(ts_params->dev_id,
-			pparams->chain, pparams->cipher_algo,
-			pparams->key_length, pparams->auth_algo) == 0)
-		sess = test_crypto_session;
-	else
-		sess = NULL;
-	TEST_ASSERT_NOT_NULL(sess, "Session creation failed");
-
-	/* Generate a burst of crypto operations */
-	for (i = 0; i < (pparams->burst_size * NUM_MBUF_SETS); i++) {
-		mbufs[i] = test_perf_create_pktmbuf(
-				ts_params->mbuf_mp,
-				pparams->buf_size);
-
-		if (mbufs[i] == NULL) {
-			printf("\nFailed to get mbuf - freeing the rest.\n");
-			for (k = 0; k < i; k++)
-				rte_pktmbuf_free(mbufs[k]);
-			return -1;
-		}
-	}
-
-	tsc_start = rte_rdtsc();
-
-	while (total_enqueued < pparams->total_operations) {
-		if ((total_enqueued + pparams->burst_size) <=
-					pparams->total_operations)
-			burst_size = pparams->burst_size;
-		else
-			burst_size = pparams->total_operations - total_enqueued;
-
-		ops_needed = burst_size - ops_unused;
-
-		if (ops_needed != rte_crypto_op_bulk_alloc(ts_params->op_mpool,
-				RTE_CRYPTO_OP_TYPE_SYMMETRIC, ops, ops_needed)){
-			printf("\nFailed to alloc enough ops, finish dequeuing "
-				"and free ops below.");
-		} else {
-			for (i = 0; i < ops_needed; i++)
-				ops[i] = test_perf_set_crypto_op_aes(ops[i],
-					mbufs[i + (pparams->burst_size *
-						(j % NUM_MBUF_SETS))], sess,
-					pparams->buf_size,
-					pparams->chain);
-
-			/* enqueue burst */
-			burst_enqueued = rte_cryptodev_enqueue_burst(dev_id,
-					queue_id, ops, burst_size);
-
-			if (burst_enqueued < burst_size)
-				retries++;
-
-			ops_unused = burst_size - burst_enqueued;
-			total_enqueued += burst_enqueued;
-		}
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-
-			for (l = 0; l < burst_dequeued; l++)
-				rte_crypto_op_free(proc_ops[l]);
-		}
-		j++;
-	}
-
-	/* Dequeue any operations still in the crypto device */
-	while (processed < pparams->total_operations) {
-		/* Sending 0 length burst to flush sw crypto device */
-		rte_cryptodev_enqueue_burst(dev_id, queue_id, NULL, 0);
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-
-			for (m = 0; m < burst_dequeued; m++)
-				rte_crypto_op_free(proc_ops[m]);
-		}
-	}
-
-	tsc_end = rte_rdtsc();
-
-	double ops_s = ((double)processed / (tsc_end - tsc_start))
-					* rte_get_tsc_hz();
-	double throughput = (ops_s * pparams->buf_size * NUM_MBUF_SETS)
-					/ 1000000000;
-
-	printf("\t%u\t%6.2f\t%10.2f\t%8"PRIu64"\t%8"PRIu64, pparams->buf_size,
-			ops_s / 1000000, throughput, retries, failed_polls);
-
-	for (i = 0; i < pparams->burst_size * NUM_MBUF_SETS; i++)
-		rte_pktmbuf_free(mbufs[i]);
-
-	printf("\n");
-	return TEST_SUCCESS;
-}
-
-/*
-
-    perf_test_aes_sha("avx2", HASH_CIPHER, 16, CBC, SHA1);
-    perf_test_aes_sha("avx2", HASH_CIPHER, 16, CBC, SHA_256);
-    perf_test_aes_sha("avx2", HASH_CIPHER, 16, CBC, SHA_512);
-
-    perf_test_aes_sha("avx2", CIPHER_HASH, 32, CBC, SHA1);
-    perf_test_aes_sha("avx2", CIPHER_HASH, 32, CBC, SHA_256);
-    perf_test_aes_sha("avx2", CIPHER_HASH, 32, CBC, SHA_512);
-
-    perf_test_aes_sha("avx2", HASH_CIPHER, 32, CBC, SHA1);
-    perf_test_aes_sha("avx2", HASH_CIPHER, 32, CBC, SHA_256);
-    perf_test_aes_sha("avx2", HASH_CIPHER, 32, CBC, SHA_512);
- */
-static int
-test_perf_aes_cbc_encrypt_digest_vary_pkt_size(void)
-{
-	unsigned total_operations = 1000000;
-	unsigned burst_size = 32;
-	unsigned buf_lengths[] = { 64, 128, 256, 512, 768, 1024, 1280, 1536, 1792, 2048 };
-	uint8_t i, j;
-
-	struct perf_test_params params_set[] = {
-		{
-			.chain = CIPHER_ONLY,
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_NULL
-		},
-		{
-			.chain = CIPHER_HASH,
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA256_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA512_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 32,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 32,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA256_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 32,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA512_HMAC
-		},
-	};
-
-	for (i = 0; i < RTE_DIM(params_set); i++) {
-
-		params_set[i].total_operations = total_operations;
-		params_set[i].burst_size = burst_size;
-		printf("\n%s. cipher algo: %s auth algo: %s cipher key size=%u."
-			" burst_size: %d ops\n",
-			chain_mode_name(params_set[i].chain),
-			rte_crypto_cipher_algorithm_strings[params_set[i].cipher_algo],
-			rte_crypto_auth_algorithm_strings[params_set[i].auth_algo],
-			params_set[i].key_length,
-			burst_size);
-		printf("\nBuffer Size(B)\tOPS(M)\tThroughput(Gbps)\t"
-			"Retries\tEmptyPolls\n");
-		for (j = 0; j < RTE_DIM(buf_lengths); j++) {
-			params_set[i].buf_size = buf_lengths[j];
-			test_perf_aes_sha(testsuite_params.dev_id, 0,
-					&params_set[i]);
-		}
-	}
-	return 0;
-}
-
-static int
-test_perf_snow3G_vary_pkt_size(void)
-{
-	unsigned total_operations = 1000000;
-	uint8_t i, j;
-	unsigned k;
-	uint16_t burst_sizes[] = { 64 };
-	uint16_t buf_lengths[] = { 40, 64, 80, 120, 240, 256, 400, 512, 600, 1024, 2048 };
-
-	struct perf_test_params params_set[] = {
-		{
-			.chain = CIPHER_ONLY,
-			.cipher_algo  = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
-			.key_length = 16,
-			.auth_algo  = RTE_CRYPTO_AUTH_NULL,
-		},
-		{
-			.chain = HASH_ONLY,
-			.cipher_algo = RTE_CRYPTO_CIPHER_NULL,
-			.auth_algo  = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
-			.key_length = 16
-		},
-	};
-
-	printf("\n\nStart %s.", __func__);
-	printf("\nTest to measure max throughput at various pkt sizes.");
-	printf("\nOn HW devices t'put maximised when high Retries and EmptyPolls"
-			" so cycle cost not relevant (n/a displayed).");
-
-	for (i = 0; i < RTE_DIM(params_set); i++) {
-		printf("\n\n");
-		params_set[i].total_operations = total_operations;
-		for (k = 0; k < RTE_DIM(burst_sizes); k++) {
-			enum rte_crypto_cipher_algorithm cipher_algo =
-				params_set[i].cipher_algo;
-			enum rte_crypto_auth_algorithm auth_algo =
-				params_set[i].auth_algo;
-			printf("\nOn %s dev%u qp%u, %s, "
-				"cipher algo:%s, auth algo:%s, burst_size: %d ops",
-				pmd_name(gbl_driver_id),
-				testsuite_params.dev_id, 0,
-				chain_mode_name(params_set[i].chain),
-				rte_crypto_cipher_algorithm_strings[cipher_algo],
-				rte_crypto_auth_algorithm_strings[auth_algo],
-				burst_sizes[k]);
-
-			params_set[i].burst_size = burst_sizes[k];
-			printf("\nPktSzB\tOp/s(M)\tThruput(Mbps)\tCycles/Burst\t"
-				"Cycles/buf\tCycles/B\tRetries\t\tEmptyPolls\n");
-			for (j = 0; j < RTE_DIM(buf_lengths); j++) {
-
-				params_set[i].buf_size = buf_lengths[j];
-
-				test_perf_snow3g(testsuite_params.dev_id, 0, &params_set[i]);
-			}
-		}
-	}
-
-	return 0;
-}
-
-static int
-test_perf_openssl_vary_pkt_size(void)
-{
-	unsigned int total_operations = 10000;
-	unsigned int burst_size = { 64 };
-	unsigned int buf_lengths[] = { 64, 128, 256, 512, 768, 1024, 1280, 1536,
-			1792, 2048 };
-	uint8_t i, j;
-
-	struct perf_test_params params_set[] = {
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_3DES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_3DES_CBC,
-			.key_length = 24,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CTR,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CTR,
-			.key_length = 32,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_3DES_CTR,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_3DES_CTR,
-			.key_length = 24,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = AEAD,
-
-			.aead_algo  = RTE_CRYPTO_AEAD_AES_GCM,
-			.key_length = 16,
-		},
-	};
-
-	for (i = 0; i < RTE_DIM(params_set); i++) {
-		params_set[i].total_operations = total_operations;
-		params_set[i].burst_size = burst_size;
-		if (params_set[i].chain == AEAD) {
-			enum rte_crypto_aead_algorithm aead_algo =
-				params_set[i].aead_algo;
-			printf("\n%s. aead algo: %s  key size=%u."
-				" burst_size: %d ops\n",
-				chain_mode_name(params_set[i].chain),
-				rte_crypto_aead_algorithm_strings[aead_algo],
-				params_set[i].key_length,
-				burst_size);
-		} else {
-			enum rte_crypto_cipher_algorithm cipher_algo =
-				params_set[i].cipher_algo;
-			enum rte_crypto_auth_algorithm auth_algo =
-				params_set[i].auth_algo;
-			printf("\n%s. cipher algo: %s auth algo: %s key size=%u."
-				" burst_size: %d ops\n",
-				chain_mode_name(params_set[i].chain),
-				rte_crypto_cipher_algorithm_strings[cipher_algo],
-				rte_crypto_auth_algorithm_strings[auth_algo],
-				params_set[i].key_length,
-				burst_size);
-		}
-		printf("\nBuffer Size(B)\tOPS(M)\tThroughput(Gbps)\tRetries\t"
-				"EmptyPolls\n");
-		for (j = 0; j < RTE_DIM(buf_lengths); j++) {
-			params_set[i].buf_size = buf_lengths[j];
-			test_perf_openssl(testsuite_params.dev_id, 0,
-					&params_set[i]);
-		}
-	}
-
-	return 0;
-}
-
-static int
-test_perf_openssl_vary_burst_size(void)
-{
-	unsigned int total_operations = 4096;
-	uint16_t buf_lengths[] = { 40 };
-	uint8_t i, j;
-
-	struct perf_test_params params_set[] = {
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_3DES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_3DES_CBC,
-			.key_length = 24,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CTR,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CTR,
-			.key_length = 32,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_3DES_CTR,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_3DES_CTR,
-			.key_length = 24,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = AEAD,
-
-			.aead_algo  = RTE_CRYPTO_AEAD_AES_GCM,
-			.key_length = 16,
-		},
-	};
-
-	printf("\n\nStart %s.", __func__);
-	printf("\nThis Test measures the average IA cycle cost using a "
-			"constant request(packet) size. ");
-	printf("Cycle cost is only valid when indicators show device is not"
-			" busy, i.e. Retries and EmptyPolls = 0");
-
-	for (i = 0; i < RTE_DIM(params_set); i++) {
-		printf("\n");
-		params_set[i].total_operations = total_operations;
-
-	for (j = 0; j < RTE_DIM(buf_lengths); j++) {
-		params_set[i].buf_size = buf_lengths[j];
-		test_perf_openssl_optimise_cyclecount(&params_set[i]);
-		}
-	}
-
-	return 0;
-}
-
-static int
-test_perf_armv8_vary_pkt_size(void)
-{
-	unsigned int total_operations = 100000;
-	unsigned int burst_size = { 64 };
-	unsigned int buf_lengths[] = { 64, 128, 256, 512, 768, 1024, 1280, 1536,
-			1792, 2048 };
-	uint8_t i, j;
-
-	struct perf_test_params params_set[] = {
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = HASH_CIPHER,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA256_HMAC
-		},
-		{
-			.chain = HASH_CIPHER,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA256_HMAC
-		},
-	};
-
-	for (i = 0; i < RTE_DIM(params_set); i++) {
-		params_set[i].total_operations = total_operations;
-		params_set[i].burst_size = burst_size;
-		printf("\n%s. cipher algo: %s auth algo: %s cipher key size=%u."
-			" burst_size: %d ops\n",
-			chain_mode_name(params_set[i].chain),
-			rte_crypto_cipher_algorithm_strings[params_set[i].cipher_algo],
-			rte_crypto_auth_algorithm_strings[params_set[i].auth_algo],
-			params_set[i].key_length,
-			burst_size);
-		printf("\nBuffer Size(B)\tOPS(M)\tThroughput(Gbps)\tRetries\t"
-				"EmptyPolls\n");
-		for (j = 0; j < RTE_DIM(buf_lengths); j++) {
-			params_set[i].buf_size = buf_lengths[j];
-			test_perf_armv8(testsuite_params.dev_id, 0,
-							&params_set[i]);
-		}
-	}
-
-	return 0;
-}
-
-static int
-test_perf_armv8_vary_burst_size(void)
-{
-	unsigned int total_operations = 4096;
-	uint16_t buf_lengths[] = { 64 };
-	uint8_t i, j;
-
-	struct perf_test_params params_set[] = {
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = HASH_CIPHER,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-		},
-		{
-			.chain = CIPHER_HASH,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA256_HMAC
-		},
-		{
-			.chain = HASH_CIPHER,
-
-			.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-			.key_length = 16,
-			.auth_algo = RTE_CRYPTO_AUTH_SHA256_HMAC
-		},
-	};
-
-	printf("\n\nStart %s.", __func__);
-	printf("\nThis Test measures the average IA cycle cost using a "
-			"constant request(packet) size. ");
-	printf("Cycle cost is only valid when indicators show device is "
-			"not busy, i.e. Retries and EmptyPolls = 0");
-
-	for (i = 0; i < RTE_DIM(params_set); i++) {
-		printf("\n");
-		params_set[i].total_operations = total_operations;
-
-		for (j = 0; j < RTE_DIM(buf_lengths); j++) {
-			params_set[i].buf_size = buf_lengths[j];
-			test_perf_armv8_optimise_cyclecount(&params_set[i]);
-		}
-	}
-
-	return 0;
-}
-
-static int
-test_perf_aes_cbc_vary_burst_size(void)
-{
-	return test_perf_crypto_qp_vary_burst_size(testsuite_params.dev_id);
-}
-
-
-static struct rte_cryptodev_sym_session *
-test_perf_create_session(uint8_t dev_id, struct perf_test_params *pparams)
-{
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct rte_crypto_sym_xform aead_xform = { 0 };
-
-	uint8_t aead_key[pparams->session_attrs->key_aead_len];
-
-	memcpy(aead_key, pparams->session_attrs->key_aead_data,
-		 pparams->session_attrs->key_aead_len);
-
-	aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
-	aead_xform.next = NULL;
-
-	aead_xform.aead.algo = pparams->session_attrs->aead_algorithm;
-	aead_xform.aead.op = pparams->session_attrs->aead;
-	aead_xform.aead.key.data = aead_key;
-	aead_xform.aead.key.length = pparams->session_attrs->key_aead_len;
-	aead_xform.aead.iv.length = pparams->session_attrs->iv_len;
-	aead_xform.aead.iv.offset = IV_OFFSET;
-	aead_xform.aead.aad_length = pparams->session_attrs->aad_len;
-	aead_xform.aead.digest_length = pparams->session_attrs->digest_len;
-
-	test_crypto_session = rte_cryptodev_sym_session_create(ts_params->sess_mp);
-
-	rte_cryptodev_sym_session_init(dev_id, test_crypto_session,
-				&aead_xform, ts_params->sess_mp);
-
-	return test_crypto_session;
-}
-
-static inline struct rte_crypto_op *
-perf_gcm_set_crypto_op(struct rte_crypto_op *op, struct rte_mbuf *m,
-		struct rte_cryptodev_sym_session *sess,
-		struct crypto_params *m_hlp,
-		struct perf_test_params *params)
-{
-	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op,
-			uint8_t *, IV_OFFSET);
-
-	if (rte_crypto_op_attach_sym_session(op, sess) != 0) {
-		rte_crypto_op_free(op);
-		return NULL;
-	}
-
-	op->sym->aead.digest.data = m_hlp->digest;
-	op->sym->aead.digest.phys_addr = rte_pktmbuf_mtophys_offset(
-					  m,
-					  params->session_attrs->aad_len +
-					  params->symmetric_op->p_len);
-
-
-	op->sym->aead.aad.data = m_hlp->aad;
-	op->sym->aead.aad.phys_addr = rte_pktmbuf_mtophys(m);
-
-	rte_memcpy(op->sym->aead.aad.data, params->symmetric_op->aad_data,
-		       params->session_attrs->aad_len);
-
-	rte_memcpy(iv_ptr, params->session_attrs->iv_data,
-		       params->session_attrs->iv_len);
-	if (params->session_attrs->iv_len == 12)
-		iv_ptr[15] = 1;
-
-	op->sym->aead.data.offset =
-			params->session_attrs->aad_len;
-	op->sym->aead.data.length = params->symmetric_op->p_len;
-
-	op->sym->m_src = m;
-
-	return op;
-}
-
-static struct rte_mbuf *
-test_perf_create_pktmbuf_fill(struct rte_mempool *mpool,
-		struct perf_test_params *params,
-		unsigned buf_sz, struct crypto_params *m_hlp)
-{
-	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
-	uint16_t aad_len = params->session_attrs->aad_len;
-	uint16_t digest_size = params->symmetric_op->t_len;
-	char *p;
-
-	p = rte_pktmbuf_append(m, aad_len);
-	if (p == NULL) {
-		rte_pktmbuf_free(m);
-		return NULL;
-	}
-	m_hlp->aad = (uint8_t *)p;
-
-	p = rte_pktmbuf_append(m, buf_sz);
-	if (p == NULL) {
-		rte_pktmbuf_free(m);
-		return NULL;
-	}
-	rte_memcpy(p, params->symmetric_op->p_data, buf_sz);
-
-	p = rte_pktmbuf_append(m, digest_size);
-	if (p == NULL) {
-		rte_pktmbuf_free(m);
-		return NULL;
-	}
-	m_hlp->digest = (uint8_t *)p;
-
-	return m;
-}
-
-static int
-perf_AES_GCM(uint8_t dev_id, uint16_t queue_id,
-	     struct perf_test_params *pparams, uint32_t test_ops)
-{
-	int j = 0;
-	struct crypto_testsuite_params *ts_params = &testsuite_params;
-	struct rte_cryptodev_sym_session *sess;
-	struct rte_crypto_op *ops[pparams->burst_size];
-	struct rte_crypto_op *proc_ops[pparams->burst_size];
-	uint32_t total_operations = pparams->total_operations;
-
-	uint64_t burst_enqueued = 0, total_enqueued = 0, burst_dequeued = 0;
-	uint64_t processed = 0, failed_polls = 0, retries = 0;
-	uint64_t tsc_start = 0, tsc_end = 0;
-
-	uint16_t i = 0, l = 0, m = 0;
-	uint16_t burst = pparams->burst_size * NUM_MBUF_SETS;
-	uint16_t ops_unused = 0;
-
-	struct rte_mbuf *mbufs[burst];
-	struct crypto_params m_hlp[burst];
-
-	if (rte_cryptodev_count() == 0) {
-		printf("\nNo crypto devices available. "
-				"Is kernel driver loaded?\n");
-		return TEST_FAILED;
-	}
-
-	sess = test_perf_create_session(dev_id, pparams);
-	TEST_ASSERT_NOT_NULL(sess, "Session creation failed");
-
-	for (i = 0; i < burst; i++) {
-		mbufs[i] = test_perf_create_pktmbuf_fill(
-				ts_params->mbuf_mp,
-				pparams, pparams->symmetric_op->p_len,
-				&m_hlp[i]);
-	}
-
-	if (test_ops)
-		total_operations = test_ops;
-
-	tsc_start = rte_rdtsc_precise();
-	while (total_enqueued < total_operations) {
-		uint16_t burst_size =
-		total_enqueued+pparams->burst_size <= total_operations ?
-		pparams->burst_size : total_operations-total_enqueued;
-		uint16_t ops_needed = burst_size-ops_unused;
-
-		if (ops_needed != rte_crypto_op_bulk_alloc(ts_params->op_mpool,
-				RTE_CRYPTO_OP_TYPE_SYMMETRIC, ops, ops_needed)){
-			printf("\nFailed to alloc enough ops, "
-					"finish dequeuing");
-		} else {
-			for (i = 0; i < ops_needed; i++)
-				ops[i] = perf_gcm_set_crypto_op(ops[i],
-					mbufs[i + (pparams->burst_size *
-						(j % NUM_MBUF_SETS))],
-					sess, &m_hlp[i + (pparams->burst_size *
-						(j % NUM_MBUF_SETS))], pparams);
-
-			/* enqueue burst */
-			burst_enqueued = rte_cryptodev_enqueue_burst(dev_id,
-					queue_id, ops, burst_size);
-
-			if (burst_enqueued < burst_size)
-				retries++;
-
-			ops_unused = burst_size-burst_enqueued;
-			total_enqueued += burst_enqueued;
-		}
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-
-			for (l = 0; l < burst_dequeued; l++)
-				rte_crypto_op_free(proc_ops[l]);
-		}
-
-		j++;
-	}
-
-	/* Dequeue any operations still in the crypto device */
-	while (processed < total_operations) {
-		/* Sending 0 length burst to flush sw crypto device */
-		rte_cryptodev_enqueue_burst(dev_id, queue_id, NULL, 0);
-
-		/* dequeue burst */
-		burst_dequeued = rte_cryptodev_dequeue_burst(dev_id, queue_id,
-				proc_ops, pparams->burst_size);
-		if (burst_dequeued == 0)
-			failed_polls++;
-		else {
-			processed += burst_dequeued;
-
-		for (m = 0; m < burst_dequeued; m++) {
-			if (test_ops) {
-				uint8_t *pkt = rte_pktmbuf_mtod(
-					proc_ops[m]->sym->m_src,
-					uint8_t *);
-
-				TEST_ASSERT_BUFFERS_ARE_EQUAL(
-					pparams->symmetric_op->c_data,
-					pkt +
-					pparams->session_attrs->aad_len,
-					pparams->symmetric_op->c_len,
-					"GCM Ciphertext data not as expected");
-
-				TEST_ASSERT_BUFFERS_ARE_EQUAL(
-					pparams->symmetric_op->t_data,
-					pkt +
-					pparams->session_attrs->aad_len +
-					pparams->symmetric_op->c_len,
-					pparams->symmetric_op->t_len,
-					"GCM MAC data not as expected");
-
-				}
-				rte_crypto_op_free(proc_ops[m]);
-			}
-		}
-	}
-
-	tsc_end = rte_rdtsc_precise();
-
-	double ops_s = ((double)processed / (tsc_end - tsc_start))
-			* rte_get_tsc_hz();
-	double throughput = (ops_s * pparams->symmetric_op->p_len * 8)
-			/ 1000000000;
-
-	if (!test_ops) {
-		printf("\n%u\t\t%6.2f\t%16.2f\t%8"PRIu64"\t%10"PRIu64,
-		pparams->symmetric_op->p_len,
-		ops_s/1000000, throughput, retries, failed_polls);
-	}
-
-	for (i = 0; i < burst; i++)
-		rte_pktmbuf_free(mbufs[i]);
-
-	rte_cryptodev_sym_session_clear(ts_params->dev_id, sess);
-	rte_cryptodev_sym_session_free(sess);
-
-	return 0;
-}
-
-static int
-test_perf_AES_GCM(int continual_buf_len, int continual_size)
-{
-	uint16_t i, j, k, loops = 1;
-
-	uint16_t buf_lengths[] = { 64, 128, 256, 512, 1024, 1536, 2048 };
-
-	static const struct cryptodev_perf_test_data *gcm_tests[] = {
-			&AES_GCM_128_12IV_0AAD
-	};
-
-	if (continual_buf_len)
-		loops = continual_size;
-
-	int TEST_CASES_GCM = RTE_DIM(gcm_tests);
-
-	const unsigned burst_size = 32;
-
-	struct symmetric_op ops_set[TEST_CASES_GCM];
-	struct perf_test_params params_set[TEST_CASES_GCM];
-	struct symmetric_session_attrs session_attrs[TEST_CASES_GCM];
-	static const struct cryptodev_perf_test_data *gcm_test;
-
-	for (i = 0; i < TEST_CASES_GCM; ++i) {
-
-		gcm_test = gcm_tests[i];
-
-		session_attrs[i].aead =
-				RTE_CRYPTO_AEAD_OP_ENCRYPT;
-		session_attrs[i].aead_algorithm =
-				RTE_CRYPTO_AEAD_AES_GCM;
-		session_attrs[i].key_aead_data =
-				gcm_test->key.data;
-		session_attrs[i].key_aead_len =
-				gcm_test->key.len;
-		session_attrs[i].aad_len = gcm_test->aad.len;
-		session_attrs[i].digest_len =
-				gcm_test->auth_tag.len;
-		session_attrs[i].iv_len = gcm_test->iv.len;
-		session_attrs[i].iv_data = gcm_test->iv.data;
-
-		ops_set[i].aad_data = gcm_test->aad.data;
-		ops_set[i].p_data = gcm_test->plaintext.data;
-		ops_set[i].p_len = buf_lengths[i];
-		ops_set[i].c_data = gcm_test->ciphertext.data;
-		ops_set[i].c_len = buf_lengths[i];
-		ops_set[i].t_data = gcm_test->auth_tags[i].data;
-		ops_set[i].t_len = gcm_test->auth_tags[i].len;
-
-		params_set[i].chain = AEAD;
-		params_set[i].session_attrs = &session_attrs[i];
-		params_set[i].symmetric_op = &ops_set[i];
-		if (continual_buf_len)
-			params_set[i].total_operations = 0xFFFFFF;
-		else
-			params_set[i].total_operations = 1000000;
-
-		params_set[i].burst_size = burst_size;
-
-	}
-
-	if (continual_buf_len)
-		printf("\nCipher algo: %s Cipher hash: %s cipher key size: %ub"
-			" burst size: %u", "AES_GCM", "AES_GCM",
-			gcm_test->key.len << 3,	burst_size);
-
-	for (i = 0; i < RTE_DIM(gcm_tests); i++) {
-
-		if (!continual_buf_len) {
-			printf("\nCipher algo: %s Cipher hash: %s cipher key size: %ub"
-				" burst size: %u", "AES_GCM", "AES_GCM",
-				gcm_test->key.len << 3,	burst_size);
-			printf("\nBuffer Size(B)\tOPS(M)\tThroughput(Gbps)\t"
-				" Retries\tEmptyPolls");
-		}
-
-		uint16_t len = RTE_DIM(buf_lengths);
-		uint16_t p = 0;
-
-		if (continual_buf_len) {
-			for (k = 0; k < RTE_DIM(buf_lengths); k++)
-				if (buf_lengths[k] == continual_buf_len) {
-					len = k + 1;
-					p = k;
-					break;
-				}
-		}
-		for (j = p; j < len; ++j) {
-
-			params_set[i].symmetric_op->c_len = buf_lengths[j];
-			params_set[i].symmetric_op->p_len = buf_lengths[j];
-
-			ops_set[i].t_data = gcm_tests[i]->auth_tags[j].data;
-			ops_set[i].t_len = gcm_tests[i]->auth_tags[j].len;
-
-			/* Run is twice, one for encryption/hash checks,
-			 * one for perf
-			 */
-			if (perf_AES_GCM(testsuite_params.dev_id, 0,
-					&params_set[i], 1))
-				return TEST_FAILED;
-
-			for (k = 0; k < loops; k++) {
-				if (continual_buf_len)
-					printf("\n\nBuffer Size(B)\tOPS(M)\t"
-						"Throughput(Gbps)\t"
-						"Retries\tEmptyPolls");
-				if (perf_AES_GCM(testsuite_params.dev_id, 0,
-						&params_set[i], 0))
-					return TEST_FAILED;
-				if (continual_buf_len)
-					printf("\n\nCompleted loop %i of %i ...",
-						k+1, loops);
-			}
-		}
-
-	}
-	printf("\n");
-	return 0;
-}
-
-static int test_cryptodev_perf_AES_GCM(void)
-{
-	return test_perf_AES_GCM(0, 0);
-}
-/*
- * This function calls AES GCM performance tests providing
- * size of packet as an argument. If size of packet is not
- * in the buf_lengths array, all sizes will be used
- */
-static int test_continual_perf_AES_GCM(void)
-{
-	return test_perf_AES_GCM(1024, 10);
-}
-
-static int
-test_perf_continual_performance_test(void)
-{
-	unsigned int total_operations = 0xFFFFFF;
-	unsigned int total_loops = 10;
-	unsigned int burst_size = 32;
-	uint8_t i;
-
-	struct perf_test_params params_set = {
-		.total_operations = total_operations,
-		.burst_size = burst_size,
-		.buf_size = 1024,
-
-		.chain = CIPHER_HASH,
-
-		.cipher_algo  = RTE_CRYPTO_CIPHER_AES_CBC,
-		.key_length = 16,
-		.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC
-	};
-
-	for (i = 1; i <= total_loops; ++i) {
-		printf("\n%s. cipher algo: %s auth algo: %s cipher key size=%u."
-			" burst_size: %d ops\n",
-			chain_mode_name(params_set.chain),
-			rte_crypto_cipher_algorithm_strings[params_set.cipher_algo],
-			rte_crypto_auth_algorithm_strings[params_set.auth_algo],
-			params_set.key_length,
-			burst_size);
-		printf("\nBuffer Size(B)\tOPS(M)\tThroughput(Gbps)\t"
-				"Retries\tEmptyPolls\n");
-				test_perf_aes_sha(testsuite_params.dev_id, 0,
-					&params_set);
-		printf("\nCompleted loop %i of %i ...", i, total_loops);
-	}
-	return 0;
-}
-
-static struct unit_test_suite cryptodev_qat_continual_testsuite  = {
-	.suite_name = "Crypto Device Continual Performance Test",
-	.setup = testsuite_setup,
-	.teardown = testsuite_teardown,
-	.unit_test_cases = {
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_continual_performance_test),
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_continual_perf_AES_GCM),
-		TEST_CASES_END() /**< NULL terminate unit test array */
-	}
-};
-
-static struct unit_test_suite cryptodev_testsuite  = {
-	.suite_name = "Crypto Device Unit Test Suite",
-	.setup = testsuite_setup,
-	.teardown = testsuite_teardown,
-	.unit_test_cases = {
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_aes_cbc_encrypt_digest_vary_pkt_size),
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_cryptodev_perf_AES_GCM),
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_aes_cbc_vary_burst_size),
-		TEST_CASES_END() /**< NULL terminate unit test array */
-	}
-};
-
-static struct unit_test_suite cryptodev_dpaa2_sec_testsuite  = {
-	.suite_name = "Crypto Device DPAA2_SEC Unit Test Suite",
-	.setup = testsuite_setup,
-	.teardown = testsuite_teardown,
-	.unit_test_cases = {
-		TEST_CASE_ST(ut_setup, ut_teardown,
-			     test_perf_aes_cbc_encrypt_digest_vary_pkt_size),
-		TEST_CASES_END() /**< NULL terminate unit test array */
-	}
-};
-
-static struct unit_test_suite cryptodev_gcm_testsuite  = {
-	.suite_name = "Crypto Device AESNI GCM Unit Test Suite",
-	.setup = testsuite_setup,
-	.teardown = testsuite_teardown,
-	.unit_test_cases = {
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_cryptodev_perf_AES_GCM),
-		TEST_CASES_END() /**< NULL terminate unit test array */
-	}
-};
-
-static struct unit_test_suite cryptodev_aes_testsuite  = {
-	.suite_name = "Crypto Device AESNI MB Unit Test Suite",
-	.setup = testsuite_setup,
-	.teardown = testsuite_teardown,
-	.unit_test_cases = {
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_aes_cbc_encrypt_digest_vary_pkt_size),
-		TEST_CASES_END() /**< NULL terminate unit test array */
-	}
-};
-
-static struct unit_test_suite cryptodev_snow3g_testsuite  = {
-	.suite_name = "Crypto Device SNOW3G Unit Test Suite",
-	.setup = testsuite_setup,
-	.teardown = testsuite_teardown,
-	.unit_test_cases = {
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_snow3G_vary_pkt_size),
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_snow3G_vary_burst_size),
-		TEST_CASES_END() /**< NULL terminate unit test array */
-	}
-};
-
-static struct unit_test_suite cryptodev_openssl_testsuite  = {
-	.suite_name = "Crypto Device OPENSSL Unit Test Suite",
-	.setup = testsuite_setup,
-	.teardown = testsuite_teardown,
-	.unit_test_cases = {
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_openssl_vary_pkt_size),
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_openssl_vary_burst_size),
-		TEST_CASES_END() /**< NULL terminate unit test array */
-	}
-};
-
-static struct unit_test_suite cryptodev_armv8_testsuite  = {
-	.suite_name = "Crypto Device ARMv8 Unit Test Suite",
-	.setup = testsuite_setup,
-	.teardown = testsuite_teardown,
-	.unit_test_cases = {
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_armv8_vary_pkt_size),
-		TEST_CASE_ST(ut_setup, ut_teardown,
-				test_perf_armv8_vary_burst_size),
-		TEST_CASES_END() /**< NULL terminate unit test array */
-	}
-};
-
-static int
-perftest_aesni_gcm_cryptodev(void)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_AESNI_GCM is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_gcm_testsuite);
-}
-
-static int
-perftest_aesni_mb_cryptodev(void /*argv __rte_unused, int argc __rte_unused*/)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_AESNI_MB is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_aes_testsuite);
-}
-
-static int
-perftest_qat_cryptodev(void /*argv __rte_unused, int argc __rte_unused*/)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_QAT is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_testsuite);
-}
-
-static int
-perftest_sw_snow3g_cryptodev(void /*argv __rte_unused, int argc __rte_unused*/)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_SNOW3G is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_snow3g_testsuite);
-}
-
-static int
-perftest_qat_snow3g_cryptodev(void /*argv __rte_unused, int argc __rte_unused*/)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_QAT is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_snow3g_testsuite);
-}
-
-static int
-perftest_openssl_cryptodev(void /*argv __rte_unused, int argc __rte_unused*/)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "OpenSSL PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_OPENSSL is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_openssl_testsuite);
-}
-
-static int
-perftest_qat_continual_cryptodev(void)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_QAT is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_qat_continual_testsuite);
-}
-
-static int
-perftest_sw_armv8_cryptodev(void /*argv __rte_unused, int argc __rte_unused*/)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_ARMV8 is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_armv8_testsuite);
-}
-
-static int
-perftest_dpaa2_sec_cryptodev(void)
-{
-	gbl_driver_id = rte_cryptodev_driver_id_get(
-			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
-
-	if (gbl_driver_id == -1) {
-		RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded. Check if "
-				"CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC is enabled "
-				"in config file to run this testsuite.\n");
-		return TEST_FAILED;
-	}
-
-	return unit_test_suite_runner(&cryptodev_dpaa2_sec_testsuite);
-}
-
-REGISTER_TEST_COMMAND(cryptodev_aesni_mb_perftest, perftest_aesni_mb_cryptodev);
-REGISTER_TEST_COMMAND(cryptodev_qat_perftest, perftest_qat_cryptodev);
-REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_perftest, perftest_sw_snow3g_cryptodev);
-REGISTER_TEST_COMMAND(cryptodev_qat_snow3g_perftest, perftest_qat_snow3g_cryptodev);
-REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_perftest, perftest_aesni_gcm_cryptodev);
-REGISTER_TEST_COMMAND(cryptodev_openssl_perftest,
-		perftest_openssl_cryptodev);
-REGISTER_TEST_COMMAND(cryptodev_qat_continual_perftest,
-		perftest_qat_continual_cryptodev);
-REGISTER_TEST_COMMAND(cryptodev_sw_armv8_perftest,
-		perftest_sw_armv8_cryptodev);
-REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_perftest,
-		      perftest_dpaa2_sec_cryptodev);
-- 
2.9.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v5 2/5] net/i40e: implement dynamic mapping of sw flow types to hw pctypes
  @ 2017-10-04 12:52  3%       ` Kirill Rybalchenko
  0 siblings, 0 replies; 200+ results
From: Kirill Rybalchenko @ 2017-10-04 12:52 UTC (permalink / raw)
  To: dev; +Cc: kirill.rybalchenko, andrey.chilikin, beilei.xing, jingjing.wu

Implement dynamic mapping of software flow types to hardware pctypes.
This allows to add new flow types and pctypes for DDP without changing
API of the driver. The mapping table is located in private
data area for particular network adapter and can be individually
modified with set of appropriate functions.

v2:
Re-arrange patchset to avoid compillation errors.
Remove usage of statically defined flow types and pctypes.

v3:
Change prototypes of some static functions.
Fixe bugs in i40e_pctype_to_flowtype and i40e_flowtype_to_pctype
functions.
Various small modifications after reviewing.

v4:
Change prototypes of some static functions.
Move declaration of automatic variables to beginning of function.
Move declaration of I40E_FILTER_PCTYPE_INVALID to i40e_ethdev.h

v5:
Fix code style warnings.

Signed-off-by: Kirill Rybalchenko <kirill.rybalchenko@intel.com>
---
 drivers/net/i40e/i40e_ethdev.c    | 347 ++++++++++++--------------------------
 drivers/net/i40e/i40e_ethdev.h    |  23 ++-
 drivers/net/i40e/i40e_ethdev_vf.c |  16 +-
 drivers/net/i40e/i40e_fdir.c      |  54 +++---
 drivers/net/i40e/i40e_flow.c      |   5 +-
 drivers/net/i40e/i40e_rxtx.c      |  58 +++++++
 drivers/net/i40e/i40e_rxtx.h      |   1 +
 7 files changed, 218 insertions(+), 286 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 41c4033..0b151a0 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -1070,6 +1070,7 @@ eth_i40e_dev_init(struct rte_eth_dev *dev)
 		return 0;
 	}
 	i40e_set_default_ptype_table(dev);
+	i40e_set_default_pctype_table(dev);
 	pci_dev = RTE_ETH_DEV_TO_PCI(dev);
 	intr_handle = &pci_dev->intr_handle;
 
@@ -3020,7 +3021,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
 						sizeof(uint32_t);
 	dev_info->reta_size = pf->hash_lut_size;
-	dev_info->flow_type_rss_offloads = I40E_RSS_OFFLOAD_ALL;
+	dev_info->flow_type_rss_offloads = pf->adapter->flow_types_mask;
 
 	dev_info->default_rxconf = (struct rte_eth_rxconf) {
 		.rx_thresh = {
@@ -6611,104 +6612,36 @@ i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct ether_addr *addr)
 
 /* Configure hash enable flags for RSS */
 uint64_t
-i40e_config_hena(uint64_t flags, enum i40e_mac_type type)
+i40e_config_hena(const struct i40e_adapter *adapter, uint64_t flags)
 {
 	uint64_t hena = 0;
+	int i;
 
 	if (!flags)
 		return hena;
 
-	if (flags & ETH_RSS_FRAG_IPV4)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4;
-	if (flags & ETH_RSS_NONFRAG_IPV4_TCP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV4_UDP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV4_SCTP)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP;
-	if (flags & ETH_RSS_NONFRAG_IPV4_OTHER)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER;
-	if (flags & ETH_RSS_FRAG_IPV6)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6;
-	if (flags & ETH_RSS_NONFRAG_IPV6_TCP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP;
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (flags & (1ULL << i))
+			hena |= adapter->pctypes_tbl[i];
 	}
-	if (flags & ETH_RSS_NONFRAG_IPV6_UDP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV6_SCTP)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP;
-	if (flags & ETH_RSS_NONFRAG_IPV6_OTHER)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER;
-	if (flags & ETH_RSS_L2_PAYLOAD)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD;
 
 	return hena;
 }
 
 /* Parse the hash enable flags */
 uint64_t
-i40e_parse_hena(uint64_t flags)
+i40e_parse_hena(const struct i40e_adapter *adapter, uint64_t flags)
 {
 	uint64_t rss_hf = 0;
 
 	if (!flags)
 		return rss_hf;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4))
-		rss_hf |= ETH_RSS_FRAG_IPV4;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_SCTP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_OTHER;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6))
-		rss_hf |= ETH_RSS_FRAG_IPV6;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_SCTP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_OTHER;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD))
-		rss_hf |= ETH_RSS_L2_PAYLOAD;
+	int i;
 
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (flags & adapter->pctypes_tbl[i])
+			rss_hf |= (1ULL << i);
+	}
 	return rss_hf;
 }
 
@@ -6799,7 +6732,7 @@ i40e_hw_rss_hash_set(struct i40e_pf *pf, struct rte_eth_rss_conf *rss_conf)
 	if (ret)
 		return ret;
 
-	hena = i40e_config_hena(rss_conf->rss_hf, hw->mac.type);
+	hena = i40e_config_hena(pf->adapter, rss_conf->rss_hf);
 	i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), (uint32_t)hena);
 	i40e_write_rx_ctl(hw, I40E_PFQF_HENA(1), (uint32_t)(hena >> 32));
 	I40E_WRITE_FLUSH(hw);
@@ -6813,14 +6746,13 @@ i40e_dev_rss_hash_update(struct rte_eth_dev *dev,
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	uint64_t rss_hf = rss_conf->rss_hf & I40E_RSS_OFFLOAD_ALL;
+	uint64_t rss_hf = rss_conf->rss_hf & pf->adapter->flow_types_mask;
 	uint64_t hena;
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1))) << 32;
-	if (!(hena & ((hw->mac.type == I40E_MAC_X722)
-		 ? I40E_RSS_HENA_ALL_X722
-		 : I40E_RSS_HENA_ALL))) { /* RSS disabled */
+
+	if (!(hena & pf->adapter->pctypes_mask)) { /* RSS disabled */
 		if (rss_hf != 0) /* Enable RSS */
 			return -EINVAL;
 		return 0; /* Nothing to do */
@@ -6845,7 +6777,7 @@ i40e_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1))) << 32;
-	rss_conf->rss_hf = i40e_parse_hena(hena);
+	rss_conf->rss_hf = i40e_parse_hena(pf->adapter, hena);
 
 	return 0;
 }
@@ -7620,7 +7552,7 @@ i40e_pf_config_rss(struct i40e_pf *pf)
 	}
 
 	rss_conf = pf->dev_data->dev_conf.rx_adv_conf.rss_conf;
-	if ((rss_conf.rss_hf & I40E_RSS_OFFLOAD_ALL) == 0) {
+	if ((rss_conf.rss_hf & pf->adapter->flow_types_mask) == 0) {
 		i40e_pf_disable_rss(pf);
 		return 0;
 	}
@@ -7841,9 +7773,9 @@ static int
 i40e_get_hash_filter_global_config(struct i40e_hw *hw,
 				   struct rte_eth_hash_global_conf *g_cfg)
 {
-	uint32_t reg, mask = I40E_FLOW_TYPES;
-	uint16_t i;
-	enum i40e_filter_pctype pctype;
+	struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back;
+	uint32_t reg;
+	uint16_t i, j;
 
 	memset(g_cfg, 0, sizeof(*g_cfg));
 	reg = i40e_read_rx_ctl(hw, I40E_GLQF_CTL);
@@ -7854,29 +7786,38 @@ i40e_get_hash_filter_global_config(struct i40e_hw *hw,
 	PMD_DRV_LOG(DEBUG, "Hash function is %s",
 		(reg & I40E_GLQF_CTL_HTOEP_MASK) ? "Toeplitz" : "Simple XOR");
 
-	for (i = 0; mask && i < RTE_ETH_FLOW_MAX; i++) {
-		if (!(mask & (1UL << i)))
-			continue;
-		mask &= ~(1UL << i);
-		/* Bit set indicats the coresponding flow type is supported */
-		g_cfg->valid_bit_mask[0] |= (1UL << i);
-		/* if flowtype is invalid, continue */
-		if (!I40E_VALID_FLOW(i))
+	/*
+	 * We work only with lowest 32 bits which is not correct, but to work
+	 * properly the valid_bit_mask size should be increased up to 64 bits
+	 * and this will brake ABI. This modification will be done in next
+	 * release
+	 */
+	g_cfg->valid_bit_mask[0] = (uint32_t)adapter->flow_types_mask;
+
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < UINT32_BIT; i++) {
+		if (!adapter->pctypes_tbl[i])
 			continue;
-		pctype = i40e_flowtype_to_pctype(i);
-		reg = i40e_read_rx_ctl(hw, I40E_GLQF_HSYM(pctype));
-		if (reg & I40E_GLQF_HSYM_SYMH_ENA_MASK)
-			g_cfg->sym_hash_enable_mask[0] |= (1UL << i);
+		for (j = I40E_FILTER_PCTYPE_INVALID + 1;
+		     j < I40E_FILTER_PCTYPE_MAX; j++) {
+			if (adapter->pctypes_tbl[i] & (1ULL << j)) {
+				reg = i40e_read_rx_ctl(hw, I40E_GLQF_HSYM(j));
+				if (reg & I40E_GLQF_HSYM_SYMH_ENA_MASK) {
+					g_cfg->sym_hash_enable_mask[0] |=
+								(1UL << i);
+				}
+			}
+		}
 	}
 
 	return 0;
 }
 
 static int
-i40e_hash_global_config_check(struct rte_eth_hash_global_conf *g_cfg)
+i40e_hash_global_config_check(const struct i40e_adapter *adapter,
+			      const struct rte_eth_hash_global_conf *g_cfg)
 {
 	uint32_t i;
-	uint32_t mask0, i40e_mask = I40E_FLOW_TYPES;
+	uint32_t mask0, i40e_mask = adapter->flow_types_mask;
 
 	if (g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_TOEPLITZ &&
 		g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_SIMPLE_XOR &&
@@ -7919,64 +7860,36 @@ static int
 i40e_set_hash_filter_global_config(struct i40e_hw *hw,
 				   struct rte_eth_hash_global_conf *g_cfg)
 {
+	struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back;
 	int ret;
-	uint16_t i;
+	uint16_t i, j;
 	uint32_t reg;
-	uint32_t mask0 = g_cfg->valid_bit_mask[0];
-	enum i40e_filter_pctype pctype;
+	/*
+	 * We work only with lowest 32 bits which is not correct, but to work
+	 * properly the valid_bit_mask size should be increased up to 64 bits
+	 * and this will brake ABI. This modification will be done in next
+	 * release
+	 */
+	uint32_t mask0 = g_cfg->valid_bit_mask[0] &
+					(uint32_t)adapter->flow_types_mask;
 
 	/* Check the input parameters */
-	ret = i40e_hash_global_config_check(g_cfg);
+	ret = i40e_hash_global_config_check(adapter, g_cfg);
 	if (ret < 0)
 		return ret;
 
-	for (i = 0; mask0 && i < UINT32_BIT; i++) {
-		if (!(mask0 & (1UL << i)))
-			continue;
-		mask0 &= ~(1UL << i);
-		/* if flowtype is invalid, continue */
-		if (!I40E_VALID_FLOW(i))
-			continue;
-		pctype = i40e_flowtype_to_pctype(i);
-		reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
-				I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_UDP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP),
-				  reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_TCP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_TCP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_UDP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP),
-				  reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_TCP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK),
-				  reg);
-			} else {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype),
-				  reg);
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; mask0 && i < UINT32_BIT; i++) {
+		if (mask0 & (1UL << i)) {
+			reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
+					I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
+
+			for (j = I40E_FILTER_PCTYPE_INVALID + 1;
+			     j < I40E_FILTER_PCTYPE_MAX; j++) {
+				if (adapter->pctypes_tbl[i] & (1ULL << j))
+					i40e_write_rx_ctl(hw,
+							  I40E_GLQF_HSYM(j),
+							  reg);
 			}
-		} else {
-			i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype), reg);
 		}
 	}
 
@@ -8598,16 +8511,14 @@ i40e_filter_input_set_init(struct i40e_pf *pf)
 	uint64_t input_set, inset_reg;
 	uint32_t mask_reg[I40E_INSET_MASK_NUM_REG] = {0};
 	int num, i;
+	uint16_t flow_type;
 
 	for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
 	     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) {
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722(pctype))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE(pctype))
-				continue;
-		}
+		flow_type = i40e_pctype_to_flowtype(pf->adapter, pctype);
+
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
 
 		input_set = i40e_get_default_input_set(pctype);
 
@@ -8670,7 +8581,8 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 		return -EINVAL;
 	}
 
-	if (!I40E_VALID_FLOW(conf->flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, conf->flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
@@ -8678,10 +8590,8 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 	if (hw->mac.type == I40E_MAC_X722) {
 		/* get translated pctype value in fd pctype register */
 		pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(hw,
-			I40E_GLQF_FD_PCTYPES((int)i40e_flowtype_to_pctype(
-			conf->flow_type)));
-	} else
-		pctype = i40e_flowtype_to_pctype(conf->flow_type);
+			I40E_GLQF_FD_PCTYPES((int)pctype));
+	}
 
 	ret = i40e_parse_input_set(&input_set, pctype, conf->field,
 				   conf->inset_size);
@@ -8689,11 +8599,7 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 		PMD_DRV_LOG(ERR, "Failed to parse input set");
 		return -EINVAL;
 	}
-	if (i40e_validate_input_set(pctype, RTE_ETH_FILTER_HASH,
-				    input_set) != 0) {
-		PMD_DRV_LOG(ERR, "Invalid input set");
-		return -EINVAL;
-	}
+
 	if (conf->op == RTE_ETH_INPUT_SET_ADD) {
 		/* get inset value in register */
 		inset_reg = i40e_read_rx_ctl(hw, I40E_GLQF_HASH_INSET(1, pctype));
@@ -8747,24 +8653,19 @@ i40e_fdir_filter_inset_select(struct i40e_pf *pf,
 		return -EINVAL;
 	}
 
-	if (!I40E_VALID_FLOW(conf->flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, conf->flow_type);
+
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
 
-	pctype = i40e_flowtype_to_pctype(conf->flow_type);
-
 	ret = i40e_parse_input_set(&input_set, pctype, conf->field,
 				   conf->inset_size);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "Failed to parse input set");
 		return -EINVAL;
 	}
-	if (i40e_validate_input_set(pctype, RTE_ETH_FILTER_FDIR,
-				    input_set) != 0) {
-		PMD_DRV_LOG(ERR, "Invalid input set");
-		return -EINVAL;
-	}
 
 	/* get inset value in register */
 	inset_reg = i40e_read_rx_ctl(hw, I40E_PRTQF_FD_INSET(pctype, 1));
@@ -9203,72 +9104,42 @@ i40e_hw_init(struct rte_eth_dev *dev)
 	i40e_set_symmetric_hash_enable_per_port(hw, 0);
 }
 
+/*
+ * For X722 it is possible to have multiple pctypes mapped to the same flowtype
+ * however this function will return only one highest pctype index,
+ * which is not quite correct. This is known problem of i40e driver
+ * and needs to be fixed later.
+ */
 enum i40e_filter_pctype
-i40e_flowtype_to_pctype(uint16_t flow_type)
-{
-	static const enum i40e_filter_pctype pctype_table[] = {
-		[RTE_ETH_FLOW_FRAG_IPV4] = I40E_FILTER_PCTYPE_FRAG_IPV4,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_UDP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_TCP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_SCTP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_SCTP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_OTHER] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_OTHER,
-		[RTE_ETH_FLOW_FRAG_IPV6] = I40E_FILTER_PCTYPE_FRAG_IPV6,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_UDP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_TCP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_SCTP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_SCTP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_OTHER] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_OTHER,
-		[RTE_ETH_FLOW_L2_PAYLOAD] = I40E_FILTER_PCTYPE_L2_PAYLOAD,
-	};
+i40e_flowtype_to_pctype(const struct i40e_adapter *adapter, uint16_t flow_type)
+{
+	int i;
+	uint64_t pctype_mask;
 
-	return pctype_table[flow_type];
+	if (flow_type < I40E_FLOW_TYPE_MAX) {
+		pctype_mask = adapter->pctypes_tbl[flow_type];
+		for (i = I40E_FILTER_PCTYPE_MAX - 1; i > 0; i--) {
+			if (pctype_mask & (1ULL << i))
+				return (enum i40e_filter_pctype)i;
+		}
+	}
+	return I40E_FILTER_PCTYPE_INVALID;
 }
 
 uint16_t
-i40e_pctype_to_flowtype(enum i40e_filter_pctype pctype)
+i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
+			enum i40e_filter_pctype pctype)
 {
-	static const uint16_t flowtype_table[] = {
-		[I40E_FILTER_PCTYPE_FRAG_IPV4] = RTE_ETH_FLOW_FRAG_IPV4,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_TCP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_SCTP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_SCTP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_OTHER] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_OTHER,
-		[I40E_FILTER_PCTYPE_FRAG_IPV6] = RTE_ETH_FLOW_FRAG_IPV6,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_TCP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_SCTP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_SCTP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_OTHER] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_OTHER,
-		[I40E_FILTER_PCTYPE_L2_PAYLOAD] = RTE_ETH_FLOW_L2_PAYLOAD,
-	};
+	uint16_t flowtype;
+	uint64_t pctype_mask = 1ULL << pctype;
+
+	for (flowtype = RTE_ETH_FLOW_UNKNOWN + 1; flowtype < I40E_FLOW_TYPE_MAX;
+	     flowtype++) {
+		if (adapter->pctypes_tbl[flowtype] & pctype_mask)
+			return flowtype;
+	}
 
-	return flowtype_table[pctype];
+	return RTE_ETH_FLOW_UNKNOWN;
 }
 
 /*
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index ad80f0f..5b84da2 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -478,8 +478,9 @@ struct i40e_fdir_flex_mask {
 	} bitmask[I40E_FDIR_BITMASK_NUM_WORD];
 };
 
-#define I40E_FILTER_PCTYPE_MAX 64
-#define I40E_MAX_FDIR_FILTER_NUM (1024 * 8)
+#define I40E_FILTER_PCTYPE_INVALID 0
+#define I40E_FILTER_PCTYPE_MAX     64
+#define I40E_MAX_FDIR_FILTER_NUM   (1024 * 8)
 
 struct i40e_fdir_filter {
 	TAILQ_ENTRY(i40e_fdir_filter) rules;
@@ -852,7 +853,8 @@ struct i40e_vf {
 	uint64_t flags;
 };
 
-#define I40E_MAX_PKT_TYPE 256
+#define I40E_MAX_PKT_TYPE  256
+#define I40E_FLOW_TYPE_MAX 64
 
 /*
  * Structure to store private data for each PF/VF instance.
@@ -881,6 +883,10 @@ struct i40e_adapter {
 
 	/* ptype mapping table */
 	uint32_t ptype_tbl[I40E_MAX_PKT_TYPE] __rte_cache_min_aligned;
+	/* flow type to pctype mapping table */
+	uint64_t pctypes_tbl[I40E_FLOW_TYPE_MAX] __rte_cache_min_aligned;
+	uint64_t flow_types_mask;
+	uint64_t pctypes_mask;
 };
 
 extern const struct rte_flow_ops i40e_flow_ops;
@@ -925,8 +931,8 @@ int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi,
 			   struct i40e_vsi_vlan_pvid_info *info);
 int i40e_vsi_config_vlan_stripping(struct i40e_vsi *vsi, bool on);
 int i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on);
-uint64_t i40e_config_hena(uint64_t flags, enum i40e_mac_type type);
-uint64_t i40e_parse_hena(uint64_t flags);
+uint64_t i40e_config_hena(const struct i40e_adapter *adapter, uint64_t flags);
+uint64_t i40e_parse_hena(const struct i40e_adapter *adapter, uint64_t flags);
 enum i40e_status_code i40e_fdir_setup_tx_resources(struct i40e_pf *pf);
 enum i40e_status_code i40e_fdir_setup_rx_resources(struct i40e_pf *pf);
 int i40e_fdir_setup(struct i40e_pf *pf);
@@ -935,8 +941,11 @@ const struct rte_memzone *i40e_memzone_reserve(const char *name,
 					int socket_id);
 int i40e_fdir_configure(struct rte_eth_dev *dev);
 void i40e_fdir_teardown(struct i40e_pf *pf);
-enum i40e_filter_pctype i40e_flowtype_to_pctype(uint16_t flow_type);
-uint16_t i40e_pctype_to_flowtype(enum i40e_filter_pctype pctype);
+enum i40e_filter_pctype
+	i40e_flowtype_to_pctype(const struct i40e_adapter *adapter,
+				uint16_t flow_type);
+uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
+				 enum i40e_filter_pctype pctype);
 int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
 			  enum rte_filter_op filter_op,
 			  void *arg);
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index a903deb..111ac39 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -1443,6 +1443,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
 		return 0;
 	}
 	i40e_set_default_ptype_table(eth_dev);
+	i40e_set_default_pctype_table(eth_dev);
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 	eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
 
@@ -2178,7 +2179,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
 	dev_info->hash_key_size = (I40E_VFQF_HKEY_MAX_INDEX + 1) * sizeof(uint32_t);
 	dev_info->reta_size = ETH_RSS_RETA_SIZE_64;
-	dev_info->flow_type_rss_offloads = I40E_RSS_OFFLOAD_ALL;
+	dev_info->flow_type_rss_offloads = vf->adapter->flow_types_mask;
 	dev_info->max_mac_addrs = I40E_NUM_MACADDR_MAX;
 	dev_info->rx_offload_capa =
 		DEV_RX_OFFLOAD_VLAN_STRIP |
@@ -2506,7 +2507,7 @@ i40evf_hw_rss_hash_set(struct i40e_vf *vf, struct rte_eth_rss_conf *rss_conf)
 	if (ret)
 		return ret;
 
-	hena = i40e_config_hena(rss_conf->rss_hf, hw->mac.type);
+	hena = i40e_config_hena(vf->adapter, rss_conf->rss_hf);
 	i40e_write_rx_ctl(hw, I40E_VFQF_HENA(0), (uint32_t)hena);
 	i40e_write_rx_ctl(hw, I40E_VFQF_HENA(1), (uint32_t)(hena >> 32));
 	I40EVF_WRITE_FLUSH(hw);
@@ -2549,7 +2550,7 @@ i40evf_config_rss(struct i40e_vf *vf)
 	}
 
 	rss_conf = vf->dev_data->dev_conf.rx_adv_conf.rss_conf;
-	if ((rss_conf.rss_hf & I40E_RSS_OFFLOAD_ALL) == 0) {
+	if ((rss_conf.rss_hf & vf->adapter->flow_types_mask) == 0) {
 		i40evf_disable_rss(vf);
 		PMD_DRV_LOG(DEBUG, "No hash flag is set");
 		return 0;
@@ -2574,14 +2575,13 @@ i40evf_dev_rss_hash_update(struct rte_eth_dev *dev,
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	uint64_t rss_hf = rss_conf->rss_hf & I40E_RSS_OFFLOAD_ALL;
+	uint64_t rss_hf = rss_conf->rss_hf & vf->adapter->flow_types_mask;
 	uint64_t hena;
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(1))) << 32;
-	if (!(hena & ((hw->mac.type == I40E_MAC_X722)
-		 ? I40E_RSS_HENA_ALL_X722
-		 : I40E_RSS_HENA_ALL))) { /* RSS disabled */
+
+	if (!(hena & vf->adapter->pctypes_mask)) { /* RSS disabled */
 		if (rss_hf != 0) /* Enable RSS */
 			return -EINVAL;
 		return 0;
@@ -2607,7 +2607,7 @@ i40evf_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(1))) << 32;
-	rss_conf->rss_hf = i40e_parse_hena(hena);
+	rss_conf->rss_hf = i40e_parse_hena(vf->adapter, hena);
 
 	return 0;
 }
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index 84c0a1f..268ada0 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -323,6 +323,7 @@ i40e_init_flx_pld(struct i40e_pf *pf)
 	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
 	uint8_t pctype;
 	int i, index;
+	uint16_t flow_type;
 
 	/*
 	 * Define the bytes stream extracted as flexible payload in
@@ -344,15 +345,10 @@ i40e_init_flx_pld(struct i40e_pf *pf)
 	/* initialize the masks */
 	for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
 	     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) {
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722(
-				 (enum i40e_filter_pctype)pctype))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE(
-				 (enum i40e_filter_pctype)pctype))
-				continue;
-		}
+		flow_type = i40e_pctype_to_flowtype(pf->adapter, pctype);
+
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
 		pf->fdir.flex_mask[pctype].word_mask = 0;
 		i40e_write_rx_ctl(hw, I40E_PRTQF_FD_FLXINSET(pctype), 0);
 		for (i = 0; i < I40E_FDIR_BITMASK_NUM_WORD; i++) {
@@ -449,7 +445,8 @@ i40e_check_fdir_flex_payload(const struct rte_eth_flex_payload_cfg *flex_cfg)
  * arguments are valid
  */
 static int
-i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
+i40e_check_fdir_flex_conf(const struct i40e_adapter *adapter,
+			  const struct rte_eth_fdir_flex_conf *conf)
 {
 	const struct rte_eth_flex_payload_cfg *flex_cfg;
 	const struct rte_eth_fdir_flex_mask *flex_mask;
@@ -457,6 +454,7 @@ i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
 	uint8_t nb_bitmask;
 	uint16_t i, j;
 	int ret = 0;
+	enum i40e_filter_pctype pctype;
 
 	if (conf == NULL) {
 		PMD_DRV_LOG(INFO, "NULL pointer.");
@@ -487,7 +485,8 @@ i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
 	}
 	for (i = 0; i < conf->nb_flexmasks; i++) {
 		flex_mask = &conf->flex_mask[i];
-		if (!I40E_VALID_FLOW(flex_mask->flow_type)) {
+		pctype = i40e_flowtype_to_pctype(adapter, flex_mask->flow_type);
+		if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 			PMD_DRV_LOG(WARNING, "invalid flow type.");
 			return -EINVAL;
 		}
@@ -650,7 +649,7 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
 	i40e_init_flx_pld(pf); /* set flex config to default value */
 
 	conf = &dev->data->dev_conf.fdir_conf.flex_conf;
-	ret = i40e_check_fdir_flex_conf(conf);
+	ret = i40e_check_fdir_flex_conf(pf->adapter, conf);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, " invalid configuration arguments.");
 		return -EINVAL;
@@ -664,11 +663,11 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
 			/* get translated pctype value in fd pctype register */
 			pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(
 				hw, I40E_GLQF_FD_PCTYPES(
-				(int)i40e_flowtype_to_pctype(
+				(int)i40e_flowtype_to_pctype(pf->adapter,
 				conf->flex_mask[i].flow_type)));
 		} else
-			pctype = i40e_flowtype_to_pctype(
-				conf->flex_mask[i].flow_type);
+			pctype = i40e_flowtype_to_pctype(pf->adapter,
+						conf->flex_mask[i].flow_type);
 
 		i40e_set_flex_mask_on_pctype(pf, pctype, &conf->flex_mask[i]);
 	}
@@ -1100,7 +1099,8 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
 		return -ENOTSUP;
 	}
 
-	if (!I40E_VALID_FLOW(filter->input.flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, filter->input.flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
@@ -1141,12 +1141,8 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
 	if (hw->mac.type == I40E_MAC_X722) {
 		/* get translated pctype value in fd pctype register */
 		pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(
-			hw, I40E_GLQF_FD_PCTYPES(
-			(int)i40e_flowtype_to_pctype(
-			filter->input.flow_type)));
-	} else
-		pctype = i40e_flowtype_to_pctype(filter->input.flow_type);
-
+			hw, I40E_GLQF_FD_PCTYPES((int)pctype));
+	}
 	ret = i40e_fdir_filter_programming(pf, pctype, filter, add);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, "fdir programming fails for PCTYPE(%u).",
@@ -1384,7 +1380,6 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
 {
 	struct i40e_fdir_flex_mask *mask;
 	struct rte_eth_fdir_flex_mask *ptr = flex_mask;
-	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
 	uint16_t flow_type;
 	uint8_t i, j;
 	uint16_t off_bytes, mask_tmp;
@@ -1393,14 +1388,11 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
 	     i <= I40E_FILTER_PCTYPE_L2_PAYLOAD;
 	     i++) {
 		mask =  &pf->fdir.flex_mask[i];
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722((enum i40e_filter_pctype)i))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE((enum i40e_filter_pctype)i))
-				continue;
-		}
-		flow_type = i40e_pctype_to_flowtype((enum i40e_filter_pctype)i);
+		flow_type = i40e_pctype_to_flowtype(pf->adapter,
+						    (enum i40e_filter_pctype)i);
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
+
 		for (j = 0; j < I40E_FDIR_MAX_FLEXWORD_NUM; j++) {
 			if (mask->word_mask & I40E_FLEX_WORD_MASK(j)) {
 				ptr->mask[j * sizeof(uint16_t)] = UINT8_MAX;
diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
index b92719a..5d8afc6 100644
--- a/drivers/net/i40e/i40e_flow.c
+++ b/drivers/net/i40e/i40e_flow.c
@@ -2776,8 +2776,9 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev,
 		}
 	}
 
-	pctype = i40e_flowtype_to_pctype(flow_type);
-	if (pctype == 0 || pctype > I40E_FILTER_PCTYPE_L2_PAYLOAD) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID ||
+	    pctype > I40E_FILTER_PCTYPE_L2_PAYLOAD) {
 		rte_flow_error_set(error, EINVAL,
 				   RTE_FLOW_ERROR_TYPE_ITEM, item,
 				   "Unsupported flow type");
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 3a7b68e..f69050f 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -2943,6 +2943,64 @@ i40e_set_default_ptype_table(struct rte_eth_dev *dev)
 		ad->ptype_tbl[i] = i40e_get_default_pkt_type(i);
 }
 
+void __attribute__((cold))
+i40e_set_default_pctype_table(struct rte_eth_dev *dev)
+{
+	struct i40e_adapter *ad =
+			I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	int i;
+
+	for (i = 0; i < I40E_FLOW_TYPE_MAX; i++)
+		ad->pctypes_tbl[i] = 0ULL;
+	ad->flow_types_mask = 0ULL;
+	ad->pctypes_mask = 0ULL;
+
+	ad->pctypes_tbl[RTE_ETH_FLOW_FRAG_IPV4] =
+				(1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_SCTP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_OTHER] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER);
+	ad->pctypes_tbl[RTE_ETH_FLOW_FRAG_IPV6] =
+				(1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_SCTP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_OTHER] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER);
+	ad->pctypes_tbl[RTE_ETH_FLOW_L2_PAYLOAD] =
+				(1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD);
+
+	if (hw->mac.type == I40E_MAC_X722) {
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] |=
+			(1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] |=
+			(1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] |=
+			(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] |=
+			(1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] |=
+			(1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] |=
+			(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK);
+	}
+
+	for (i = 0; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (ad->pctypes_tbl[i])
+			ad->flow_types_mask |= (1ULL << i);
+		ad->pctypes_mask |= ad->pctypes_tbl[i];
+	}
+}
+
 /* Stubs needed for linkage when CONFIG_RTE_I40E_INC_VECTOR is set to 'n' */
 int __attribute__((weak))
 i40e_rx_vec_dev_conf_condition_check(struct rte_eth_dev __rte_unused *dev)
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index 20084d6..2a58ced 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -255,6 +255,7 @@ void i40e_set_tx_function_flag(struct rte_eth_dev *dev,
 			       struct i40e_tx_queue *txq);
 void i40e_set_tx_function(struct rte_eth_dev *dev);
 void i40e_set_default_ptype_table(struct rte_eth_dev *dev);
+void i40e_set_default_pctype_table(struct rte_eth_dev *dev);
 
 /* For each value it means, datasheet of hardware can tell more details
  *
-- 
2.5.5

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v4] Policy Based Power Control for Guest
  @ 2017-10-04  9:15  2% ` David Hunt
  2017-10-04 15:25  2%   ` [dpdk-dev] [PATCH v5 0/9] " David Hunt
  0 siblings, 1 reply; 200+ results
From: David Hunt @ 2017-10-04  9:15 UTC (permalink / raw)
  To: dev; +Cc: konstantin.ananyev, jingjing.wu

This patchset adds the facility for a guest VM to send a policy down to the
host that will allow the host to scale up/down cpu frequencies
depending on the policy criteria independently of the DPDK app running in
the guest.  This differs from the previous vm_power implementation where
individual scale up/down requests were send from the guest to the host via
virtio-serial.

V4 patchset changes:
  * None, replying into correct email thread. V3 was a reply to the
    turbo patch set, should have been inband policy power patchset.

V3 patchset changes:
  * Changed to using is_same_ether_addr() instead of looping through
    the mac address bytes to compare them.
  * Tweaked some comments and working in the i40e patch after review.
  * Added a patch to the set to add new i40e function to map file, so
    as to allow shared library builds. The power library API needs a cleanup
    in next release, so will add API/ABI warning for this cleanup in a
    separate patch.

V2 patchset changes:
  * Removed API's in ethdev layer.
  * Now just a single new API in the i40e driver for mapping VF MAC to
    VF index.
  * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
  * Removed function for reading i40e register, moved to using the
    standard stats API.
  * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
  * Cleaned up policy generation code.

It's a modification of the vm_power_manager app that runs in the host, and
the guest_vm_power_app example app that runs in the guest. This allows the
guest to send down a policy to the host via virtio-serial, which then allows
the host to scale up/down based on the criteria in the policy, resulting in
quicker scale up/down than individual requests coming from the guest.
It also means that the DPDK application running in the guest does not need
to be modified in any way, it is unaware that it's cores are being scaled
up/down, reducing the effort in implementing a power-aware infrastructure.

The usage model is as follows:
1. Set up the VF's and assign to the guest in the usual way.
2. run vm_power_manager on the host, creating a channel to the guest.
3. Start the guest_vm_power_mgr app on the guest, which establishes
   a virtio-serial channel to the host.
4. Send down the profile for the guest using the "send_profile now" command.
   There is an example profile hard-coded into guest_vm_power_mgr.
5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
6. Send traffic into the VFs at varying traffic rates.
   Observe the frequency change on the host (turbostat -i 1)

The sequence of code changes are as follows:

A new function has been aded to the i40e driver to allow mapping of
a VF MAC to VF index.

Next we make an addition to librte_power that adds an extra command to allow
the passing of a policy structure from the guest to the host. This struct
contains information like busy/quiet hour, packet throughput thresholds, etc.

The next addition adds functionality to convert the virtual CPU (vcpU0 IDs to
physical CPU (pcpu) IDs so that the host can scale up/down the cores used
in the guest.

The remaining patches are functionality to process the policy, and take action
when the relevant trigger occurs to cause a frequency change.

[1/9] net/i40e: add API to convert VF MAC to VF id
[2/9] lib/librte_power: add extra msg type for policies
[3/9] examples/vm_power_mgr: add vcpu to pcpu mapping
[4/9] examples/vm_power_mgr: add scale to medium freq fn
[5/9] examples/vm_power_mgr: add policy to channels
[6/9] examples/vm_power_mgr: add port initialisation
[7/9] power: add send channel msg function to map file
[8/9] examples/guest_cli: add send policy to host
[9/9] examples/vm_power_mgr: set MAC address of VF

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v6 0/4] ethdev new offloads API
  2017-09-28 18:54  4%     ` [dpdk-dev] [PATCH v5 " Shahaf Shuler
@ 2017-10-04  8:17  4%       ` Shahaf Shuler
  2017-10-04 16:12  0%         ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Shahaf Shuler @ 2017-10-04  8:17 UTC (permalink / raw)
  To: konstantin.ananyev, thomas, arybchenko, jerin.jacob, ferruh.yigit; +Cc: dev

Tx offloads configuration is per queue. Tx offloads are enabled by default, 
and can be disabled using ETH_TXQ_FLAGS_NO* flags. 
This behaviour is not consistent with the Rx side where the Rx offloads
configuration is per port. Rx offloads are disabled by default and enabled 
according to bit field in rte_eth_rxmode structure.

Moreover, considering more Tx and Rx offloads will be added 
over time, the cost of managing them all inside the PMD will be tremendous,
as the PMD will need to check the matching for the entire offload set 
for each mbuf it handles.
In addition, on the current approach each Rx offload added breaks the
ABI compatibility as it requires to add entries to existing bit-fields.
 
The series address above issues by defining a new offloads API.
In the new API, offloads are divided into per-port and per-queue offloads,
with a corresponding capability for each.
The offloads are disabled by default. Each offload can be enabled or
disabled using the existing DEV_TX_OFFLOADS_* or DEV_RX_OFFLOADS_* flags.
Such API will enable to easily add or remove offloads, without breaking the
ABI compatibility.

In order to provide a smooth transition between the APIs the following actions
were taken:
*  The old offloads API is kept for the meanwhile.
*  Helper function which copy from old to new API were added to ethdev,
   enabling the PMD to support only one of the APIs.
*  Helper function which copy from new to old API were also added,
   to enable application to use the new API with PMD which still supports
   the old one.

Per discussion made on the RFC of this series [1], the integration plan which was
decided is to do the transition in two phases:
* ethdev API will move on 17.11.
* Apps and examples will move on 18.02.

This to enable PMD maintainers sufficient time to adopt the new API.

[1]
http://dpdk.org/ml/archives/dev/2017-August/072643.html

on v6:
 - Move mbuf fast free Tx offload to a seperate patch.

on v5:
 - Fix documentation.
 - Fix comments on port offloads configuration.

on v4:
 - Added another patch for documentation.
 - Fixed ETH_TXQ_FLAGS_IGNORE flag override.
 - Clarify the description of DEV_TX_OFFLOAD_MBUF_FAST_FREE offload.

on v3:
 - Introduce the DEV_TX_OFFLOAD_MBUF_FAST_FREE to act as an equivalent
   for the no refcnt and single mempool flags.
 - Fix features documentation.
 - Fix comment style.

on v2:
 - Taking new approach of dividing offloads into per-queue and per-port one.
 - Postpone the Tx/Rx public struct renaming to 18.02
 - Squash the helper functions into the Rx/Tx offloads intro patches.

Shahaf Shuler (4):
  ethdev: introduce Rx queue offloads API
  ethdev: introduce Tx queue offloads API
  ethdev: add mbuf fast free Tx offload
  doc: add details on ethdev offloads API

 doc/guides/nics/features.rst            |  66 +++++---
 doc/guides/nics/features/default.ini    |   1 +
 doc/guides/prog_guide/poll_mode_drv.rst |  20 +++
 lib/librte_ether/rte_ethdev.c           | 223 +++++++++++++++++++++++++--
 lib/librte_ether/rte_ethdev.h           |  89 ++++++++++-
 5 files changed, 359 insertions(+), 40 deletions(-)

Series-reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>

-- 
2.12.0

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
  2017-10-03 14:29  0%   ` Mokhtar, Amr
@ 2017-10-03 15:17  4%     ` Thomas Monjalon
  2017-10-04 17:11  0%       ` Flavio Leitner
  2017-10-05 21:55  0%       ` Mokhtar, Amr
  0 siblings, 2 replies; 200+ results
From: Thomas Monjalon @ 2017-10-03 15:17 UTC (permalink / raw)
  To: Mokhtar, Amr; +Cc: dev, fbl, aconole, bluca

03/10/2017 16:29, Mokhtar, Amr:
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > 25/08/2017 15:46, Amr Mokhtar:
> > > +int
> > > +rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues,
> > > +		const struct rte_bbdev_conf *conf);
> > 
> > I am not convinced by the "configure all" function in ethdev.
> > We break the ABI each time we add a new feature to configure.
> > And it does not really help to have all configurations in one struct.
> > Would you mind to split the struct rte_bbdev_conf and split the function
> > accordingly?
> 
> There is nothing to split tbh. The only parameter it has is the socket_id.
> And in fact, it's optional, can be null. The only config we need is num_queues.

Indeed, there is nothing in this struct.
If you need only to allocate queues, you just have to rename this function.

> I don't see in the near future that we may need to add more config params.
> As a side, in the time of the implementation we were trying to avoid any
> diversions from the current design ideology of ethdev and cryptodev.

There is no ideology in ethdev, just some mistakes ;)

> Can we leave it for consideration with future releases?

No it should be addressed from the beginning.

When you will need to add something more to configure port-wise,
you should add a new function instead of breaking the ABI
of the global conf struct.
That's why the configure option should be more specialized.

Distro people were complaining about ABI breakage last week.
This is exactly an example of how to avoid it from the beginning.


> > [...]
> > > +struct __rte_cache_aligned rte_bbdev {
> > > +	rte_bbdev_enqueue_ops_t enqueue_ops; /**< Enqueue function */
> > > +	rte_bbdev_dequeue_ops_t dequeue_ops;  /**< Dequeue function */
> > > +	const struct rte_bbdev_ops *dev_ops;  /**< Functions exported by PMD
> > */
> > > +	struct rte_bbdev_data *data;  /**< Pointer to device data */
> > > +	bool attached;  /**< If device is currently attached or not */
> > 
> > What "attached" means?
> > I'm afraid you are trying to manage hotplug in the wrong layer.
> 
> Hotplug is not supported in the current release.

It is not answering the question.
What is an "attached" device?


> > [...]
> > > +/** Structure specifying a single operation */ struct rte_bbdev_op {
> > > +	enum rte_bbdev_op_type type;  /**< Type of this operation */
> > > +	int status;  /**< Status of operation that was performed */
> > > +	struct rte_mempool *mempool;  /**< Mempool which op instance is in
> > */
> > > +	void *opaque_data;  /**< Opaque pointer for user data */
> > > +	/**
> > > +	 * Anonymous union of operation-type specific parameters. When
> > allocated
> > > +	 * using rte_bbdev_op_pool_create(), space is allocated for the
> > > +	 * parameters at the end of each rte_bbdev_op structure, and the
> > > +	 * pointers here point to it.
> > > +	 */
> > > +	RTE_STD_C11
> > > +	union {
> > > +		void *generic;
> > > +		struct rte_bbdev_op_turbo_dec *turbo_dec;
> > > +		struct rte_bbdev_op_turbo_enc *turbo_enc;
> > > +	};
> > > +};
> > 
> > I am not sure it is a good idea to fit every operations
> > in the same struct and the same functions.
> 
> Due to the fact that our design adopts this idea that a device can support both
> the encode and decode operations.
> Then, at the time of PMD registration, the enqueue functions is allocated.
> This enqueue() function is common for both operations.
> This fitted operation structure is essential for the driver to decide on the operation.

Sorry I do not understand why you must have a "generic operation".
Please, could you try again to explain this design to someone
not fully understanding how turbo enc/dec works?

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v3 0/9] Policy Based Power Control for Guest
  @ 2017-10-03 14:08  3% ` David Hunt
  2017-10-11 16:18  2% ` [dpdk-dev] [PATCH v9 " David Hunt
  1 sibling, 0 replies; 200+ results
From: David Hunt @ 2017-10-03 14:08 UTC (permalink / raw)
  To: dev; +Cc: konstantin.ananyev, jingjing.wu

Policy Based Power Control for Guest

This patchset adds the facility for a guest VM to send a policy down to the
host that will allow the host to scale up/down cpu frequencies
depending on the policy criteria independently of the DPDK app running in
the guest.  This differs from the previous vm_power implementation where
individual scale up/down requests were send from the guest to the host via
virtio-serial.

V3 patchset changes:
  * Changed to using is_same_ether_addr() instead of looping through
    the mac address bytes to compare them.
  * Tweaked some comments and working in the i40e patch after review.
  * Added a patch to the set to add new i40e function to map file, so
    as to allow shared library builds. The power library API needs a cleanup
    in next release, so will add API/ABI warning for this cleanup in a
    separate patch.

V2 patchset changes:
  * Removed API's in ethdev layer.
  * Now just a single new API in the i40e driver for mapping VF MAC to
    VF index.
  * Moved new function from rte_rxtx.c to rte_pmd_i40e.c
  * Removed function for reading i40e register, moved to using the
    standard stats API.
  * Renamed i40e function to rte_pmd_i40e_query_vfid_by_mac
  * Cleaned up policy generation code.

It's a modification of the vm_power_manager app that runs in the host, and
the guest_vm_power_app example app that runs in the guest. This allows the
guest to send down a policy to the host via virtio-serial, which then allows
the host to scale up/down based on the criteria in the policy, resulting in
quicker scale up/down than individual requests coming from the guest.
It also means that the DPDK application running in the guest does not need
to be modified in any way, it is unaware that it's cores are being scaled
up/down, reducing the effort in implementing a power-aware infrastructure.

The usage model is as follows:
1. Set up the VF's and assign to the guest in the usual way.
2. run vm_power_manager on the host, creating a channel to the guest.
3. Start the guest_vm_power_mgr app on the guest, which establishes
   a virtio-serial channel to the host.
4. Send down the profile for the guest using the "send_profile now" command.
   There is an example profile hard-coded into guest_vm_power_mgr.
5. Stop the guest_vm_power_mgr and run your normal power-unaware application.
6. Send traffic into the VFs at varying traffic rates.
   Observe the frequency change on the host (turbostat -i 1)

The sequence of code changes are as follows:

A new function has been aded to the i40e driver to allow mapping of
a VF MAC to VF index.

Next we make an addition to librte_power that adds an extra command to allow
the passing of a policy structure from the guest to the host. This struct
contains information like busy/quiet hour, packet throughput thresholds, etc.

The next addition adds functionality to convert the virtual CPU (vcpu) IDs to
physical CPU (pcpu) IDs so that the host can scale up/down the cores used
in the guest.

The remaining patches are functionality to process the policy, and take action
when the relevant trigger occurs to cause a frequency change.

[1/9] net/i40e: add API to convert VF MAC to VF id
[2/9] lib/librte_power: add extra msg type for policies
[3/9] examples/vm_power_mgr: add vcpu to pcpu mapping
[4/9] examples/vm_power_mgr: add scale to medium freq fn
[5/9] examples/vm_power_mgr: add policy to channels
[6/9] examples/vm_power_mgr: add port initialisation
[7/9] power: add send channel msg function to map file
[8/9] examples/guest_cli: add send policy to host
[9/9] examples/vm_power_mgr: set MAC address of VF

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
  2017-09-21 14:56  3% ` Thomas Monjalon
@ 2017-10-03 14:29  0%   ` Mokhtar, Amr
  2017-10-03 15:17  4%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Mokhtar, Amr @ 2017-10-03 14:29 UTC (permalink / raw)
  To: thomas; +Cc: dev

Hi Thomas,
Thanks for reviewing.. Kindly find my reply in-line below..

> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Thursday 21 September 2017 15:56
> To: Mokhtar, Amr <amr.mokhtar@intel.com>
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
> 
> 25/08/2017 15:46, Amr Mokhtar:
> > +/**
> > + * Configure a device.
> > + * This function must be called on a device before setting up the
> > +queues and
> > + * starting the device. It can also be called when a device is in the
> > +stopped
> > + * state. If any device queues have been configured their
> > +configuration will be
> > + * cleared by a call to this function.
> > + *
> > + * @param dev_id
> > + *   The identifier of the device.
> > + * @param num_queues
> > + *   Number of queues to configure on device.
> > + * @param conf
> > + *   The device configuration. If NULL, a default configuration will be used.
> > + *
> > + * @return
> > + *   - 0 on success
> > + *   - EINVAL if num_queues is invalid, 0 or greater than maximum
> > + *   - EBUSY if the identified device has already started
> > + *   - ENOMEM if unable to allocate memory
> > + */
> > +int
> > +rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues,
> > +		const struct rte_bbdev_conf *conf);
> 
> I am not convinced by the "configure all" function in ethdev.
> We break the ABI each time we add a new feature to configure.
> And it does not really help to have all configurations in one struct.
> Would you mind to split the struct rte_bbdev_conf and split the function
> accordingly?

There is nothing to split tbh. The only parameter it has is the socket_id.
And in fact, it's optional, can be null. The only config we need is num_queues.
I don't see in the near future that we may need to add more config params.
As a side, in the time of the implementation we were trying to avoid any
diversions from the current design ideology of ethdev and cryptodev.
Can we leave it for consideration with future releases?

> 
> [...]
> > +struct rte_bbdev_info {
> > +	int socket_id;  /**< NUMA socket that device is on */
> > +	const char *dev_name;  /**< Unique device name */
> > +	const struct rte_pci_device *pci_dev;  /**< PCI information */
> > +	unsigned int num_queues;  /**< Number of queues currently configured
> */
> > +	struct rte_bbdev_conf conf;  /**< Current device configuration */
> > +	bool started;  /**< Set if device is currently started */
> > +	struct rte_bbdev_driver_info drv;  /**< Info from device driver */
> > +};
> 
> As Stephen said, PCI must not appear in this API.
> Please use the bus abstraction.

Done.

> 
> [...]
> > +struct __rte_cache_aligned rte_bbdev {
> > +	rte_bbdev_enqueue_ops_t enqueue_ops; /**< Enqueue function */
> > +	rte_bbdev_dequeue_ops_t dequeue_ops;  /**< Dequeue function */
> > +	const struct rte_bbdev_ops *dev_ops;  /**< Functions exported by PMD
> */
> > +	struct rte_bbdev_data *data;  /**< Pointer to device data */
> > +	bool attached;  /**< If device is currently attached or not */
> 
> What "attached" means?
> I'm afraid you are trying to manage hotplug in the wrong layer.

Hotplug is not supported in the current release.

> 
> > +	struct rte_device *device; /**< Backing device (HW only) */
> 
> SW port should have also a rte_device (vdev).

Right. Fixed the comment.

> 
> [...]
> > +/** Data input and output buffer for Turbo operations */ struct
> > +rte_bbdev_op_data {
> 
> Why there is no "turbo" word in the name of this struct?

To keep it a generic input/output data descriptor,
that suits any type of baseband operation not only for turbo.

> 
> > +	struct rte_mbuf *data;
> > +	/**< First mbuf segment with input/output data. */
> > +	uint32_t offset;
> > +	/**< The starting point for the Turbo input/output, in bytes, from the
> > +	 * start of the data in the data buffer. It must be smaller than
> > +	 * data_len of the mbuf's first segment!
> > +	 */
> > +	uint32_t length;
> > +	/**< For input operations: the length, in bytes, of the source buffer
> > +	 * on which the Turbo encode/decode will be computed.
> > +	 * For output operations: the length, in bytes, of the output buffer
> > +	 * of the Turbo operation.
> > +	 */
> > +};
> 
> [...]
> > +/** Structure specifying a single operation */ struct rte_bbdev_op {
> > +	enum rte_bbdev_op_type type;  /**< Type of this operation */
> > +	int status;  /**< Status of operation that was performed */
> > +	struct rte_mempool *mempool;  /**< Mempool which op instance is in
> */
> > +	void *opaque_data;  /**< Opaque pointer for user data */
> > +	/**
> > +	 * Anonymous union of operation-type specific parameters. When
> allocated
> > +	 * using rte_bbdev_op_pool_create(), space is allocated for the
> > +	 * parameters at the end of each rte_bbdev_op structure, and the
> > +	 * pointers here point to it.
> > +	 */
> > +	RTE_STD_C11
> > +	union {
> > +		void *generic;
> > +		struct rte_bbdev_op_turbo_dec *turbo_dec;
> > +		struct rte_bbdev_op_turbo_enc *turbo_enc;
> > +	};
> > +};
> 
> I am not sure it is a good idea to fit every operations in the same struct and the
> same functions.

Due to the fact that our design adopts this idea that a device can support both
the encode and decode operations.
Then, at the time of PMD registration, the enqueue functions is allocated.
This enqueue() function is common for both operations.
This fitted operation structure is essential for the driver to decide on the operation.

> 
> [...]
> > +/**
> > + * Helper macro for logging
> > + *
> > + * @param level
> > + *   Log level: EMERG, ALERT, CRIT, ERR, WARNING, NOTICE, INFO, or
> DEBUG
> > + * @param fmt
> > + *   The format string, as in printf(3).
> > + * @param ...
> > + *   The variable arguments required by the format string.
> > + *
> > + * @return
> > + *   - 0 on success
> > + *   - Negative on error
> > + */
> > +#define rte_bbdev_log(level, fmt, ...) \
> > +		RTE_LOG(level, BBDEV, fmt "\n", ##__VA_ARGS__)
> 
> This is the legacy log system.
> Please use dynamic log type.

Done.

> 
> [...]
> > +#ifdef RTE_LIBRTE_BBDEV_DEBUG
> > +#define rte_bbdev_log_verbose(fmt, ...)  rte_bbdev_log_debug(fmt,
> > +##__VA_ARGS__) #else #define rte_bbdev_log_verbose(fmt, ...) #endif
> 
> With the new log functions, you do not need to disable debug log at compilation
> time.

Right.

> 
> > +/**
> > + *  Initialisation params structure that can be used by software
> > +based drivers  */ struct rte_bbdev_init_params {
> > +	int socket_id;  /**< Base band null device socket */
> > +	uint16_t queues_num;  /**< Base band null device queues number */ };
> > +
> > +/**
> > + * Parse generic parameters that could be used for software based devices.
> > + *
> > + * @param params
> > + *   Pointer to structure that will hold the parsed parameters.
> > + * @param input_args
> > + *   Pointer to arguments to be parsed.
> > + *
> > + * @return
> > + *   - 0 on success
> > + *   - EINVAL if invalid parameter pointer is provided
> > + *   - EFAULT if unable to parse provided arguments
> > + */
> > +int
> > +rte_bbdev_parse_params(struct rte_bbdev_init_params *params,
> > +		const char *input_args);
> 
> I do not understand the intent of these parameters.
> Are they common to every PMDs?
> Or could they be moved in software PMDs?

That was an old design approach, but this now moved and became the
responsibility of the soft PMD.

> 
> End of this first review pass :)

Thanks!!

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] lib/power: add turbo functions to version.map
  2017-10-02 16:25  3%       ` Hunt, David
@ 2017-10-02 16:52  0%         ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2017-10-02 16:52 UTC (permalink / raw)
  To: Hunt, David; +Cc: dev

02/10/2017 18:25, Hunt, David:
> Hi Thomas,
> 
> 
> On 2/10/2017 4:39 PM, Thomas Monjalon wrote:
> > 02/10/2017 17:06, Hunt, David:
> >> On 2/10/2017 3:55 PM, Thomas Monjalon wrote:
> >>> +DPDK_17.11 {
> >>>> +	global:
> >>>> +
> >>>> +	rte_power_acpi_turbo_status;
> >>> Is it really the function you want to expose?
> >>> rte_power_turbo_status seems more generic.
> >> Not really, it was in there for completeness, but users should be able
> >> to keep track of the turbo'd cores, so not really needed.
> >>
> >>> More comments about what is part of the API:
> >>> If you do not want to expose ACPI and VM implementations,
> >>> it should not be part of the rte_* include files.
> >> I'll address the above comments in the next version.
> > 
> > You did not address the comment about what is rte_*.h.
> > If you do not want to expose everything, you should move it to
> > another .h file.
> >
> > Files starting with rte_ are included in doxygen API doc.
> > Only rte_power.h is installed.
> > The installed include, the doxygen doc and the map file
> > should all expose the same API consistently.
> >
> > I think a cleanup is needed.
> 
> While I agree a cleanup is needed, this small patch is only intended to 
> fix the priority issue of the shared library builds, which are broken at 
> the moment.
> The initial patch should have had rte_power_turbo_status, not 
> rte_power_acpi_turbo_status.
> Rather than moving code around at this stage, I propose having the three 
> exposed functions in the map file (with the correct names).

OK, so we need a v3 (v2 has only 2 functions).

> Then, later on, I can do an ABI breakage notification for the next 
> release to rename all the other rte*.h files, as some consumers of DPDK 
> may be using those directly, at which stage we will be down to just 
> exporting the functions in rte_power.h.
> Does that sound OK with you?

OK, thanks

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] lib/power: add turbo functions to version.map
  @ 2017-10-02 16:25  3%       ` Hunt, David
  2017-10-02 16:52  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Hunt, David @ 2017-10-02 16:25 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

Hi Thomas,


On 2/10/2017 4:39 PM, Thomas Monjalon wrote:
> 02/10/2017 17:06, Hunt, David:
>> On 2/10/2017 3:55 PM, Thomas Monjalon wrote:
>>> +DPDK_17.11 {
>>>> +	global:
>>>> +
>>>> +	rte_power_acpi_turbo_status;
>>> Is it really the function you want to expose?
>>> rte_power_turbo_status seems more generic.
>> Not really, it was in there for completeness, but users should be able
>> to keep track of the turbo'd cores, so not really needed.
>>
>>> More comments about what is part of the API:
>>> If you do not want to expose ACPI and VM implementations,
>>> it should not be part of the rte_* include files.
>> I'll address the above comments in the next version.
> You did not address the comment about what is rte_*.h.
> If you do not want to expose everything, you should move it to
> another .h file.
>
> Files starting with rte_ are included in doxygen API doc.
> Only rte_power.h is installed.
> The installed include, the doxygen doc and the map file
> should all expose the same API consistently.
>
> I think a cleanup is needed.

While I agree a cleanup is needed, this small patch is only intended to 
fix the priority issue of the shared library builds, which are broken at 
the moment.
The initial patch should have had rte_power_turbo_status, not 
rte_power_acpi_turbo_status.
Rather than moving code around at this stage, I propose having the three 
exposed functions in the map file (with the correct names).
Then, later on, I can do an ABI breakage notification for the next 
release to rename all the other rte*.h files, as some consumers of DPDK 
may be using those directly, at which stage we will be down to just 
exporting the functions in rte_power.h.
Does that sound OK with you?
Regards,
Dave.

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v4 2/5] net/i40e: implement dynamic mapping of sw flow types to hw pctypes
  @ 2017-10-02 15:08  3%     ` Kirill Rybalchenko
    1 sibling, 0 replies; 200+ results
From: Kirill Rybalchenko @ 2017-10-02 15:08 UTC (permalink / raw)
  To: dev; +Cc: kirill.rybalchenko, andrey.chilikin, beilei.xing, jingjing.wu

Implement dynamic mapping of software flow types to hardware pctypes.
This allows to add new flow types and pctypes for DDP without changing
API of the driver. The mapping table is located in private
data area for particular network adapter and can be individually
modified with set of appropriate functions.

v2:
Re-arrange patchset to avoid compillation errors.
Remove usage of statically defined flow types and pctypes.

v3:
Change prototypes of some static functions.
Fixe bugs in i40e_pctype_to_flowtype and i40e_flowtype_to_pctype
functions.
Various small modifications after reviewing.

v4:
Change prototypes of some static functions.
Move declaration of automatic variables to beginning of function.
Move declaration of I40E_FILTER_PCTYPE_INVALID to i40e_ethdev.h

Signed-off-by: Kirill Rybalchenko <kirill.rybalchenko@intel.com>
---
 drivers/net/i40e/i40e_ethdev.c    | 344 ++++++++++++--------------------------
 drivers/net/i40e/i40e_ethdev.h    |  22 ++-
 drivers/net/i40e/i40e_ethdev_vf.c |  16 +-
 drivers/net/i40e/i40e_fdir.c      |  54 +++---
 drivers/net/i40e/i40e_flow.c      |   5 +-
 drivers/net/i40e/i40e_rxtx.c      |  57 +++++++
 drivers/net/i40e/i40e_rxtx.h      |   1 +
 7 files changed, 212 insertions(+), 287 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 41c4033..6443702 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -1070,6 +1070,7 @@ eth_i40e_dev_init(struct rte_eth_dev *dev)
 		return 0;
 	}
 	i40e_set_default_ptype_table(dev);
+	i40e_set_default_pctype_table(dev);
 	pci_dev = RTE_ETH_DEV_TO_PCI(dev);
 	intr_handle = &pci_dev->intr_handle;
 
@@ -3020,7 +3021,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
 						sizeof(uint32_t);
 	dev_info->reta_size = pf->hash_lut_size;
-	dev_info->flow_type_rss_offloads = I40E_RSS_OFFLOAD_ALL;
+	dev_info->flow_type_rss_offloads = pf->adapter->flow_types_mask;
 
 	dev_info->default_rxconf = (struct rte_eth_rxconf) {
 		.rx_thresh = {
@@ -6611,104 +6612,36 @@ i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct ether_addr *addr)
 
 /* Configure hash enable flags for RSS */
 uint64_t
-i40e_config_hena(uint64_t flags, enum i40e_mac_type type)
+i40e_config_hena(const struct i40e_adapter *adapter, uint64_t flags)
 {
 	uint64_t hena = 0;
+	int i;
 
 	if (!flags)
 		return hena;
 
-	if (flags & ETH_RSS_FRAG_IPV4)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4;
-	if (flags & ETH_RSS_NONFRAG_IPV4_TCP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV4_UDP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV4_SCTP)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP;
-	if (flags & ETH_RSS_NONFRAG_IPV4_OTHER)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER;
-	if (flags & ETH_RSS_FRAG_IPV6)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6;
-	if (flags & ETH_RSS_NONFRAG_IPV6_TCP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP;
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (flags & (1ULL << i))
+			hena |= adapter->pctypes_tbl[i];
 	}
-	if (flags & ETH_RSS_NONFRAG_IPV6_UDP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV6_SCTP)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP;
-	if (flags & ETH_RSS_NONFRAG_IPV6_OTHER)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER;
-	if (flags & ETH_RSS_L2_PAYLOAD)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD;
 
 	return hena;
 }
 
 /* Parse the hash enable flags */
 uint64_t
-i40e_parse_hena(uint64_t flags)
+i40e_parse_hena(const struct i40e_adapter *adapter, uint64_t flags)
 {
 	uint64_t rss_hf = 0;
 
 	if (!flags)
 		return rss_hf;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4))
-		rss_hf |= ETH_RSS_FRAG_IPV4;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_SCTP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_OTHER;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6))
-		rss_hf |= ETH_RSS_FRAG_IPV6;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_SCTP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_OTHER;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD))
-		rss_hf |= ETH_RSS_L2_PAYLOAD;
+	int i;
 
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (flags & adapter->pctypes_tbl[i])
+			rss_hf |= (1ULL << i);
+	}
 	return rss_hf;
 }
 
@@ -6799,7 +6732,7 @@ i40e_hw_rss_hash_set(struct i40e_pf *pf, struct rte_eth_rss_conf *rss_conf)
 	if (ret)
 		return ret;
 
-	hena = i40e_config_hena(rss_conf->rss_hf, hw->mac.type);
+	hena = i40e_config_hena(pf->adapter, rss_conf->rss_hf);
 	i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), (uint32_t)hena);
 	i40e_write_rx_ctl(hw, I40E_PFQF_HENA(1), (uint32_t)(hena >> 32));
 	I40E_WRITE_FLUSH(hw);
@@ -6813,14 +6746,13 @@ i40e_dev_rss_hash_update(struct rte_eth_dev *dev,
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	uint64_t rss_hf = rss_conf->rss_hf & I40E_RSS_OFFLOAD_ALL;
+	uint64_t rss_hf = rss_conf->rss_hf & pf->adapter->flow_types_mask;
 	uint64_t hena;
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1))) << 32;
-	if (!(hena & ((hw->mac.type == I40E_MAC_X722)
-		 ? I40E_RSS_HENA_ALL_X722
-		 : I40E_RSS_HENA_ALL))) { /* RSS disabled */
+
+	if (!(hena & pf->adapter->pctypes_mask)) { /* RSS disabled */
 		if (rss_hf != 0) /* Enable RSS */
 			return -EINVAL;
 		return 0; /* Nothing to do */
@@ -6845,7 +6777,7 @@ i40e_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1))) << 32;
-	rss_conf->rss_hf = i40e_parse_hena(hena);
+	rss_conf->rss_hf = i40e_parse_hena(pf->adapter, hena);
 
 	return 0;
 }
@@ -7620,7 +7552,7 @@ i40e_pf_config_rss(struct i40e_pf *pf)
 	}
 
 	rss_conf = pf->dev_data->dev_conf.rx_adv_conf.rss_conf;
-	if ((rss_conf.rss_hf & I40E_RSS_OFFLOAD_ALL) == 0) {
+	if ((rss_conf.rss_hf & pf->adapter->flow_types_mask) == 0) {
 		i40e_pf_disable_rss(pf);
 		return 0;
 	}
@@ -7841,9 +7773,9 @@ static int
 i40e_get_hash_filter_global_config(struct i40e_hw *hw,
 				   struct rte_eth_hash_global_conf *g_cfg)
 {
-	uint32_t reg, mask = I40E_FLOW_TYPES;
-	uint16_t i;
-	enum i40e_filter_pctype pctype;
+	struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back;
+	uint32_t reg;
+	uint16_t i, j;
 
 	memset(g_cfg, 0, sizeof(*g_cfg));
 	reg = i40e_read_rx_ctl(hw, I40E_GLQF_CTL);
@@ -7854,29 +7786,37 @@ i40e_get_hash_filter_global_config(struct i40e_hw *hw,
 	PMD_DRV_LOG(DEBUG, "Hash function is %s",
 		(reg & I40E_GLQF_CTL_HTOEP_MASK) ? "Toeplitz" : "Simple XOR");
 
-	for (i = 0; mask && i < RTE_ETH_FLOW_MAX; i++) {
-		if (!(mask & (1UL << i)))
-			continue;
-		mask &= ~(1UL << i);
-		/* Bit set indicats the coresponding flow type is supported */
-		g_cfg->valid_bit_mask[0] |= (1UL << i);
-		/* if flowtype is invalid, continue */
-		if (!I40E_VALID_FLOW(i))
-			continue;
-		pctype = i40e_flowtype_to_pctype(i);
-		reg = i40e_read_rx_ctl(hw, I40E_GLQF_HSYM(pctype));
-		if (reg & I40E_GLQF_HSYM_SYMH_ENA_MASK)
-			g_cfg->sym_hash_enable_mask[0] |= (1UL << i);
+	/*
+	 * We work only with lowest 32 bits which is not correct, but to work
+	 * properly the valid_bit_mask size should be increased up to 64 bits
+	 * and this will brake ABI. This modification will be done in next release
+	 */
+	g_cfg->valid_bit_mask[0] = (uint32_t)adapter->flow_types_mask;
+
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < UINT32_BIT; i++) {
+		if (adapter->pctypes_tbl[i]) {
+			for (j = I40E_FILTER_PCTYPE_INVALID + 1;
+			     j < I40E_FILTER_PCTYPE_MAX; j++) {
+				if (adapter->pctypes_tbl[i] & (1ULL << j)) {
+					reg = i40e_read_rx_ctl(hw, I40E_GLQF_HSYM(j));
+					if (reg & I40E_GLQF_HSYM_SYMH_ENA_MASK) {
+						g_cfg->sym_hash_enable_mask[0] |=
+									(1UL << i);
+					}
+				}
+			}
+		}
 	}
 
 	return 0;
 }
 
 static int
-i40e_hash_global_config_check(struct rte_eth_hash_global_conf *g_cfg)
+i40e_hash_global_config_check(const struct i40e_adapter *adapter,
+			      const struct rte_eth_hash_global_conf *g_cfg)
 {
 	uint32_t i;
-	uint32_t mask0, i40e_mask = I40E_FLOW_TYPES;
+	uint32_t mask0, i40e_mask = adapter->flow_types_mask;
 
 	if (g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_TOEPLITZ &&
 		g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_SIMPLE_XOR &&
@@ -7919,64 +7859,32 @@ static int
 i40e_set_hash_filter_global_config(struct i40e_hw *hw,
 				   struct rte_eth_hash_global_conf *g_cfg)
 {
+	struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back;
 	int ret;
-	uint16_t i;
+	uint16_t i, j;
 	uint32_t reg;
-	uint32_t mask0 = g_cfg->valid_bit_mask[0];
-	enum i40e_filter_pctype pctype;
+	/*
+	 * We work only with lowest 32 bits which is not correct, but to work
+	 * properly the valid_bit_mask size should be increased up to 64 bits
+	 * and this will brake ABI. This modification will be done in next release
+	 */
+	uint32_t mask0 = g_cfg->valid_bit_mask[0] & (uint32_t)adapter->flow_types_mask;
 
 	/* Check the input parameters */
-	ret = i40e_hash_global_config_check(g_cfg);
+	ret = i40e_hash_global_config_check(adapter, g_cfg);
 	if (ret < 0)
 		return ret;
 
-	for (i = 0; mask0 && i < UINT32_BIT; i++) {
-		if (!(mask0 & (1UL << i)))
-			continue;
-		mask0 &= ~(1UL << i);
-		/* if flowtype is invalid, continue */
-		if (!I40E_VALID_FLOW(i))
-			continue;
-		pctype = i40e_flowtype_to_pctype(i);
-		reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
-				I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_UDP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP),
-				  reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_TCP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_TCP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_UDP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP),
-				  reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_TCP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK),
-				  reg);
-			} else {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype),
-				  reg);
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; mask0 && i < UINT32_BIT; i++) {
+		if (mask0 & (1UL << i)) {
+			reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
+					I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
+
+			for (j = I40E_FILTER_PCTYPE_INVALID + 1;
+			     j < I40E_FILTER_PCTYPE_MAX; j++) {
+				if (adapter->pctypes_tbl[i] & (1ULL << j))
+					i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(j), reg);
 			}
-		} else {
-			i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype), reg);
 		}
 	}
 
@@ -8598,16 +8506,14 @@ i40e_filter_input_set_init(struct i40e_pf *pf)
 	uint64_t input_set, inset_reg;
 	uint32_t mask_reg[I40E_INSET_MASK_NUM_REG] = {0};
 	int num, i;
+	uint16_t flow_type;
 
 	for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
 	     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) {
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722(pctype))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE(pctype))
-				continue;
-		}
+		flow_type = i40e_pctype_to_flowtype(pf->adapter, pctype);
+
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
 
 		input_set = i40e_get_default_input_set(pctype);
 
@@ -8670,7 +8576,8 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 		return -EINVAL;
 	}
 
-	if (!I40E_VALID_FLOW(conf->flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, conf->flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
@@ -8678,10 +8585,8 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 	if (hw->mac.type == I40E_MAC_X722) {
 		/* get translated pctype value in fd pctype register */
 		pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(hw,
-			I40E_GLQF_FD_PCTYPES((int)i40e_flowtype_to_pctype(
-			conf->flow_type)));
-	} else
-		pctype = i40e_flowtype_to_pctype(conf->flow_type);
+			I40E_GLQF_FD_PCTYPES((int)pctype));
+	}
 
 	ret = i40e_parse_input_set(&input_set, pctype, conf->field,
 				   conf->inset_size);
@@ -8689,11 +8594,7 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 		PMD_DRV_LOG(ERR, "Failed to parse input set");
 		return -EINVAL;
 	}
-	if (i40e_validate_input_set(pctype, RTE_ETH_FILTER_HASH,
-				    input_set) != 0) {
-		PMD_DRV_LOG(ERR, "Invalid input set");
-		return -EINVAL;
-	}
+
 	if (conf->op == RTE_ETH_INPUT_SET_ADD) {
 		/* get inset value in register */
 		inset_reg = i40e_read_rx_ctl(hw, I40E_GLQF_HASH_INSET(1, pctype));
@@ -8747,24 +8648,19 @@ i40e_fdir_filter_inset_select(struct i40e_pf *pf,
 		return -EINVAL;
 	}
 
-	if (!I40E_VALID_FLOW(conf->flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, conf->flow_type);
+
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
 
-	pctype = i40e_flowtype_to_pctype(conf->flow_type);
-
 	ret = i40e_parse_input_set(&input_set, pctype, conf->field,
 				   conf->inset_size);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "Failed to parse input set");
 		return -EINVAL;
 	}
-	if (i40e_validate_input_set(pctype, RTE_ETH_FILTER_FDIR,
-				    input_set) != 0) {
-		PMD_DRV_LOG(ERR, "Invalid input set");
-		return -EINVAL;
-	}
 
 	/* get inset value in register */
 	inset_reg = i40e_read_rx_ctl(hw, I40E_PRTQF_FD_INSET(pctype, 1));
@@ -9203,72 +9099,42 @@ i40e_hw_init(struct rte_eth_dev *dev)
 	i40e_set_symmetric_hash_enable_per_port(hw, 0);
 }
 
+/*
+ * For X722 it is possible to have multiple pctypes mapped to the same flowtype
+ * however this function will return only one highest pctype index,
+ * which is not quite correct. This is known problem of i40e driver
+ * and needs to be fixed later.
+ */
 enum i40e_filter_pctype
-i40e_flowtype_to_pctype(uint16_t flow_type)
-{
-	static const enum i40e_filter_pctype pctype_table[] = {
-		[RTE_ETH_FLOW_FRAG_IPV4] = I40E_FILTER_PCTYPE_FRAG_IPV4,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_UDP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_TCP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_SCTP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_SCTP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_OTHER] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_OTHER,
-		[RTE_ETH_FLOW_FRAG_IPV6] = I40E_FILTER_PCTYPE_FRAG_IPV6,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_UDP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_TCP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_SCTP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_SCTP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_OTHER] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_OTHER,
-		[RTE_ETH_FLOW_L2_PAYLOAD] = I40E_FILTER_PCTYPE_L2_PAYLOAD,
-	};
+i40e_flowtype_to_pctype(const struct i40e_adapter *adapter, uint16_t flow_type)
+{
+	int i;
+	uint64_t pctype_mask;
 
-	return pctype_table[flow_type];
+	if (flow_type < I40E_FLOW_TYPE_MAX) {
+		pctype_mask = adapter->pctypes_tbl[flow_type];
+		for (i = I40E_FILTER_PCTYPE_MAX - 1; i > 0; i--) {
+			if (pctype_mask & (1ULL << i))
+				return (enum i40e_filter_pctype)i;
+		}
+	}
+	return I40E_FILTER_PCTYPE_INVALID;
 }
 
 uint16_t
-i40e_pctype_to_flowtype(enum i40e_filter_pctype pctype)
+i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
+			enum i40e_filter_pctype pctype)
 {
-	static const uint16_t flowtype_table[] = {
-		[I40E_FILTER_PCTYPE_FRAG_IPV4] = RTE_ETH_FLOW_FRAG_IPV4,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_TCP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_SCTP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_SCTP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_OTHER] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_OTHER,
-		[I40E_FILTER_PCTYPE_FRAG_IPV6] = RTE_ETH_FLOW_FRAG_IPV6,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_TCP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_SCTP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_SCTP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_OTHER] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_OTHER,
-		[I40E_FILTER_PCTYPE_L2_PAYLOAD] = RTE_ETH_FLOW_L2_PAYLOAD,
-	};
+	uint16_t flowtype;
+	uint64_t pctype_mask = 1ULL << pctype;
+
+	for (flowtype = RTE_ETH_FLOW_UNKNOWN + 1; flowtype < I40E_FLOW_TYPE_MAX;
+	     flowtype++) {
+		if (adapter->pctypes_tbl[flowtype] & pctype_mask)
+			return flowtype;
+	}
 
-	return flowtype_table[pctype];
+	return RTE_ETH_FLOW_UNKNOWN;
 }
 
 /*
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index ad80f0f..66cc053 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -478,8 +478,9 @@ struct i40e_fdir_flex_mask {
 	} bitmask[I40E_FDIR_BITMASK_NUM_WORD];
 };
 
-#define I40E_FILTER_PCTYPE_MAX 64
-#define I40E_MAX_FDIR_FILTER_NUM (1024 * 8)
+#define I40E_FILTER_PCTYPE_INVALID 0
+#define I40E_FILTER_PCTYPE_MAX     64
+#define I40E_MAX_FDIR_FILTER_NUM   (1024 * 8)
 
 struct i40e_fdir_filter {
 	TAILQ_ENTRY(i40e_fdir_filter) rules;
@@ -852,7 +853,8 @@ struct i40e_vf {
 	uint64_t flags;
 };
 
-#define I40E_MAX_PKT_TYPE 256
+#define I40E_MAX_PKT_TYPE  256
+#define I40E_FLOW_TYPE_MAX 64
 
 /*
  * Structure to store private data for each PF/VF instance.
@@ -881,6 +883,10 @@ struct i40e_adapter {
 
 	/* ptype mapping table */
 	uint32_t ptype_tbl[I40E_MAX_PKT_TYPE] __rte_cache_min_aligned;
+	/* flow type to pctype mapping table */
+	uint64_t pctypes_tbl[I40E_FLOW_TYPE_MAX] __rte_cache_min_aligned;
+	uint64_t flow_types_mask;
+	uint64_t pctypes_mask;
 };
 
 extern const struct rte_flow_ops i40e_flow_ops;
@@ -925,8 +931,8 @@ int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi,
 			   struct i40e_vsi_vlan_pvid_info *info);
 int i40e_vsi_config_vlan_stripping(struct i40e_vsi *vsi, bool on);
 int i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on);
-uint64_t i40e_config_hena(uint64_t flags, enum i40e_mac_type type);
-uint64_t i40e_parse_hena(uint64_t flags);
+uint64_t i40e_config_hena(const struct i40e_adapter *adapter, uint64_t flags);
+uint64_t i40e_parse_hena(const struct i40e_adapter *adapter, uint64_t flags);
 enum i40e_status_code i40e_fdir_setup_tx_resources(struct i40e_pf *pf);
 enum i40e_status_code i40e_fdir_setup_rx_resources(struct i40e_pf *pf);
 int i40e_fdir_setup(struct i40e_pf *pf);
@@ -935,8 +941,10 @@ const struct rte_memzone *i40e_memzone_reserve(const char *name,
 					int socket_id);
 int i40e_fdir_configure(struct rte_eth_dev *dev);
 void i40e_fdir_teardown(struct i40e_pf *pf);
-enum i40e_filter_pctype i40e_flowtype_to_pctype(uint16_t flow_type);
-uint16_t i40e_pctype_to_flowtype(enum i40e_filter_pctype pctype);
+enum i40e_filter_pctype  i40e_flowtype_to_pctype(const struct i40e_adapter *adapter,
+						 uint16_t flow_type);
+uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
+				 enum i40e_filter_pctype pctype);
 int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
 			  enum rte_filter_op filter_op,
 			  void *arg);
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index a903deb..111ac39 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -1443,6 +1443,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
 		return 0;
 	}
 	i40e_set_default_ptype_table(eth_dev);
+	i40e_set_default_pctype_table(eth_dev);
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 	eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
 
@@ -2178,7 +2179,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
 	dev_info->hash_key_size = (I40E_VFQF_HKEY_MAX_INDEX + 1) * sizeof(uint32_t);
 	dev_info->reta_size = ETH_RSS_RETA_SIZE_64;
-	dev_info->flow_type_rss_offloads = I40E_RSS_OFFLOAD_ALL;
+	dev_info->flow_type_rss_offloads = vf->adapter->flow_types_mask;
 	dev_info->max_mac_addrs = I40E_NUM_MACADDR_MAX;
 	dev_info->rx_offload_capa =
 		DEV_RX_OFFLOAD_VLAN_STRIP |
@@ -2506,7 +2507,7 @@ i40evf_hw_rss_hash_set(struct i40e_vf *vf, struct rte_eth_rss_conf *rss_conf)
 	if (ret)
 		return ret;
 
-	hena = i40e_config_hena(rss_conf->rss_hf, hw->mac.type);
+	hena = i40e_config_hena(vf->adapter, rss_conf->rss_hf);
 	i40e_write_rx_ctl(hw, I40E_VFQF_HENA(0), (uint32_t)hena);
 	i40e_write_rx_ctl(hw, I40E_VFQF_HENA(1), (uint32_t)(hena >> 32));
 	I40EVF_WRITE_FLUSH(hw);
@@ -2549,7 +2550,7 @@ i40evf_config_rss(struct i40e_vf *vf)
 	}
 
 	rss_conf = vf->dev_data->dev_conf.rx_adv_conf.rss_conf;
-	if ((rss_conf.rss_hf & I40E_RSS_OFFLOAD_ALL) == 0) {
+	if ((rss_conf.rss_hf & vf->adapter->flow_types_mask) == 0) {
 		i40evf_disable_rss(vf);
 		PMD_DRV_LOG(DEBUG, "No hash flag is set");
 		return 0;
@@ -2574,14 +2575,13 @@ i40evf_dev_rss_hash_update(struct rte_eth_dev *dev,
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	uint64_t rss_hf = rss_conf->rss_hf & I40E_RSS_OFFLOAD_ALL;
+	uint64_t rss_hf = rss_conf->rss_hf & vf->adapter->flow_types_mask;
 	uint64_t hena;
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(1))) << 32;
-	if (!(hena & ((hw->mac.type == I40E_MAC_X722)
-		 ? I40E_RSS_HENA_ALL_X722
-		 : I40E_RSS_HENA_ALL))) { /* RSS disabled */
+
+	if (!(hena & vf->adapter->pctypes_mask)) { /* RSS disabled */
 		if (rss_hf != 0) /* Enable RSS */
 			return -EINVAL;
 		return 0;
@@ -2607,7 +2607,7 @@ i40evf_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(1))) << 32;
-	rss_conf->rss_hf = i40e_parse_hena(hena);
+	rss_conf->rss_hf = i40e_parse_hena(vf->adapter, hena);
 
 	return 0;
 }
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index 84c0a1f..def2e4c 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -323,6 +323,7 @@ i40e_init_flx_pld(struct i40e_pf *pf)
 	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
 	uint8_t pctype;
 	int i, index;
+	uint16_t flow_type;
 
 	/*
 	 * Define the bytes stream extracted as flexible payload in
@@ -344,15 +345,10 @@ i40e_init_flx_pld(struct i40e_pf *pf)
 	/* initialize the masks */
 	for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
 	     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) {
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722(
-				 (enum i40e_filter_pctype)pctype))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE(
-				 (enum i40e_filter_pctype)pctype))
-				continue;
-		}
+		flow_type = i40e_pctype_to_flowtype(pf->adapter, pctype);
+
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
 		pf->fdir.flex_mask[pctype].word_mask = 0;
 		i40e_write_rx_ctl(hw, I40E_PRTQF_FD_FLXINSET(pctype), 0);
 		for (i = 0; i < I40E_FDIR_BITMASK_NUM_WORD; i++) {
@@ -449,7 +445,8 @@ i40e_check_fdir_flex_payload(const struct rte_eth_flex_payload_cfg *flex_cfg)
  * arguments are valid
  */
 static int
-i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
+i40e_check_fdir_flex_conf(const struct i40e_adapter *adapter,
+			  const struct rte_eth_fdir_flex_conf *conf)
 {
 	const struct rte_eth_flex_payload_cfg *flex_cfg;
 	const struct rte_eth_fdir_flex_mask *flex_mask;
@@ -457,6 +454,7 @@ i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
 	uint8_t nb_bitmask;
 	uint16_t i, j;
 	int ret = 0;
+	enum i40e_filter_pctype pctype;
 
 	if (conf == NULL) {
 		PMD_DRV_LOG(INFO, "NULL pointer.");
@@ -487,7 +485,8 @@ i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
 	}
 	for (i = 0; i < conf->nb_flexmasks; i++) {
 		flex_mask = &conf->flex_mask[i];
-		if (!I40E_VALID_FLOW(flex_mask->flow_type)) {
+		pctype = i40e_flowtype_to_pctype(adapter, flex_mask->flow_type);
+		if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 			PMD_DRV_LOG(WARNING, "invalid flow type.");
 			return -EINVAL;
 		}
@@ -650,7 +649,7 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
 	i40e_init_flx_pld(pf); /* set flex config to default value */
 
 	conf = &dev->data->dev_conf.fdir_conf.flex_conf;
-	ret = i40e_check_fdir_flex_conf(conf);
+	ret = i40e_check_fdir_flex_conf(pf->adapter, conf);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, " invalid configuration arguments.");
 		return -EINVAL;
@@ -664,11 +663,11 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
 			/* get translated pctype value in fd pctype register */
 			pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(
 				hw, I40E_GLQF_FD_PCTYPES(
-				(int)i40e_flowtype_to_pctype(
+				(int)i40e_flowtype_to_pctype(pf->adapter,
 				conf->flex_mask[i].flow_type)));
 		} else
-			pctype = i40e_flowtype_to_pctype(
-				conf->flex_mask[i].flow_type);
+			pctype = i40e_flowtype_to_pctype(pf->adapter,
+							 conf->flex_mask[i].flow_type);
 
 		i40e_set_flex_mask_on_pctype(pf, pctype, &conf->flex_mask[i]);
 	}
@@ -1100,7 +1099,8 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
 		return -ENOTSUP;
 	}
 
-	if (!I40E_VALID_FLOW(filter->input.flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, filter->input.flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
@@ -1141,12 +1141,8 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
 	if (hw->mac.type == I40E_MAC_X722) {
 		/* get translated pctype value in fd pctype register */
 		pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(
-			hw, I40E_GLQF_FD_PCTYPES(
-			(int)i40e_flowtype_to_pctype(
-			filter->input.flow_type)));
-	} else
-		pctype = i40e_flowtype_to_pctype(filter->input.flow_type);
-
+			hw, I40E_GLQF_FD_PCTYPES((int)pctype));
+	}
 	ret = i40e_fdir_filter_programming(pf, pctype, filter, add);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, "fdir programming fails for PCTYPE(%u).",
@@ -1384,7 +1380,6 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
 {
 	struct i40e_fdir_flex_mask *mask;
 	struct rte_eth_fdir_flex_mask *ptr = flex_mask;
-	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
 	uint16_t flow_type;
 	uint8_t i, j;
 	uint16_t off_bytes, mask_tmp;
@@ -1393,14 +1388,11 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
 	     i <= I40E_FILTER_PCTYPE_L2_PAYLOAD;
 	     i++) {
 		mask =  &pf->fdir.flex_mask[i];
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722((enum i40e_filter_pctype)i))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE((enum i40e_filter_pctype)i))
-				continue;
-		}
-		flow_type = i40e_pctype_to_flowtype((enum i40e_filter_pctype)i);
+		flow_type = i40e_pctype_to_flowtype(pf->adapter,
+						    (enum i40e_filter_pctype)i);
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
+
 		for (j = 0; j < I40E_FDIR_MAX_FLEXWORD_NUM; j++) {
 			if (mask->word_mask & I40E_FLEX_WORD_MASK(j)) {
 				ptr->mask[j * sizeof(uint16_t)] = UINT8_MAX;
diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
index b92719a..5d8afc6 100644
--- a/drivers/net/i40e/i40e_flow.c
+++ b/drivers/net/i40e/i40e_flow.c
@@ -2776,8 +2776,9 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev,
 		}
 	}
 
-	pctype = i40e_flowtype_to_pctype(flow_type);
-	if (pctype == 0 || pctype > I40E_FILTER_PCTYPE_L2_PAYLOAD) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID ||
+	    pctype > I40E_FILTER_PCTYPE_L2_PAYLOAD) {
 		rte_flow_error_set(error, EINVAL,
 				   RTE_FLOW_ERROR_TYPE_ITEM, item,
 				   "Unsupported flow type");
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 3a7b68e..0c8ad00 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -2943,6 +2943,63 @@ i40e_set_default_ptype_table(struct rte_eth_dev *dev)
 		ad->ptype_tbl[i] = i40e_get_default_pkt_type(i);
 }
 
+void __attribute__((cold))
+i40e_set_default_pctype_table(struct rte_eth_dev *dev)
+{
+	struct i40e_adapter *ad = I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	int i;
+
+	for (i = 0; i < I40E_FLOW_TYPE_MAX; i++)
+		ad->pctypes_tbl[i] = 0ULL;
+	ad->flow_types_mask = 0ULL;
+	ad->pctypes_mask = 0ULL;
+
+	ad->pctypes_tbl[RTE_ETH_FLOW_FRAG_IPV4] =
+				(1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_SCTP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_OTHER] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER);
+	ad->pctypes_tbl[RTE_ETH_FLOW_FRAG_IPV6] =
+				(1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_SCTP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_OTHER] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER);
+	ad->pctypes_tbl[RTE_ETH_FLOW_L2_PAYLOAD] =
+				(1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD);
+
+	if (hw->mac.type == I40E_MAC_X722) {
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK);
+	}
+
+	for (i = 0; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (ad->pctypes_tbl[i])
+			ad->flow_types_mask |= (1ULL << i);
+		ad->pctypes_mask |= ad->pctypes_tbl[i];
+	}
+}
+
 /* Stubs needed for linkage when CONFIG_RTE_I40E_INC_VECTOR is set to 'n' */
 int __attribute__((weak))
 i40e_rx_vec_dev_conf_condition_check(struct rte_eth_dev __rte_unused *dev)
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index 20084d6..2a58ced 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -255,6 +255,7 @@ void i40e_set_tx_function_flag(struct rte_eth_dev *dev,
 			       struct i40e_tx_queue *txq);
 void i40e_set_tx_function(struct rte_eth_dev *dev);
 void i40e_set_default_ptype_table(struct rte_eth_dev *dev);
+void i40e_set_default_pctype_table(struct rte_eth_dev *dev);
 
 /* For each value it means, datasheet of hardware can tell more details
  *
-- 
2.5.5

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v6 2/5] ethdev: increase port_id range
  2017-09-29  7:17  4%       ` [dpdk-dev] [PATCH v6 0/5] " Zhiyong Yang
  2017-09-29  7:17  7%         ` [dpdk-dev] [PATCH v6 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
@ 2017-09-29  7:17  1%         ` Zhiyong Yang
  2017-10-06  2:15  0%         ` [dpdk-dev] [PATCH v6 0/5] " Ferruh Yigit
  2 siblings, 0 replies; 200+ results
From: Zhiyong Yang @ 2017-09-29  7:17 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, thomas, Zhiyong Yang

Extend port_id definition from uint8_t to uint16_t in lib and drivers
data structures, specifically rte_eth_dev_data. Modify the APIs,
drivers and app using port_id at the same time.

Fix some checkpatch issues from the original code and remove some
unnecessary cast operations.

release_17_11 and deprecation docs have been updated in this patch.

Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
 app/pdump/main.c                                  |   2 +-
 app/test-pmd/cmdline.c                            |   6 +-
 app/test-pmd/config.c                             |   4 +-
 app/test-pmd/ieee1588fwd.c                        |  26 ++-
 app/test-pmd/parameters.c                         |   2 +-
 app/test-pmd/rxonly.c                             |   2 +-
 app/test-pmd/testpmd.c                            |  18 +-
 app/test-pmd/testpmd.h                            |   4 +-
 doc/guides/rel_notes/deprecation.rst              |   6 -
 doc/guides/rel_notes/release_17_11.rst            |  24 ++-
 drivers/net/af_packet/rte_eth_af_packet.c         |   2 +-
 drivers/net/ark/ark_ethdev.c                      |   2 +-
 drivers/net/avp/avp_ethdev.c                      |   2 +-
 drivers/net/bnx2x/bnx2x_rxtx.h                    |   4 +-
 drivers/net/bnxt/Makefile                         |   2 +-
 drivers/net/bnxt/bnxt.h                           |   2 +-
 drivers/net/bnxt/bnxt_ethdev.c                    |   4 +-
 drivers/net/bnxt/bnxt_rxq.h                       |   2 +-
 drivers/net/bnxt/bnxt_txq.h                       |   2 +-
 drivers/net/bnxt/rte_pmd_bnxt.c                   |  32 +--
 drivers/net/bnxt/rte_pmd_bnxt.h                   |  32 +--
 drivers/net/bonding/Makefile                      |   2 +-
 drivers/net/bonding/rte_eth_bond.h                |  41 ++--
 drivers/net/bonding/rte_eth_bond_8023ad.c         |  60 +++---
 drivers/net/bonding/rte_eth_bond_8023ad.h         |  30 +--
 drivers/net/bonding/rte_eth_bond_8023ad_private.h |  12 +-
 drivers/net/bonding/rte_eth_bond_alb.c            |   6 +-
 drivers/net/bonding/rte_eth_bond_alb.h            |   6 +-
 drivers/net/bonding/rte_eth_bond_api.c            |  64 +++---
 drivers/net/bonding/rte_eth_bond_args.c           |   2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c            |  62 +++---
 drivers/net/bonding/rte_eth_bond_private.h        |  45 ++--
 drivers/net/e1000/em_ethdev.c                     |   2 +-
 drivers/net/e1000/em_rxtx.c                       |   4 +-
 drivers/net/e1000/igb_rxtx.c                      |   4 +-
 drivers/net/failsafe/failsafe_ether.c             |   4 +-
 drivers/net/failsafe/failsafe_private.h           |   4 +-
 drivers/net/fm10k/fm10k.h                         |   6 +-
 drivers/net/i40e/Makefile                         |   2 +-
 drivers/net/i40e/i40e_ethdev.c                    |   5 +-
 drivers/net/i40e/i40e_rxtx.h                      |   4 +-
 drivers/net/i40e/rte_pmd_i40e.c                   |  50 ++---
 drivers/net/i40e/rte_pmd_i40e.h                   |  48 ++---
 drivers/net/ixgbe/Makefile                        |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c                  |   5 +-
 drivers/net/ixgbe/ixgbe_rxtx.h                    |   4 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c                 |  60 +++---
 drivers/net/ixgbe/rte_pmd_ixgbe.h                 |  64 +++---
 drivers/net/mlx5/mlx5_rxtx.h                      |   4 +-
 drivers/net/nfp/nfp_net.c                         |  16 +-
 drivers/net/nfp/nfp_net_pmd.h                     |   2 +-
 drivers/net/null/rte_eth_null.c                   |   2 +-
 drivers/net/pcap/rte_eth_pcap.c                   |   2 +-
 drivers/net/qede/qede_if.h                        |   2 +-
 drivers/net/ring/rte_eth_ring.c                   |   2 +-
 drivers/net/szedata2/rte_eth_szedata2.c           |   2 +-
 drivers/net/thunderx/nicvf_struct.h               |   2 +-
 drivers/net/vhost/Makefile                        |   2 +-
 drivers/net/vhost/rte_eth_vhost.c                 |   6 +-
 drivers/net/vhost/rte_eth_vhost.h                 |   4 +-
 drivers/net/virtio/virtio_pci.h                   |   2 +-
 drivers/net/virtio/virtio_rxtx.h                  |   6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h                |   4 +-
 lib/librte_bitratestats/Makefile                  |   2 +-
 lib/librte_bitratestats/rte_bitrate.c             |   2 +-
 lib/librte_bitratestats/rte_bitrate.h             |   2 +-
 lib/librte_ether/Makefile                         |   2 +-
 lib/librte_ether/rte_ethdev.c                     | 241 +++++++++++-----------
 lib/librte_ether/rte_ethdev.h                     | 238 ++++++++++-----------
 lib/librte_ether/rte_flow.c                       |   2 +-
 lib/librte_ether/rte_flow_driver.h                |   2 +-
 lib/librte_ether/rte_tm.c                         |  62 +++---
 lib/librte_ether/rte_tm.h                         |  60 +++---
 lib/librte_ether/rte_tm_driver.h                  |   2 +-
 lib/librte_kni/rte_kni.h                          |   6 +-
 lib/librte_latencystats/rte_latencystats.c        |  12 +-
 lib/librte_pdump/Makefile                         |   2 +-
 lib/librte_pdump/rte_pdump.c                      |  16 +-
 lib/librte_pdump/rte_pdump.h                      |   4 +-
 lib/librte_port/rte_port_ethdev.c                 |   6 +-
 lib/librte_port/rte_port_ethdev.h                 |   6 +-
 81 files changed, 765 insertions(+), 738 deletions(-)

diff --git a/app/pdump/main.c b/app/pdump/main.c
index 3b13753d9..090a50cfc 100644
--- a/app/pdump/main.c
+++ b/app/pdump/main.c
@@ -623,7 +623,7 @@ static void
 create_mp_ring_vdev(void)
 {
 	int i;
-	uint8_t portid;
+	uint16_t portid;
 	struct pdump_tuples *pt = NULL;
 	struct rte_mempool *mbuf_pool = NULL;
 	char vdev_args[SIZE];
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index ccdf239d6..d9d083888 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -4588,7 +4588,7 @@ struct cmd_show_bonding_config_result {
 	cmdline_fixed_string_t show;
 	cmdline_fixed_string_t bonding;
 	cmdline_fixed_string_t config;
-	uint8_t port_id;
+	portid_t port_id;
 };
 
 static void cmd_show_bonding_config_parsed(void *parsed_result,
@@ -4597,7 +4597,7 @@ static void cmd_show_bonding_config_parsed(void *parsed_result,
 {
 	struct cmd_show_bonding_config_result *res = parsed_result;
 	int bonding_mode, agg_mode;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	portid_t slaves[RTE_MAX_ETHPORTS];
 	int num_slaves, num_active_slaves;
 	int primary_id;
 	int i;
@@ -11500,7 +11500,7 @@ struct cmd_vf_vlan_stripq_result {
 	cmdline_fixed_string_t vf;
 	cmdline_fixed_string_t vlan;
 	cmdline_fixed_string_t stripq;
-	uint8_t port_id;
+	portid_t port_id;
 	uint16_t vf_id;
 	cmdline_fixed_string_t on_off;
 };
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 3ae3e1cd8..155136dd5 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -358,7 +358,7 @@ rx_queue_infos_display(portid_t port_id, uint16_t queue_id)
 
 	rc = rte_eth_rx_queue_info_get(port_id, queue_id, &qinfo);
 	if (rc != 0) {
-		printf("Failed to retrieve information for port: %hhu, "
+		printf("Failed to retrieve information for port: %u, "
 			"RX queue: %hu\nerror desc: %s(%d)\n",
 			port_id, queue_id, strerror(-rc), rc);
 		return;
@@ -391,7 +391,7 @@ tx_queue_infos_display(portid_t port_id, uint16_t queue_id)
 
 	rc = rte_eth_tx_queue_info_get(port_id, queue_id, &qinfo);
 	if (rc != 0) {
-		printf("Failed to retrieve information for port: %hhu, "
+		printf("Failed to retrieve information for port: %u, "
 			"TX queue: %hu\nerror desc: %s(%d)\n",
 			port_id, queue_id, strerror(-rc), rc);
 		return;
diff --git a/app/test-pmd/ieee1588fwd.c b/app/test-pmd/ieee1588fwd.c
index 51170ee3e..91ee78646 100644
--- a/app/test-pmd/ieee1588fwd.c
+++ b/app/test-pmd/ieee1588fwd.c
@@ -86,12 +86,11 @@ port_ieee1588_rx_timestamp_check(portid_t pi, uint32_t index)
 	struct timespec timestamp = {0, 0};
 
 	if (rte_eth_timesync_read_rx_timestamp(pi, &timestamp, index) < 0) {
-		printf("Port %u RX timestamp registers not valid\n",
-		       (unsigned) pi);
+		printf("Port %u RX timestamp registers not valid\n", pi);
 		return;
 	}
 	printf("Port %u RX timestamp value %lu s %lu ns\n",
-	       (unsigned) pi, timestamp.tv_sec, timestamp.tv_nsec);
+		pi, timestamp.tv_sec, timestamp.tv_nsec);
 }
 
 #define MAX_TX_TMST_WAIT_MICROSECS 1000 /**< 1 milli-second */
@@ -110,12 +109,12 @@ port_ieee1588_tx_timestamp_check(portid_t pi)
 	if (wait_us >= MAX_TX_TMST_WAIT_MICROSECS) {
 		printf("Port %u TX timestamp registers not valid after "
 		       "%u micro-seconds\n",
-		       (unsigned) pi, (unsigned) MAX_TX_TMST_WAIT_MICROSECS);
+		       pi, MAX_TX_TMST_WAIT_MICROSECS);
 		return;
 	}
 	printf("Port %u TX timestamp value %lu s %lu ns validated after "
 	       "%u micro-second%s\n",
-	       (unsigned) pi, timestamp.tv_sec, timestamp.tv_nsec, wait_us,
+	       pi, timestamp.tv_sec, timestamp.tv_nsec, wait_us,
 	       (wait_us == 1) ? "" : "s");
 }
 
@@ -148,11 +147,11 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 		if (eth_type == ETHER_TYPE_1588) {
 			printf("Port %u Received PTP packet not filtered"
 			       " by hardware\n",
-			       (unsigned) fs->rx_port);
+			       fs->rx_port);
 		} else {
 			printf("Port %u Received non PTP packet type=0x%4x "
 			       "len=%u\n",
-			       (unsigned) fs->rx_port, eth_type,
+			       fs->rx_port, eth_type,
 			       (unsigned) mb->pkt_len);
 		}
 		rte_pktmbuf_free(mb);
@@ -161,7 +160,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (eth_type != ETHER_TYPE_1588) {
 		printf("Port %u Received NON PTP packet incorrectly"
 		       " detected by hardware\n",
-		       (unsigned) fs->rx_port);
+		       fs->rx_port);
 		rte_pktmbuf_free(mb);
 		return;
 	}
@@ -175,19 +174,19 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (ptp_hdr->version != 0x02) {
 		printf("Port %u Received PTP V2 Ethernet frame with wrong PTP"
 		       " protocol version 0x%x (should be 0x02)\n",
-		       (unsigned) fs->rx_port, ptp_hdr->version);
+		       fs->rx_port, ptp_hdr->version);
 		rte_pktmbuf_free(mb);
 		return;
 	}
 	if (ptp_hdr->msg_id != PTP_SYNC_MESSAGE) {
 		printf("Port %u Received PTP V2 Ethernet frame with unexpected"
 		       " message ID 0x%x (expected 0x0 - PTP_SYNC_MESSAGE)\n",
-		       (unsigned) fs->rx_port, ptp_hdr->msg_id);
+		       fs->rx_port, ptp_hdr->msg_id);
 		rte_pktmbuf_free(mb);
 		return;
 	}
 	printf("Port %u IEEE1588 PTP V2 SYNC Message filtered by hardware\n",
-	       (unsigned) fs->rx_port);
+	       fs->rx_port);
 
 	/*
 	 * Check that the received PTP packet has been timestamped by the
@@ -196,7 +195,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (! (mb->ol_flags & PKT_RX_IEEE1588_TMST)) {
 		printf("Port %u Received PTP packet not timestamped"
 		       " by hardware\n",
-		       (unsigned) fs->rx_port);
+		       fs->rx_port);
 		rte_pktmbuf_free(mb);
 		return;
 	}
@@ -216,8 +215,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	mb->ol_flags |= PKT_TX_IEEE1588_TMST;
 	fs->tx_packets += 1;
 	if (rte_eth_tx_burst(fs->rx_port, fs->tx_queue, &mb, 1) == 0) {
-		printf("Port %u sent PTP packet dropped\n",
-		       (unsigned) fs->rx_port);
+		printf("Port %u sent PTP packet dropped\n", fs->rx_port);
 		fs->fwd_dropped += 1;
 		rte_pktmbuf_free(mb);
 		return;
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 2f7f70fd6..31287d71d 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -734,7 +734,7 @@ launch_args_parse(int argc, char** argv)
 			if (!strcmp(lgopts[opt_idx].name, "nb-ports")) {
 				n = atoi(optarg);
 				if (n > 0 && n <= nb_ports)
-					nb_fwd_ports = (uint8_t) n;
+					nb_fwd_ports = n;
 				else
 					rte_exit(EXIT_FAILURE,
 						 "Invalid port %d\n", n);
diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c
index 5ef021905..57df01468 100644
--- a/app/test-pmd/rxonly.c
+++ b/app/test-pmd/rxonly.c
@@ -122,7 +122,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 	 */
 	if (verbose_level > 0)
 		printf("port %u/queue %u: received %u packets\n",
-		       (unsigned) fs->rx_port,
+		       fs->rx_port,
 		       (unsigned) fs->rx_queue,
 		       (unsigned) nb_rx);
 	for (i = 0; i < nb_rx; i++) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index e097ee04e..477e2e7ad 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -390,7 +390,7 @@ struct gro_status gro_ports[RTE_MAX_ETHPORTS];
 /* Forward function declarations */
 static void map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port);
 static void check_all_ports_link_status(uint32_t port_mask);
-static int eth_event_callback(uint8_t port_id,
+static int eth_event_callback(portid_t port_id,
 			      enum rte_eth_event_type type,
 			      void *param, void *ret_param);
 
@@ -1816,7 +1816,8 @@ check_all_ports_link_status(uint32_t port_mask)
 {
 #define CHECK_INTERVAL 100 /* 100ms */
 #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */
-	uint8_t portid, count, all_ports_up, print_flag = 0;
+	portid_t portid;
+	uint8_t count, all_ports_up, print_flag = 0;
 	struct rte_eth_link link;
 
 	printf("Checking link statuses...\n");
@@ -1831,14 +1832,13 @@ check_all_ports_link_status(uint32_t port_mask)
 			/* print link status if flag set */
 			if (print_flag == 1) {
 				if (link.link_status)
-					printf("Port %d Link Up - speed %u "
-						"Mbps - %s\n", (uint8_t)portid,
-						(unsigned)link.link_speed,
+					printf(
+					"Port%d Link Up. speed %u Mbps- %s\n",
+					portid, link.link_speed,
 				(link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
 					("full-duplex") : ("half-duplex\n"));
 				else
-					printf("Port %d Link Down\n",
-						(uint8_t)portid);
+					printf("Port %d Link Down\n", portid);
 				continue;
 			}
 			/* clear all_ports_up flag if any link down */
@@ -1885,7 +1885,7 @@ rmv_event_callback(void *arg)
 
 /* This function is used by the interrupt thread */
 static int
-eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param,
+eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
 		  void *ret_param)
 {
 	static const char * const event_desc[] = {
@@ -2328,7 +2328,7 @@ int
 main(int argc, char** argv)
 {
 	int  diag;
-	uint8_t port_id;
+	portid_t port_id;
 
 	signal(SIGINT, signal_handler);
 	signal(SIGTERM, signal_handler);
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 1d1ee7587..657c1235c 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -78,7 +78,7 @@
 #define UMA_NO_CONFIG  0xFF
 
 typedef uint8_t  lcoreid_t;
-typedef uint8_t  portid_t;
+typedef uint16_t portid_t;
 typedef uint16_t queueid_t;
 typedef uint16_t streamid_t;
 
@@ -283,7 +283,7 @@ enum dcb_mode_enable
 #define MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128 rx_queues/port */
 
 struct queue_stats_mappings {
-	uint8_t port_id;
+	portid_t port_id;
 	uint16_t queue_id;
 	uint8_t stats_counter_id;
 } __rte_cache_aligned;
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 3362f3350..45eb5c4a9 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -76,12 +76,6 @@ Deprecation Notices
   done by the EAL and not by the ``ethdev`` layer anymore. Users relying on this
   flag being present only have to remove their checks to follow the change.
 
-* ABI/API changes are planned for 17.11 in all structures which include port_id
-  definition such as "rte_eth_dev_data", "rte_port_ethdev_reader_params",
-  "rte_port_ethdev_writer_params", and so on. The definition of port_id will be
-  changed from 8 bits to 16 bits in order to support more than 256 ports in
-  DPDK. All APIs which have port_id parameter will be changed at the same time.
-
 * ethdev: An ABI change is planned for 17.11 for the structure rte_eth_dev_data.
   The size of the unique name will increase RTE_ETH_NAME_MAX_LEN from 32 to
   64 characters to allow using a globally unique identifier (GUID) in this field.
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index f6f916928..4d2c9669d 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -41,6 +41,11 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Extended port_id range from uint8_t to uint16_t.**
+
+  Increased port_id range from 8 bits to 16 bits in order to support more than
+  256 ports in dpdk. All ethdev APIs which have port_id as parameter are changed
+  in the meantime.
 
 Resolved Issues
 ---------------
@@ -144,7 +149,10 @@ ABI Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* **Extended port_id range.**
 
+  The size of the field ``port_id`` in the ``rte_eth_dev_data`` structure
+  changed, as described in the `New Features` section.
 
 Shared Library Versions
 -----------------------
@@ -165,13 +173,13 @@ The libraries prepended with a plus sign were incremented in this version.
 .. code-block:: diff
 
      librte_acl.so.2
-     librte_bitratestats.so.1
+     librte_bitratestats.so.2
      librte_cfgfile.so.2
      librte_cmdline.so.2
      librte_cryptodev.so.3
      librte_distributor.so.1
      librte_eal.so.5
-     librte_ethdev.so.7
+     librte_ethdev.so.8
      librte_eventdev.so.2
      librte_gro.so.1
      librte_hash.so.2
@@ -186,14 +194,14 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_meter.so.1
      librte_metrics.so.1
      librte_net.so.1
-     librte_pdump.so.1
+     librte_pdump.so.2
      librte_pipeline.so.3
-     librte_pmd_bnxt.so.1
-     librte_pmd_bond.so.1
-     librte_pmd_i40e.so.1
-     librte_pmd_ixgbe.so.1
+     librte_pmd_bnxt.so.2
+     librte_pmd_bond.so.2
+     librte_pmd_i40e.so.2
+     librte_pmd_ixgbe.so.2
      librte_pmd_ring.so.2
-     librte_pmd_vhost.so.1
+     librte_pmd_vhost.so.2
      librte_port.so.3
      librte_power.so.1
      librte_reorder.so.1
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index 9a47852ca..483b0c107 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -75,7 +75,7 @@ struct pkt_rx_queue {
 	unsigned int framenum;
 
 	struct rte_mempool *mb_pool;
-	uint8_t in_port;
+	uint16_t in_port;
 
 	volatile unsigned long rx_pkts;
 	volatile unsigned long err_pkts;
diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c
index 6db362b04..893284733 100644
--- a/drivers/net/ark/ark_ethdev.c
+++ b/drivers/net/ark/ark_ethdev.c
@@ -641,7 +641,7 @@ eth_ark_dev_stop(struct rte_eth_dev *dev)
 	for (i = 0; i < dev->data->nb_tx_queues; i++) {
 		status = eth_ark_tx_queue_stop(dev, i);
 		if (status != 0) {
-			uint8_t port = dev->data->port_id;
+			uint16_t port = dev->data->port_id;
 			PMD_DRV_LOG(ERR,
 				    "tx_queue stop anomaly"
 				    " port %u, queue %u\n",
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index c746a0e2c..b5cc955f2 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -190,7 +190,7 @@ struct avp_dev {
 	struct rte_eth_dev_data *dev_data;
 	/**< Back pointer to ethernet device data */
 	volatile uint32_t flags; /**< Device operational flags */
-	uint8_t port_id; /**< Ethernet port identifier */
+	uint16_t port_id; /**< Ethernet port identifier */
 	struct rte_mempool *pool; /**< pkt mbuf mempool */
 	unsigned int guest_mbuf_size; /**< local pool mbuf size */
 	unsigned int host_mbuf_size; /**< host mbuf size */
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.h b/drivers/net/bnx2x/bnx2x_rxtx.h
index 2e38ec26a..9600e0f1c 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.h
+++ b/drivers/net/bnx2x/bnx2x_rxtx.h
@@ -41,7 +41,7 @@ struct bnx2x_rx_queue {
 	uint16_t                   rx_cq_head;           /**< Index of current rcq bd. */
 	uint16_t                   rx_cq_tail;           /**< Index of last rcq bd. */
 	uint16_t                   queue_id;             /**< RX queue index. */
-	uint8_t                    port_id;              /**< Device port identifier. */
+	uint16_t                   port_id;              /**< Device port identifier. */
 	struct bnx2x_softc           *sc;                  /**< Ptr to dev_private data. */
 };
 
@@ -62,7 +62,7 @@ struct bnx2x_tx_queue {
 	uint16_t                   nb_tx_avail;          /**< Number of TX descriptors available. */
 	uint16_t                   nb_tx_pages;          /**< number of TX pages */
 	uint16_t                   queue_id;             /**< TX queue index. */
-	uint8_t                    port_id;              /**< Device port identifier. */
+	uint16_t                   port_id;              /**< Device port identifier. */
 	struct bnx2x_softc           *sc;                  /**< Ptr to dev_private data */
 };
 
diff --git a/drivers/net/bnxt/Makefile b/drivers/net/bnxt/Makefile
index b03f65dc9..55b49b538 100644
--- a/drivers/net/bnxt/Makefile
+++ b/drivers/net/bnxt/Makefile
@@ -40,7 +40,7 @@ LIB = librte_pmd_bnxt.a
 
 EXPORT_MAP := rte_pmd_bnxt_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 405d94deb..26a9018b5 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -126,7 +126,7 @@ struct bnxt_pf_info {
 #define BNXT_FIRST_VF_FID	128
 #define BNXT_PF_RINGS_USED(bp)	bnxt_get_num_queues(bp)
 #define BNXT_PF_RINGS_AVAIL(bp)	(bp->pf.max_cp_rings - BNXT_PF_RINGS_USED(bp))
-	uint8_t			port_id;
+	uint16_t		port_id;
 	uint16_t		first_vf_id;
 	uint16_t		active_vfs;
 	uint16_t		max_vfs;
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index c9d11228b..2e817535e 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -489,13 +489,13 @@ static void bnxt_print_link_info(struct rte_eth_dev *eth_dev)
 
 	if (link->link_status)
 		RTE_LOG(INFO, PMD, "Port %d Link Up - speed %u Mbps - %s\n",
-			(uint8_t)(eth_dev->data->port_id),
+			eth_dev->data->port_id,
 			(uint32_t)link->link_speed,
 			(link->link_duplex == ETH_LINK_FULL_DUPLEX) ?
 			("full-duplex") : ("half-duplex\n"));
 	else
 		RTE_LOG(INFO, PMD, "Port %d Link Down\n",
-			(uint8_t)(eth_dev->data->port_id));
+			eth_dev->data->port_id);
 }
 
 static int bnxt_dev_lsc_intr_setup(struct rte_eth_dev *eth_dev)
diff --git a/drivers/net/bnxt/bnxt_rxq.h b/drivers/net/bnxt/bnxt_rxq.h
index 01aaa007f..cea0785d1 100644
--- a/drivers/net/bnxt/bnxt_rxq.h
+++ b/drivers/net/bnxt/bnxt_rxq.h
@@ -48,7 +48,7 @@ struct bnxt_rx_queue {
 	uint16_t		rx_free_thresh; /* max free RX desc to hold */
 	uint16_t		queue_id; /* RX queue index */
 	uint16_t		reg_idx; /* RX queue register index */
-	uint8_t			port_id; /* Device port identifier */
+	uint16_t		port_id; /* Device port identifier */
 	uint8_t			crc_len; /* 0 if CRC stripped, 4 otherwise */
 
 	struct bnxt		*bp;
diff --git a/drivers/net/bnxt/bnxt_txq.h b/drivers/net/bnxt/bnxt_txq.h
index 16f3a0bdd..f753c10f2 100644
--- a/drivers/net/bnxt/bnxt_txq.h
+++ b/drivers/net/bnxt/bnxt_txq.h
@@ -46,7 +46,7 @@ struct bnxt_tx_queue {
 	uint16_t		tx_next_rs; /* next desc to set RS bit */
 	uint16_t		queue_id; /* TX queue index */
 	uint16_t		reg_idx; /* TX queue register index */
-	uint8_t			port_id; /* Device port identifier */
+	uint16_t		port_id; /* Device port identifier */
 	uint8_t			pthresh; /* Prefetch threshold register */
 	uint8_t			hthresh; /* Host threshold register */
 	uint8_t			wthresh; /* Write-back threshold reg */
diff --git a/drivers/net/bnxt/rte_pmd_bnxt.c b/drivers/net/bnxt/rte_pmd_bnxt.c
index c343d9033..63fc27911 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt.c
+++ b/drivers/net/bnxt/rte_pmd_bnxt.c
@@ -67,7 +67,7 @@ int bnxt_rcv_msg_from_vf(struct bnxt *bp, uint16_t vf_id, void *msg)
 		true : false;
 }
 
-int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on)
+int rte_pmd_bnxt_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *eth_dev;
 	struct bnxt *bp;
@@ -108,7 +108,7 @@ rte_pmd_bnxt_set_all_queues_drop_en_cb(struct bnxt_vnic_info *vnic, void *onptr)
 	vnic->bd_stall = !(*on);
 }
 
-int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on)
+int rte_pmd_bnxt_set_all_queues_drop_en(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *eth_dev;
 	struct bnxt *bp;
@@ -159,7 +159,7 @@ int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_mac_addr(uint16_t port, uint16_t vf,
 				struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *dev;
@@ -191,7 +191,7 @@ int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk)
 {
 	struct rte_eth_dev *eth_dev;
@@ -241,7 +241,7 @@ int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
@@ -294,7 +294,7 @@ int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
@@ -350,7 +350,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq_cb(struct bnxt_vnic_info *vnic, void *onptr)
 }
 
 int
-rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_bnxt_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -385,7 +385,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rxmode(uint16_t port, uint16_t vf,
 				uint16_t rx_mask, uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -477,7 +477,7 @@ static int bnxt_set_vf_table(struct bnxt *bp, uint16_t vf)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+int rte_pmd_bnxt_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				    uint64_t vf_mask, uint8_t vlan_on)
 {
 	struct bnxt_vlan_table_entry *ve;
@@ -570,7 +570,7 @@ int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
 	return rc;
 }
 
-int rte_pmd_bnxt_get_vf_stats(uint8_t port,
+int rte_pmd_bnxt_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats)
 {
@@ -598,7 +598,7 @@ int rte_pmd_bnxt_get_vf_stats(uint8_t port,
 	return bnxt_hwrm_func_qstats(bp, bp->pf.first_vf_id + vf_id, stats);
 }
 
-int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
+int rte_pmd_bnxt_reset_vf_stats(uint16_t port,
 				uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -625,7 +625,7 @@ int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
 	return bnxt_hwrm_func_clr_stats(bp, bp->pf.first_vf_id + vf_id);
 }
 
-int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id)
+int rte_pmd_bnxt_get_vf_rx_status(uint16_t port, uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -651,7 +651,7 @@ int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id)
 	return bnxt_vf_vnic_count(bp, vf_id);
 }
 
-int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
+int rte_pmd_bnxt_get_vf_tx_drop_count(uint16_t port, uint16_t vf_id,
 				      uint64_t *count)
 {
 	struct rte_eth_dev *dev;
@@ -679,7 +679,7 @@ int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
 					     count);
 }
 
-int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *addr,
+int rte_pmd_bnxt_mac_addr_add(uint16_t port, struct ether_addr *addr,
 				uint32_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -756,7 +756,7 @@ int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *addr,
 }
 
 int
-rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+rte_pmd_bnxt_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id)
 {
 	struct rte_eth_dev *dev;
@@ -793,7 +793,7 @@ rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_persist_stats(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_persist_stats(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
diff --git a/drivers/net/bnxt/rte_pmd_bnxt.h b/drivers/net/bnxt/rte_pmd_bnxt.h
index c4c4770e3..f881d30d6 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt.h
+++ b/drivers/net/bnxt/rte_pmd_bnxt.h
@@ -78,7 +78,7 @@ struct rte_pmd_bnxt_mb_event_param {
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Set the VF MAC address.
@@ -94,7 +94,7 @@ int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_mac_addr(uint16_t port, uint16_t vf,
 		struct ether_addr *mac_addr);
 
 /**
@@ -115,7 +115,7 @@ int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_bnxt_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -134,7 +134,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+rte_pmd_bnxt_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id);
 
 /**
@@ -156,7 +156,7 @@ rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+int rte_pmd_bnxt_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				    uint64_t vf_mask, uint8_t vlan_on);
 
 /**
@@ -173,7 +173,7 @@ int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on);
+int rte_pmd_bnxt_set_tx_loopback(uint16_t port, uint8_t on);
 
 /**
  * set all queues drop enable bit
@@ -189,7 +189,7 @@ int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on);
+int rte_pmd_bnxt_set_all_queues_drop_en(uint16_t port, uint8_t on);
 
 /**
  * Set the VF rate limit.
@@ -207,7 +207,7 @@ int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk);
 
 /**
@@ -226,7 +226,7 @@ int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_bnxt_get_vf_stats(uint8_t port,
+int rte_pmd_bnxt_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats);
 
@@ -242,7 +242,7 @@ int rte_pmd_bnxt_get_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
+int rte_pmd_bnxt_reset_vf_stats(uint16_t port,
 				uint16_t vf_id);
 
 /**
@@ -261,7 +261,7 @@ int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Set RX L2 Filtering mode of a VF of an Ethernet device.
@@ -280,7 +280,7 @@ int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rxmode(uint16_t port, uint16_t vf,
 				uint16_t rx_mask, uint8_t on);
 
 /**
@@ -297,7 +297,7 @@ int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
  *   - (-ENOMEM) on an allocation failure
  *   - (-1) firmware interface error
  */
-int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id);
+int rte_pmd_bnxt_get_vf_rx_status(uint16_t port, uint16_t vf_id);
 
 /**
  * Queries the TX drop counter for the function
@@ -313,7 +313,7 @@ int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id);
  *   - (-EINVAL) invalid vf_id specified.
  *   - (-ENOTSUP) Ethernet device is not a PF
  */
-int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
+int rte_pmd_bnxt_get_vf_tx_drop_count(uint16_t port, uint16_t vf_id,
 				      uint64_t *count);
 
 /**
@@ -331,7 +331,7 @@ int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
  *   - (-ENOTSUP) Ethernet device is not a PF
  *   - (-ENOMEM) on an allocation failure
  */
-int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
+int rte_pmd_bnxt_mac_addr_add(uint16_t port, struct ether_addr *mac_addr,
 				uint32_t vf_id);
 
 /**
@@ -350,5 +350,5 @@ int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_persist_stats(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_persist_stats(uint16_t port, uint16_t vf, uint8_t on);
 #endif /* _PMD_BNXT_H_ */
diff --git a/drivers/net/bonding/Makefile b/drivers/net/bonding/Makefile
index 910c932da..ffc0c3cf7 100644
--- a/drivers/net/bonding/Makefile
+++ b/drivers/net/bonding/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/bonding/rte_eth_bond.h b/drivers/net/bonding/rte_eth_bond.h
index 8efbf0713..87ff29173 100644
--- a/drivers/net/bonding/rte_eth_bond.h
+++ b/drivers/net/bonding/rte_eth_bond.h
@@ -151,7 +151,7 @@ rte_eth_bond_free(const char *name);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Remove a slave rte_eth_dev device from the bonded device
@@ -163,7 +163,7 @@ rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_slave_remove(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Set link bonding mode of bonded device
@@ -175,7 +175,7 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode);
+rte_eth_bond_mode_set(uint16_t bonded_port_id, uint8_t mode);
 
 /**
  * Get link bonding mode of bonded device
@@ -186,7 +186,7 @@ rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode);
  *	link bonding mode on success, negative value otherwise
  */
 int
-rte_eth_bond_mode_get(uint8_t bonded_port_id);
+rte_eth_bond_mode_get(uint16_t bonded_port_id);
 
 /**
  * Set slave rte_eth_dev as primary slave of bonded device
@@ -198,7 +198,7 @@ rte_eth_bond_mode_get(uint8_t bonded_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_primary_set(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Get primary slave of bonded device
@@ -209,7 +209,7 @@ rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	Port Id of primary slave on success, -1 on failure
  */
 int
-rte_eth_bond_primary_get(uint8_t bonded_port_id);
+rte_eth_bond_primary_get(uint16_t bonded_port_id);
 
 /**
  * Populate an array with list of the slaves port id's of the bonded device
@@ -223,7 +223,8 @@ rte_eth_bond_primary_get(uint8_t bonded_port_id);
  *	negative value otherwise
  */
 int
-rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len);
+rte_eth_bond_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+			uint16_t len);
 
 /**
  * Populate an array with list of the active slaves port id's of the bonded
@@ -238,8 +239,8 @@ rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len);
  *	negative value otherwise
  */
 int
-rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
-		uint8_t len);
+rte_eth_bond_active_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+				uint16_t len);
 
 /**
  * Set explicit MAC address to use on bonded device and it's slaves.
@@ -252,7 +253,7 @@ rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
+rte_eth_bond_mac_address_set(uint16_t bonded_port_id,
 		struct ether_addr *mac_addr);
 
 /**
@@ -265,7 +266,7 @@ rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mac_address_reset(uint8_t bonded_port_id);
+rte_eth_bond_mac_address_reset(uint16_t bonded_port_id);
 
 /**
  * Set the transmit policy for bonded device to use when it is operating in
@@ -279,7 +280,7 @@ rte_eth_bond_mac_address_reset(uint8_t bonded_port_id);
  *	0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy);
+rte_eth_bond_xmit_policy_set(uint16_t bonded_port_id, uint8_t policy);
 
 /**
  * Get the transmit policy set on bonded device for balance mode operation
@@ -290,7 +291,7 @@ rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy);
  *	Balance transmit policy on success, negative value otherwise.
  */
 int
-rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id);
+rte_eth_bond_xmit_policy_get(uint16_t bonded_port_id);
 
 /**
  * Set the link monitoring frequency (in ms) for monitoring the link status of
@@ -304,7 +305,7 @@ rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id);
  */
 
 int
-rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms);
+rte_eth_bond_link_monitoring_set(uint16_t bonded_port_id, uint32_t internal_ms);
 
 /**
  * Get the current link monitoring frequency (in ms) for monitoring of the link
@@ -316,7 +317,7 @@ rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms);
  *	Monitoring interval on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id);
+rte_eth_bond_link_monitoring_get(uint16_t bonded_port_id);
 
 
 /**
@@ -330,7 +331,8 @@ rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id);
  *  0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
+rte_eth_bond_link_down_prop_delay_set(uint16_t bonded_port_id,
+				       uint32_t delay_ms);
 
 /**
  * Get the period in milliseconds set for delaying the disabling of a bonded
@@ -342,7 +344,7 @@ rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
  *  Delay period on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id);
+rte_eth_bond_link_down_prop_delay_get(uint16_t bonded_port_id);
 
 /**
  * Set the period in milliseconds for delaying the enabling of a bonded link
@@ -355,7 +357,8 @@ rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id);
  *  0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
+rte_eth_bond_link_up_prop_delay_set(uint16_t bonded_port_id,
+				    uint32_t delay_ms);
 
 /**
  * Get the period in milliseconds set for delaying the enabling of a bonded
@@ -367,7 +370,7 @@ rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
  *  Delay period on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_up_prop_delay_get(uint8_t bonded_port_id);
+rte_eth_bond_link_up_prop_delay_get(uint16_t bonded_port_id);
 
 
 #ifdef __cplusplus
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index c2b9e053c..c1873aa13 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -209,7 +209,7 @@ set_warning_flags(struct port *port, uint16_t flags)
 }
 
 static void
-show_warnings(uint8_t slave_id)
+show_warnings(uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 	uint8_t warnings;
@@ -278,7 +278,7 @@ record_default(struct port *port)
  * @param port			Port on which LACPDU was received.
  */
 static void
-rx_machine(struct bond_dev_private *internals, uint8_t slave_id,
+rx_machine(struct bond_dev_private *internals, uint16_t slave_id,
 		struct lacpdu *lacp)
 {
 	struct port *agg, *port = &mode_8023ad_ports[slave_id];
@@ -399,7 +399,7 @@ rx_machine(struct bond_dev_private *internals, uint8_t slave_id,
  * @param port			Port to handle state machine.
  */
 static void
-periodic_machine(struct bond_dev_private *internals, uint8_t slave_id)
+periodic_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 	/* Calculate if either site is LACP enabled */
@@ -461,7 +461,7 @@ periodic_machine(struct bond_dev_private *internals, uint8_t slave_id)
  * @param port			Port to handle state machine.
  */
 static void
-mux_machine(struct bond_dev_private *internals, uint8_t slave_id)
+mux_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 
@@ -564,7 +564,7 @@ mux_machine(struct bond_dev_private *internals, uint8_t slave_id)
  * @param port
  */
 static void
-tx_machine(struct bond_dev_private *internals, uint8_t slave_id)
+tx_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *agg, *port = &mode_8023ad_ports[slave_id];
 
@@ -688,11 +688,11 @@ static void
 selection_logic(struct bond_dev_private *internals, uint8_t slave_id)
 {
 	struct port *agg, *port;
-	uint8_t slaves_count, new_agg_id, i, j = 0;
-	uint8_t *slaves;
+	uint16_t slaves_count, new_agg_id, i, j = 0;
+	uint16_t *slaves;
 	uint64_t agg_bandwidth[8] = {0};
 	uint64_t agg_count[8] = {0};
-	uint8_t default_slave = 0;
+	uint16_t default_slave = 0;
 	uint8_t mode_count_id, mode_band_id;
 	struct rte_eth_link link_info;
 
@@ -923,7 +923,8 @@ bond_mode_8023ad_periodic_cb(void *arg)
 }
 
 void
-bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
+bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev,
+				uint16_t slave_id)
 {
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 
@@ -951,7 +952,7 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
 	memcpy(&port->actor, &initial, sizeof(struct port_params));
 	/* Standard requires that port ID must be grater than 0.
 	 * Add 1 do get corresponding port_number */
-	port->actor.port_number = rte_cpu_to_be_16((uint16_t)slave_id + 1);
+	port->actor.port_number = rte_cpu_to_be_16(slave_id + 1);
 
 	memcpy(&port->partner, &initial, sizeof(struct port_params));
 
@@ -1022,12 +1023,12 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
 
 int
 bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *bond_dev,
-		uint8_t slave_id)
+		uint16_t slave_id)
 {
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 	void *pkt = NULL;
 	struct port *port;
-	uint8_t i;
+	uint16_t i;
 
 	/* Given slave must be in active list */
 	RTE_ASSERT(find_slave_by_id(internals->active_slaves,
@@ -1066,7 +1067,7 @@ bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev)
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 	struct ether_addr slave_addr;
 	struct port *slave, *agg_slave;
-	uint8_t slave_id, i, j;
+	uint16_t slave_id, i, j;
 
 	bond_mode_8023ad_stop(bond_dev);
 
@@ -1214,7 +1215,7 @@ bond_mode_8023ad_stop(struct rte_eth_dev *bond_dev)
 
 void
 bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
-	uint8_t slave_id, struct rte_mbuf *pkt)
+				  uint16_t slave_id, struct rte_mbuf *pkt)
 {
 	struct mode8023ad_private *mode4 = &internals->mode4;
 	struct port *port = &mode_8023ad_ports[slave_id];
@@ -1295,7 +1296,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
 }
 
 int
-rte_eth_bond_8023ad_conf_get(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1312,7 +1313,7 @@ rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 }
 
 int
-rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
+rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id,
 		enum rte_bond_8023ad_agg_selection agg_selection)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1334,7 +1335,7 @@ rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
 	return 0;
 }
 
-int rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id)
+int rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id)
 {
 	struct rte_eth_dev *bond_dev;
 	struct bond_dev_private *internals;
@@ -1355,7 +1356,7 @@ int rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id)
 
 
 static int
-bond_8023ad_setup_validate(uint8_t port_id,
+bond_8023ad_setup_validate(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	if (valid_bonded_port_id(port_id) != 0)
@@ -1379,8 +1380,9 @@ bond_8023ad_setup_validate(uint8_t port_id,
 	return 0;
 }
 
+
 int
-rte_eth_bond_8023ad_setup(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1401,7 +1403,7 @@ rte_eth_bond_8023ad_setup(uint8_t port_id,
 
 
 int
-rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_slave_info(uint16_t port_id, uint16_t slave_id,
 		struct rte_eth_bond_8023ad_slave_info *info)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1434,7 +1436,7 @@ rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
 }
 
 static int
-bond_8023ad_ext_validate(uint8_t port_id, uint8_t slave_id)
+bond_8023ad_ext_validate(uint16_t port_id, uint16_t slave_id)
 {
 	struct rte_eth_dev *bond_dev;
 	struct bond_dev_private *internals;
@@ -1462,7 +1464,8 @@ bond_8023ad_ext_validate(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled)
+rte_eth_bond_8023ad_ext_collect(uint16_t port_id, uint16_t slave_id,
+				int enabled)
 {
 	struct port *port;
 	int res;
@@ -1482,7 +1485,8 @@ rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled)
 }
 
 int
-rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled)
+rte_eth_bond_8023ad_ext_distrib(uint16_t port_id, uint16_t slave_id,
+				int enabled)
 {
 	struct port *port;
 	int res;
@@ -1502,7 +1506,7 @@ rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled)
 }
 
 int
-rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id)
+rte_eth_bond_8023ad_ext_distrib_get(uint16_t port_id, uint16_t slave_id)
 {
 	struct port *port;
 	int err;
@@ -1516,7 +1520,7 @@ rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id)
+rte_eth_bond_8023ad_ext_collect_get(uint16_t port_id, uint16_t slave_id)
 {
 	struct port *port;
 	int err;
@@ -1530,7 +1534,7 @@ rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_ext_slowtx(uint16_t port_id, uint16_t slave_id,
 		struct rte_mbuf *lacp_pkt)
 {
 	struct port *port;
@@ -1591,7 +1595,7 @@ bond_mode_8023ad_ext_periodic_cb(void *arg)
 }
 
 int
-rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port)
+rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port)
 {
 	int retval = 0;
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
@@ -1615,7 +1619,7 @@ rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port)
 }
 
 int
-rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port)
+rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port)
 {
 	int retval = 0;
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h
index d609745e0..2874336d3 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.h
@@ -64,7 +64,7 @@ extern "C" {
 #define MARKER_TLV_TYPE_INFO                0x01
 #define MARKER_TLV_TYPE_RESP                0x02
 
-typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint8_t slave_id,
+typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint16_t slave_id,
 						  struct rte_mbuf *lacp_pkt);
 
 enum rte_bond_8023ad_selection {
@@ -176,7 +176,7 @@ struct rte_eth_bond_8023ad_slave_info {
 	struct port_params actor;
 	uint8_t partner_state;
 	struct port_params partner;
-	uint8_t agg_port_id;
+	uint16_t agg_port_id;
 };
 
 /**
@@ -192,7 +192,7 @@ struct rte_eth_bond_8023ad_slave_info {
  *   -EINVAL if conf is NULL
  */
 int
-rte_eth_bond_8023ad_conf_get(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
@@ -207,7 +207,7 @@ rte_eth_bond_8023ad_conf_get(uint8_t port_id,
  *   -EINVAL if configuration is invalid.
  */
 int
-rte_eth_bond_8023ad_setup(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
@@ -223,7 +223,7 @@ rte_eth_bond_8023ad_setup(uint8_t port_id,
  *       bonded device or is not inactive).
  */
 int
-rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_slave_info(uint16_t port_id, uint16_t slave_id,
 		struct rte_eth_bond_8023ad_slave_info *conf);
 
 #ifdef __cplusplus
@@ -241,7 +241,8 @@ rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled);
+rte_eth_bond_8023ad_ext_collect(uint16_t port_id, uint16_t slave_id,
+				int enabled);
 
 /**
  * Get COLLECTING flag from slave port actor state.
@@ -254,7 +255,7 @@ rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id);
+rte_eth_bond_8023ad_ext_collect_get(uint16_t port_id, uint16_t slave_id);
 
 /**
  * Configure a slave port to start distributing.
@@ -267,7 +268,8 @@ rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled);
+rte_eth_bond_8023ad_ext_distrib(uint16_t port_id, uint16_t slave_id,
+				int enabled);
 
 /**
  * Get DISTRIBUTING flag from slave port actor state.
@@ -280,7 +282,7 @@ rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id);
+rte_eth_bond_8023ad_ext_distrib_get(uint16_t port_id, uint16_t slave_id);
 
 /**
  * LACPDU transmit path for external 802.3ad state machine.  Caller retains
@@ -294,7 +296,7 @@ rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id);
  *   0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_ext_slowtx(uint16_t port_id, uint16_t slave_id,
 		struct rte_mbuf *lacp_pkt);
 
 /**
@@ -320,7 +322,7 @@ rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
  *   0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port_id);
+rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port_id);
 
 /**
  * Disable slow queue on slaves
@@ -337,7 +339,7 @@ rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port_id);
  *
  */
 int
-rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port_id);
+rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port_id);
 
 /*
  * Get aggregator mode for 8023ad
@@ -347,7 +349,7 @@ rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port_id);
  *   agregator mode on success, negative value otherwise
  */
 int
-rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id);
+rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id);
 
 /**
  * Set aggregator mode for 8023ad
@@ -356,6 +358,6 @@ rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id);
  *   0 on success, negative value otherwise
  */
 int
-rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
+rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id,
 		enum rte_bond_8023ad_agg_selection agg_selection);
 #endif /* RTE_ETH_BOND_8023AD_H_ */
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad_private.h b/drivers/net/bonding/rte_eth_bond_8023ad_private.h
index d46e44a84..433c7000d 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad_private.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad_private.h
@@ -279,7 +279,7 @@ bond_mode_8023ad_stop(struct rte_eth_dev *dev);
  */
 void
 bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
-	uint8_t slave_id, struct rte_mbuf *pkt);
+				 uint16_t slave_id, struct rte_mbuf *pkt);
 
 /**
  * @internal
@@ -293,7 +293,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
  *  0 on success, negative value otherwise.
  */
 void
-bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint8_t port_id);
+bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint16_t port_id);
 
 /**
  * @internal
@@ -307,7 +307,7 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint8_t port_id);
  *  0 on success, negative value otherwise.
  */
 int
-bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *dev, uint8_t slave_pos);
+bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *dev, uint16_t slave_pos);
 
 /**
  * Updates state when MAC was changed on bonded device or one of its slaves.
@@ -318,12 +318,12 @@ bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev);
 
 int
 bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
-		uint8_t slave_port);
+		uint16_t slave_port);
 
 int
-bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint8_t slave_port);
+bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port);
 
 int
-bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id);
+bond_8023ad_slow_pkt_hw_filter_supported(uint16_t port_id);
 
 #endif /* RTE_ETH_BOND_8023AD_H_ */
diff --git a/drivers/net/bonding/rte_eth_bond_alb.c b/drivers/net/bonding/rte_eth_bond_alb.c
index d9d37495d..f7efbb78e 100644
--- a/drivers/net/bonding/rte_eth_bond_alb.c
+++ b/drivers/net/bonding/rte_eth_bond_alb.c
@@ -148,7 +148,7 @@ void bond_mode_alb_arp_recv(struct ether_hdr *eth_h, uint16_t offset,
 	rte_spinlock_unlock(&internals->mode6.lock);
 }
 
-uint8_t
+uint16_t
 bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 		struct bond_dev_private *internals)
 {
@@ -220,13 +220,13 @@ bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 	return internals->current_primary_port;
 }
 
-uint8_t
+uint16_t
 bond_mode_alb_arp_upd(struct client_data *client_info,
 		struct rte_mbuf *pkt, struct bond_dev_private *internals)
 {
 	struct ether_hdr *eth_h;
 	struct arp_hdr *arp_h;
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 
 	rte_spinlock_lock(&internals->mode6.lock);
 	eth_h = rte_pktmbuf_mtod(pkt, struct ether_hdr *);
diff --git a/drivers/net/bonding/rte_eth_bond_alb.h b/drivers/net/bonding/rte_eth_bond_alb.h
index fd7c3aeb4..9f17f7c85 100644
--- a/drivers/net/bonding/rte_eth_bond_alb.h
+++ b/drivers/net/bonding/rte_eth_bond_alb.h
@@ -51,7 +51,7 @@ struct client_data {
 	uint32_t cli_ip;
 	/**< Client IP address */
 
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 	/**< Index of slave on which we connect with that client */
 	uint8_t in_use;
 	/**< Flag indicating if entry in client table is currently used */
@@ -113,7 +113,7 @@ bond_mode_alb_arp_recv(struct ether_hdr *eth_h, uint16_t offset,
  * @return
  * Index of slave on which packet should be sent.
  */
-uint8_t
+uint16_t
 bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 		struct bond_dev_private *internals);
 
@@ -127,7 +127,7 @@ bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
  * @return
  * Index of slawe on which packet should be sent.
  */
-uint8_t
+uint16_t
 bond_mode_alb_arp_upd(struct client_data *client_info,
 		struct rte_mbuf *pkt, struct bond_dev_private *internals);
 
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index de1d9e0db..529aae34e 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -56,14 +56,14 @@ check_for_bonded_ethdev(const struct rte_eth_dev *eth_dev)
 }
 
 int
-valid_bonded_port_id(uint8_t port_id)
+valid_bonded_port_id(uint16_t port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 	return check_for_bonded_ethdev(&rte_eth_devices[port_id]);
 }
 
 int
-valid_slave_port_id(uint8_t port_id, uint8_t mode)
+valid_slave_port_id(uint16_t port_id, uint8_t mode)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 
@@ -80,7 +80,7 @@ valid_slave_port_id(uint8_t port_id, uint8_t mode)
 }
 
 void
-activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
+activate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id)
 {
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
 	uint8_t active_count = internals->active_slave_count;
@@ -107,11 +107,11 @@ activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
 }
 
 void
-deactivate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
+deactivate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id)
 {
-	uint8_t slave_pos;
+	uint16_t slave_pos;
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
-	uint8_t active_count = internals->active_slave_count;
+	uint16_t active_count = internals->active_slave_count;
 
 	if (internals->mode == BONDING_MODE_8023AD) {
 		bond_mode_8023ad_stop(eth_dev);
@@ -153,7 +153,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
 {
 	struct bond_dev_private *internals;
 	char devargs[52];
-	uint8_t port_id;
+	uint16_t port_id;
 	int ret;
 
 	if (name == NULL) {
@@ -193,7 +193,7 @@ rte_eth_bond_free(const char *name)
 }
 
 static int
-slave_vlan_filter_set(uint8_t bonded_port_id, uint8_t slave_port_id)
+slave_vlan_filter_set(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -233,7 +233,7 @@ slave_vlan_filter_set(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 static int
-__eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
+__eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev, *slave_eth_dev;
 	struct bond_dev_private *internals;
@@ -363,7 +363,7 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -387,7 +387,8 @@ rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 static int
-__eth_bond_slave_remove_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
+__eth_bond_slave_remove_lock_free(uint16_t bonded_port_id,
+				   uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -466,7 +467,7 @@ __eth_bond_slave_remove_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_slave_remove(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -488,7 +489,7 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode)
+rte_eth_bond_mode_set(uint16_t bonded_port_id, uint8_t mode)
 {
 	if (valid_bonded_port_id(bonded_port_id) != 0)
 		return -1;
@@ -497,7 +498,7 @@ rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode)
 }
 
 int
-rte_eth_bond_mode_get(uint8_t bonded_port_id)
+rte_eth_bond_mode_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -510,7 +511,7 @@ rte_eth_bond_mode_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_primary_set(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -531,7 +532,7 @@ rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_primary_get(uint8_t bonded_port_id)
+rte_eth_bond_primary_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -547,7 +548,8 @@ rte_eth_bond_primary_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len)
+rte_eth_bond_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+			uint16_t len)
 {
 	struct bond_dev_private *internals;
 	uint8_t i;
@@ -570,8 +572,8 @@ rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len)
 }
 
 int
-rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
-		uint8_t len)
+rte_eth_bond_active_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+		uint16_t len)
 {
 	struct bond_dev_private *internals;
 
@@ -586,13 +588,14 @@ rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
 	if (internals->active_slave_count > len)
 		return -1;
 
-	memcpy(slaves, internals->active_slaves, internals->active_slave_count);
+	memcpy(slaves, internals->active_slaves,
+	internals->active_slave_count * sizeof(internals->active_slaves[0]));
 
 	return internals->active_slave_count;
 }
 
 int
-rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
+rte_eth_bond_mac_address_set(uint16_t bonded_port_id,
 		struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *bonded_eth_dev;
@@ -618,7 +621,7 @@ rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
 }
 
 int
-rte_eth_bond_mac_address_reset(uint8_t bonded_port_id)
+rte_eth_bond_mac_address_reset(uint16_t bonded_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -647,7 +650,7 @@ rte_eth_bond_mac_address_reset(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy)
+rte_eth_bond_xmit_policy_set(uint16_t bonded_port_id, uint8_t policy)
 {
 	struct bond_dev_private *internals;
 
@@ -677,7 +680,7 @@ rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy)
 }
 
 int
-rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id)
+rte_eth_bond_xmit_policy_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -690,7 +693,7 @@ rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms)
+rte_eth_bond_link_monitoring_set(uint16_t bonded_port_id, uint32_t internal_ms)
 {
 	struct bond_dev_private *internals;
 
@@ -704,7 +707,7 @@ rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms)
 }
 
 int
-rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id)
+rte_eth_bond_link_monitoring_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -717,7 +720,8 @@ rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
+rte_eth_bond_link_down_prop_delay_set(uint16_t bonded_port_id,
+				       uint32_t delay_ms)
 
 {
 	struct bond_dev_private *internals;
@@ -732,7 +736,7 @@ rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
 }
 
 int
-rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id)
+rte_eth_bond_link_down_prop_delay_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -745,7 +749,7 @@ rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
+rte_eth_bond_link_up_prop_delay_set(uint16_t bonded_port_id, uint32_t delay_ms)
 
 {
 	struct bond_dev_private *internals;
@@ -760,7 +764,7 @@ rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
 }
 
 int
-rte_eth_bond_link_up_prop_delay_get(uint8_t bonded_port_id)
+rte_eth_bond_link_up_prop_delay_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c
index bb634c62e..04d1f4e8f 100644
--- a/drivers/net/bonding/rte_eth_bond_args.c
+++ b/drivers/net/bonding/rte_eth_bond_args.c
@@ -153,7 +153,7 @@ bond_ethdev_parse_slave_port_kvarg(const char *key,
 			return -1;
 		} else
 			slave_ports->slaves[slave_ports->slave_count++] =
-					(uint8_t)port_id;
+					port_id;
 	}
 	return 0;
 }
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 3ee70baa0..2d680e3fb 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -174,7 +174,7 @@ const struct rte_flow_attr flow_attr_8023ad = {
 
 int
 bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
-		uint8_t slave_port) {
+		uint16_t slave_port) {
 	struct rte_flow_error error;
 	struct bond_dev_private *internals = (struct bond_dev_private *)
 			(bond_dev->data->dev_private);
@@ -202,12 +202,12 @@ bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
 }
 
 int
-bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id) {
+bond_8023ad_slow_pkt_hw_filter_supported(uint16_t port_id) {
 	struct rte_eth_dev *bond_dev = &rte_eth_devices[port_id];
 	struct bond_dev_private *internals = (struct bond_dev_private *)
 			(bond_dev->data->dev_private);
 	struct rte_eth_dev_info bond_info, slave_info;
-	uint8_t idx;
+	uint16_t idx;
 
 	/* Verify if all slaves in bonding supports flow director and */
 	if (internals->slave_count > 0) {
@@ -230,7 +230,7 @@ bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id) {
 }
 
 int
-bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint8_t slave_port) {
+bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port) {
 
 	struct rte_flow_error error;
 	struct bond_dev_private *internals = (struct bond_dev_private *)
@@ -270,10 +270,10 @@ bond_ethdev_rx_burst_8023ad_fast_queue(void *queue, struct rte_mbuf **bufs,
 	struct bond_rx_queue *bd_rx_q = (struct bond_rx_queue *)queue;
 	struct bond_dev_private *internals = bd_rx_q->dev_private;
 	uint16_t num_rx_total = 0;	/* Total number of received packets */
-	uint8_t slaves[RTE_MAX_ETHPORTS];
-	uint8_t slave_count;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slave_count;
 
-	uint8_t i, idx;
+	uint16_t i, idx;
 
 	/* Copy slave list to protect against slave up/down changes during tx
 	 * bursting */
@@ -302,8 +302,8 @@ bond_ethdev_tx_burst_8023ad_fast_queue(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 	 /* positions in slaves, not ID */
 	uint8_t distributing_offsets[RTE_MAX_ETHPORTS];
 	uint8_t distributing_count;
@@ -394,8 +394,8 @@ bond_ethdev_rx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
 
 	const uint16_t ether_type_slow_be = rte_be_to_cpu_16(ETHER_TYPE_SLOW);
 	uint16_t num_rx_total = 0;	/* Total number of received packets */
-	uint8_t slaves[RTE_MAX_ETHPORTS];
-	uint8_t slave_count, idx;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slave_count, idx;
 
 	uint8_t collecting;  /* current slave collecting status */
 	const uint8_t promisc = internals->promiscuous_en;
@@ -673,8 +673,8 @@ bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs,
 	struct rte_mbuf *slave_bufs[RTE_MAX_ETHPORTS][nb_pkts];
 	uint16_t slave_nb_pkts[RTE_MAX_ETHPORTS] = { 0 };
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t num_tx_total = 0, num_tx_slave;
 
@@ -904,7 +904,7 @@ bandwidth_cmp(const void *a, const void *b)
 }
 
 static void
-bandwidth_left(uint8_t port_id, uint64_t load, uint8_t update_idx,
+bandwidth_left(uint16_t port_id, uint64_t load, uint8_t update_idx,
 		struct bwg_slave *bwg_slave)
 {
 	struct rte_eth_link link_status;
@@ -970,10 +970,10 @@ bond_ethdev_tx_burst_tlb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 	struct rte_eth_dev *primary_port =
 			&rte_eth_devices[internals->primary_port];
 	uint16_t num_tx_total = 0;
-	uint8_t i, j;
+	uint16_t i, j;
 
-	uint8_t num_of_slaves = internals->active_slave_count;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves = internals->active_slave_count;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	struct ether_hdr *ether_hdr;
 	struct ether_addr primary_slave_addr;
@@ -1059,7 +1059,7 @@ bond_ethdev_tx_burst_alb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 
 	uint16_t num_send, num_not_send = 0;
 	uint16_t num_tx_total = 0;
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 
 	int i, j;
 
@@ -1178,8 +1178,8 @@ bond_ethdev_tx_burst_balance(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t num_tx_total = 0, num_tx_slave = 0, tx_fail_total = 0;
 
@@ -1239,8 +1239,8 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 	 /* positions in slaves, not ID */
 	uint8_t distributing_offsets[RTE_MAX_ETHPORTS];
 	uint8_t distributing_count;
@@ -1333,7 +1333,7 @@ bond_ethdev_tx_burst_broadcast(void *queue, struct rte_mbuf **bufs,
 	struct bond_tx_queue *bd_tx_q;
 
 	uint8_t tx_failed_flag = 0, num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t max_nb_of_tx_pkts = 0;
 
@@ -1861,7 +1861,7 @@ slave_add(struct bond_dev_private *internals,
 
 void
 bond_ethdev_primary_set(struct bond_dev_private *internals,
-		uint8_t slave_port_id)
+		uint16_t slave_port_id)
 {
 	int i;
 
@@ -2125,7 +2125,7 @@ static int
 bond_ethdev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 {
 	int res;
-	uint8_t i;
+	uint16_t i;
 	struct bond_dev_private *internals = dev->data->dev_private;
 
 	/* don't do this while a slave is being added */
@@ -2137,7 +2137,7 @@ bond_ethdev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 		rte_bitmap_clear(internals->vlan_filter_bmp, vlan_id);
 
 	for (i = 0; i < internals->slave_count; i++) {
-		uint8_t port_id = internals->slaves[i].port_id;
+		uint16_t port_id = internals->slaves[i].port_id;
 
 		res = rte_eth_dev_vlan_filter(port_id, vlan_id, on);
 		if (res == ENOTSUP)
@@ -2277,7 +2277,7 @@ bond_ethdev_slave_link_status_change_monitor(void *cb_arg)
 static int
 bond_ethdev_link_update(struct rte_eth_dev *ethdev, int wait_to_complete)
 {
-	void (*link_update)(uint8_t port_id, struct rte_eth_link *eth_link);
+	void (*link_update)(uint16_t port_id, struct rte_eth_link *eth_link);
 
 	struct bond_dev_private *bond_ctx;
 	struct rte_eth_link slave_link;
@@ -2466,7 +2466,7 @@ bond_ethdev_delayed_lsc_propagation(void *arg)
 }
 
 int
-bond_ethdev_lsc_event_callback(uint8_t port_id, enum rte_eth_event_type type,
+bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type,
 		void *param, void *ret_param __rte_unused)
 {
 	struct rte_eth_dev *bonded_eth_dev;
@@ -2951,7 +2951,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 	struct bond_dev_private *internals = dev->data->dev_private;
 	struct rte_kvargs *kvlist = internals->kvlist;
 	int arg_count;
-	uint8_t port_id = dev - rte_eth_devices;
+	uint16_t port_id = dev - rte_eth_devices;
 	uint8_t agg_mode;
 
 	static const uint8_t default_rss_key[40] = {
@@ -3086,7 +3086,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 	/* Parse/set primary slave port id*/
 	arg_count = rte_kvargs_count(kvlist, PMD_BOND_PRIMARY_SLAVE_KVARG);
 	if (arg_count == 1) {
-		uint8_t primary_slave_port_id;
+		uint16_t primary_slave_port_id;
 
 		if (rte_kvargs_process(kvlist,
 				PMD_BOND_PRIMARY_SLAVE_KVARG,
@@ -3099,7 +3099,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 		}
 
 		/* Set balance mode transmit policy*/
-		if (rte_eth_bond_primary_set(port_id, (uint8_t)primary_slave_port_id)
+		if (rte_eth_bond_primary_set(port_id, primary_slave_port_id)
 				!= 0) {
 			RTE_LOG(ERR, EAL,
 					"Failed to set primary slave port %d on bonded device %s\n",
diff --git a/drivers/net/bonding/rte_eth_bond_private.h b/drivers/net/bonding/rte_eth_bond_private.h
index 1fe6ff880..1392da98d 100644
--- a/drivers/net/bonding/rte_eth_bond_private.h
+++ b/drivers/net/bonding/rte_eth_bond_private.h
@@ -93,12 +93,12 @@ struct bond_tx_queue {
 
 /** Bonded slave devices structure */
 struct bond_ethdev_slave_ports {
-	uint8_t slaves[RTE_MAX_ETHPORTS];	/**< Slave port id array */
-	uint8_t slave_count;				/**< Number of slaves */
+	uint16_t slaves[RTE_MAX_ETHPORTS];	/**< Slave port id array */
+	uint16_t slave_count;				/**< Number of slaves */
 };
 
 struct bond_slave_details {
-	uint8_t port_id;
+	uint16_t port_id;
 
 	uint8_t link_status_poll_enabled;
 	uint8_t link_status_wait_to_complete;
@@ -114,14 +114,14 @@ typedef uint16_t (*xmit_hash_t)(const struct rte_mbuf *buf, uint8_t slave_count)
 
 /** Link Bonding PMD device private configuration Structure */
 struct bond_dev_private {
-	uint8_t port_id;					/**< Port Id of Bonded Port */
+	uint16_t port_id;			/**< Port Id of Bonded Port */
 	uint8_t mode;						/**< Link Bonding Mode */
 
 	rte_spinlock_t lock;
 
-	uint8_t primary_port;				/**< Primary Slave Port */
-	uint8_t current_primary_port;		/**< Primary Slave Port */
-	uint8_t user_defined_primary_port;
+	uint16_t primary_port;			/**< Primary Slave Port */
+	uint16_t current_primary_port;		/**< Primary Slave Port */
+	uint16_t user_defined_primary_port;
 	/**< Flag for whether primary port is user defined or not */
 
 	uint8_t balance_xmit_policy;
@@ -144,16 +144,17 @@ struct bond_dev_private {
 	uint16_t nb_rx_queues;			/**< Total number of rx queues */
 	uint16_t nb_tx_queues;			/**< Total number of tx queues*/
 
-	uint8_t active_slave;		/**< Next active_slave to poll */
-	uint8_t active_slave_count;		/**< Number of active slaves */
-	uint8_t active_slaves[RTE_MAX_ETHPORTS];	/**< Active slave list */
+	uint16_t active_slave;		/**< Next active_slave to poll */
+	uint16_t active_slave_count;		/**< Number of active slaves */
+	uint16_t active_slaves[RTE_MAX_ETHPORTS];    /**< Active slave list */
 
-	uint8_t slave_count;			/**< Number of bonded slaves */
+	uint16_t slave_count;			/**< Number of bonded slaves */
 	struct bond_slave_details slaves[RTE_MAX_ETHPORTS];
 	/**< Arary of bonded slaves details */
 
 	struct mode8023ad_private mode4;
-	uint8_t tlb_slaves_order[RTE_MAX_ETHPORTS]; /* TLB active slaves send order */
+	uint16_t tlb_slaves_order[RTE_MAX_ETHPORTS];
+	/**< TLB active slaves send order */
 	struct mode_alb_private mode6;
 
 	uint32_t rx_offload_capa;            /** Rx offload capability */
@@ -186,10 +187,10 @@ check_for_bonded_ethdev(const struct rte_eth_dev *eth_dev);
 
 /* Search given slave array to find position of given id.
  * Return slave pos or slaves_count if not found. */
-static inline uint8_t
-find_slave_by_id(uint8_t *slaves, uint8_t slaves_count, uint8_t slave_id) {
+static inline uint16_t
+find_slave_by_id(uint16_t *slaves, uint16_t slaves_count, uint16_t slave_id) {
 
-	uint8_t pos;
+	uint16_t pos;
 	for (pos = 0; pos < slaves_count; pos++) {
 		if (slave_id == slaves[pos])
 			break;
@@ -199,19 +200,19 @@ find_slave_by_id(uint8_t *slaves, uint8_t slaves_count, uint8_t slave_id) {
 }
 
 int
-valid_port_id(uint8_t port_id);
+valid_port_id(uint16_t port_id);
 
 int
-valid_bonded_port_id(uint8_t port_id);
+valid_bonded_port_id(uint16_t port_id);
 
 int
-valid_slave_port_id(uint8_t port_id, uint8_t mode);
+valid_slave_port_id(uint16_t port_id, uint8_t mode);
 
 void
-deactivate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id);
+deactivate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id);
 
 void
-activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id);
+activate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id);
 
 void
 link_properties_set(struct rte_eth_dev *bonded_eth_dev,
@@ -255,10 +256,10 @@ xmit_l34_hash(const struct rte_mbuf *buf, uint8_t slave_count);
 
 void
 bond_ethdev_primary_set(struct bond_dev_private *internals,
-		uint8_t slave_port_id);
+		uint16_t slave_port_id);
 
 int
-bond_ethdev_lsc_event_callback(uint8_t port_id, enum rte_eth_event_type type,
+bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type,
 		void *param, void *ret_param);
 
 int
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index 3d4ab9368..a59947d78 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -1624,7 +1624,7 @@ eth_em_interrupt_action(struct rte_eth_dev *dev,
 	rte_em_dev_atomic_read_link_status(dev, &link);
 	if (link.link_status) {
 		PMD_INIT_LOG(INFO, " Port %d: Link Up - speed %u Mbps - %s",
-			     dev->data->port_id, (unsigned)link.link_speed,
+			     dev->data->port_id, link.link_speed,
 			     link.link_duplex == ETH_LINK_FULL_DUPLEX ?
 			     "full-duplex" : "half-duplex");
 	} else {
diff --git a/drivers/net/e1000/em_rxtx.c b/drivers/net/e1000/em_rxtx.c
index 31819c5bd..06ba68e39 100644
--- a/drivers/net/e1000/em_rxtx.c
+++ b/drivers/net/e1000/em_rxtx.c
@@ -119,7 +119,7 @@ struct em_rx_queue {
 	uint16_t            nb_rx_hold; /**< number of held free RX desc. */
 	uint16_t            rx_free_thresh; /**< max free RX desc to hold. */
 	uint16_t            queue_id;   /**< RX queue index. */
-	uint8_t             port_id;    /**< Device port identifier. */
+	uint16_t            port_id;    /**< Device port identifier. */
 	uint8_t             pthresh;    /**< Prefetch threshold register. */
 	uint8_t             hthresh;    /**< Host threshold register. */
 	uint8_t             wthresh;    /**< Write-back threshold register. */
@@ -186,7 +186,7 @@ struct em_tx_queue {
 	/** Total number of TX descriptors ready to be allocated. */
 	uint16_t               nb_tx_free;
 	uint16_t               queue_id; /**< TX queue index. */
-	uint8_t                port_id;  /**< Device port identifier. */
+	uint16_t               port_id;  /**< Device port identifier. */
 	uint8_t                pthresh;  /**< Prefetch threshold register. */
 	uint8_t                hthresh;  /**< Host threshold register. */
 	uint8_t                wthresh;  /**< Write-back threshold register. */
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index 1c80a2a1b..a800d9c2b 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -122,7 +122,7 @@ struct igb_rx_queue {
 	uint16_t            rx_free_thresh; /**< max free RX desc to hold. */
 	uint16_t            queue_id;   /**< RX queue index. */
 	uint16_t            reg_idx;    /**< RX queue register index. */
-	uint8_t             port_id;    /**< Device port identifier. */
+	uint16_t            port_id;    /**< Device port identifier. */
 	uint8_t             pthresh;    /**< Prefetch threshold register. */
 	uint8_t             hthresh;    /**< Host threshold register. */
 	uint8_t             wthresh;    /**< Write-back threshold register. */
@@ -191,7 +191,7 @@ struct igb_tx_queue {
 	/**< Index of first used TX descriptor. */
 	uint16_t               queue_id; /**< TX queue index. */
 	uint16_t               reg_idx;  /**< TX queue register index. */
-	uint8_t                port_id;  /**< Device port identifier. */
+	uint16_t               port_id;  /**< Device port identifier. */
 	uint8_t                pthresh;  /**< Prefetch threshold register. */
 	uint8_t                hthresh;  /**< Host threshold register. */
 	uint8_t                wthresh;  /**< Write-back threshold register. */
diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c
index a3a8cce95..1c8a9337e 100644
--- a/drivers/net/failsafe/failsafe_ether.c
+++ b/drivers/net/failsafe/failsafe_ether.c
@@ -400,7 +400,7 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)
 }
 
 int
-failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused,
+failsafe_eth_rmv_event_callback(uint16_t port_id __rte_unused,
 				enum rte_eth_event_type event __rte_unused,
 				void *cb_arg, void *out __rte_unused)
 {
@@ -419,7 +419,7 @@ failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused,
 }
 
 int
-failsafe_eth_lsc_event_callback(uint8_t port_id __rte_unused,
+failsafe_eth_lsc_event_callback(uint16_t port_id __rte_unused,
 				enum rte_eth_event_type event __rte_unused,
 				void *cb_arg, void *out __rte_unused)
 {
diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h
index 0361cf434..4ae6e6c5f 100644
--- a/drivers/net/failsafe/failsafe_private.h
+++ b/drivers/net/failsafe/failsafe_private.h
@@ -180,10 +180,10 @@ int failsafe_eal_uninit(struct rte_eth_dev *dev);
 
 int failsafe_eth_dev_state_sync(struct rte_eth_dev *dev);
 void failsafe_dev_remove(struct rte_eth_dev *dev);
-int failsafe_eth_rmv_event_callback(uint8_t port_id,
+int failsafe_eth_rmv_event_callback(uint16_t port_id,
 				    enum rte_eth_event_type type,
 				    void *arg, void *out);
-int failsafe_eth_lsc_event_callback(uint8_t port_id,
+int failsafe_eth_lsc_event_callback(uint16_t port_id,
 				    enum rte_eth_event_type event,
 				    void *cb_arg, void *out);
 
diff --git a/drivers/net/fm10k/fm10k.h b/drivers/net/fm10k/fm10k.h
index 8e1a95062..060982b10 100644
--- a/drivers/net/fm10k/fm10k.h
+++ b/drivers/net/fm10k/fm10k.h
@@ -204,7 +204,7 @@ struct fm10k_rx_queue {
 	uint16_t rxrearm_nb;     /* number of remaining to be re-armed */
 	uint16_t rxrearm_start;  /* the idx we start the re-arming from */
 	uint16_t rx_using_sse; /* indicates that vector RX is in use */
-	uint8_t port_id;
+	uint16_t port_id;
 	uint8_t drop_en;
 	uint8_t rx_deferred_start; /* don't start this queue in dev start. */
 	uint16_t rx_ftag_en; /* indicates FTAG RX supported */
@@ -241,7 +241,7 @@ struct fm10k_tx_queue {
 	volatile uint32_t *tail_ptr;
 	uint32_t txq_flags; /* Holds flags for this TXq */
 	uint16_t nb_desc;
-	uint8_t port_id;
+	uint16_t port_id;
 	uint8_t tx_deferred_start; /** don't start this queue in dev start. */
 	uint16_t queue_id;
 	uint16_t tx_ftag_en; /* indicates FTAG TX supported */
@@ -289,7 +289,7 @@ static inline uint16_t fifo_remove(struct fifo *fifo)
 }
 
 static inline void
-fm10k_pktmbuf_reset(struct rte_mbuf *mb, uint8_t in_port)
+fm10k_pktmbuf_reset(struct rte_mbuf *mb, uint16_t in_port)
 {
 	rte_mbuf_refcnt_set(mb, 1);
 	mb->next = NULL;
diff --git a/drivers/net/i40e/Makefile b/drivers/net/i40e/Makefile
index 55c79a60a..1290d7f32 100644
--- a/drivers/net/i40e/Makefile
+++ b/drivers/net/i40e/Makefile
@@ -42,7 +42,7 @@ CFLAGS += -DX722_A0_SUPPORT
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # Add extra flags for base driver files (also known as shared code)
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index f12aefa5d..c4c6aec1d 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -1920,8 +1920,9 @@ i40e_dev_start(struct rte_eth_dev *dev)
 	hw->adapter_stopped = 0;
 
 	if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
-		PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; autonegotiation disabled",
-			     dev->data->port_id);
+		PMD_INIT_LOG(ERR,
+		"Invalid link_speeds for port %u, autonegotiation disabled",
+			      dev->data->port_id);
 		return -EINVAL;
 	}
 
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index 20084d649..ff2ab8575 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -121,7 +121,7 @@ struct i40e_rx_queue {
 	uint16_t rxrearm_start;	/**< the idx we start the re-arming from */
 	uint64_t mbuf_initializer; /**< value to init mbufs */
 
-	uint8_t port_id; /**< device port ID */
+	uint16_t port_id; /**< device port ID */
 	uint8_t crc_len; /**< 0 if CRC stripped, 4 otherwise */
 	uint16_t queue_id; /**< RX queue index */
 	uint16_t reg_idx; /**< RX queue register index */
@@ -167,7 +167,7 @@ struct i40e_tx_queue {
 	uint8_t pthresh; /**< Prefetch threshold register. */
 	uint8_t hthresh; /**< Host threshold register. */
 	uint8_t wthresh; /**< Write-back threshold reg. */
-	uint8_t port_id; /**< Device port identifier. */
+	uint16_t port_id; /**< Device port identifier. */
 	uint16_t queue_id; /**< TX queue index. */
 	uint16_t reg_idx;
 	uint32_t txq_flags;
diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index f12b7f4a1..3728d39b9 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -41,7 +41,7 @@
 #include "rte_pmd_i40e.h"
 
 int
-rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf)
+rte_pmd_i40e_ping_vfs(uint16_t port, uint16_t vf)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -66,7 +66,7 @@ rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf)
 }
 
 int
-rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -170,7 +170,7 @@ i40e_add_rm_all_vlan_filter(struct i40e_vsi *vsi, uint8_t add)
 }
 
 int
-rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -430,7 +430,7 @@ i40e_vsi_set_tx_loopback(struct i40e_vsi *vsi, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_tx_loopback(uint8_t port, uint8_t on)
+rte_pmd_i40e_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -473,7 +473,7 @@ rte_pmd_i40e_set_tx_loopback(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_unicast_promisc(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -514,7 +514,7 @@ rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_multicast_promisc(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -555,7 +555,7 @@ rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_mac_addr(uint16_t port, uint16_t vf_id,
 			     struct ether_addr *mac_addr)
 {
 	struct i40e_mac_filter *f;
@@ -598,7 +598,7 @@ rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
 
 /* Set vlan strip on/off for specific VF from host */
 int
-rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_vlan_stripq(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -633,7 +633,7 @@ rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf_id, uint8_t on)
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_vlan_insert(uint16_t port, uint16_t vf_id,
 				    uint16_t vlan_id)
 {
 	struct rte_eth_dev *dev;
@@ -698,7 +698,7 @@ int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_broadcast(uint16_t port, uint16_t vf_id,
 				  uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -764,7 +764,7 @@ int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on)
+int rte_pmd_i40e_set_vf_vlan_tag(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -858,7 +858,7 @@ i40e_vlan_filter_count(struct i40e_vsi *vsi)
 	return count;
 }
 
-int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
+int rte_pmd_i40e_set_vf_vlan_filter(uint16_t port, uint16_t vlan_id,
 				    uint64_t vf_mask, uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -941,7 +941,7 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
 }
 
 int
-rte_pmd_i40e_get_vf_stats(uint8_t port,
+rte_pmd_i40e_get_vf_stats(uint16_t port,
 			  uint16_t vf_id,
 			  struct rte_eth_stats *stats)
 {
@@ -986,7 +986,7 @@ rte_pmd_i40e_get_vf_stats(uint8_t port,
 }
 
 int
-rte_pmd_i40e_reset_vf_stats(uint8_t port,
+rte_pmd_i40e_reset_vf_stats(uint16_t port,
 			    uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -1020,7 +1020,7 @@ rte_pmd_i40e_reset_vf_stats(uint8_t port,
 }
 
 int
-rte_pmd_i40e_set_vf_max_bw(uint8_t port, uint16_t vf_id, uint32_t bw)
+rte_pmd_i40e_set_vf_max_bw(uint16_t port, uint16_t vf_id, uint32_t bw)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -1109,7 +1109,7 @@ rte_pmd_i40e_set_vf_max_bw(uint8_t port, uint16_t vf_id, uint32_t bw)
 }
 
 int
-rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_tc_bw_alloc(uint16_t port, uint16_t vf_id,
 				uint8_t tc_num, uint8_t *bw_weight)
 {
 	struct rte_eth_dev *dev;
@@ -1223,7 +1223,7 @@ rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port, uint16_t vf_id,
 }
 
 int
-rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_tc_max_bw(uint16_t port, uint16_t vf_id,
 			      uint8_t tc_no, uint32_t bw)
 {
 	struct rte_eth_dev *dev;
@@ -1341,7 +1341,7 @@ rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port, uint16_t vf_id,
 }
 
 int
-rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map)
+rte_pmd_i40e_set_tc_strict_prio(uint16_t port, uint8_t tc_map)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -1513,7 +1513,7 @@ i40e_add_rm_profile_info(struct i40e_hw *hw, uint8_t *profile_info_sec)
 
 /* Check if the profile info exists */
 static int
-i40e_check_profile_info(uint8_t port, uint8_t *profile_info_sec)
+i40e_check_profile_info(uint16_t port, uint8_t *profile_info_sec)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1557,7 +1557,7 @@ i40e_check_profile_info(uint8_t port, uint8_t *profile_info_sec)
 }
 
 int
-rte_pmd_i40e_process_ddp_package(uint8_t port, uint8_t *buff,
+rte_pmd_i40e_process_ddp_package(uint16_t port, uint8_t *buff,
 				 uint32_t size,
 				 enum rte_pmd_i40e_package_op op)
 {
@@ -1863,7 +1863,7 @@ int rte_pmd_i40e_get_ddp_info(uint8_t *pkg_buff, uint32_t pkg_size,
 }
 
 int
-rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size)
+rte_pmd_i40e_get_ddp_list(uint16_t port, uint8_t *buff, uint32_t size)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_hw *hw;
@@ -1991,7 +1991,7 @@ static int check_invalid_ptype_mapping(
 
 int
 rte_pmd_i40e_ptype_mapping_update(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t count,
 			uint8_t exclusive)
@@ -2027,7 +2027,7 @@ rte_pmd_i40e_ptype_mapping_update(
 	return 0;
 }
 
-int rte_pmd_i40e_ptype_mapping_reset(uint8_t port)
+int rte_pmd_i40e_ptype_mapping_reset(uint16_t port)
 {
 	struct rte_eth_dev *dev;
 
@@ -2044,7 +2044,7 @@ int rte_pmd_i40e_ptype_mapping_reset(uint8_t port)
 }
 
 int rte_pmd_i40e_ptype_mapping_get(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t size,
 			uint16_t *count,
@@ -2078,7 +2078,7 @@ int rte_pmd_i40e_ptype_mapping_get(
 	return 0;
 }
 
-int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
+int rte_pmd_i40e_ptype_mapping_replace(uint16_t port,
 				       uint32_t target,
 				       uint8_t mask,
 				       uint32_t pkt_type)
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 356fa89d7..7f32a59b1 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -157,7 +157,7 @@ struct rte_pmd_i40e_ptype_mapping {
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* invalid.
  */
-int rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf);
+int rte_pmd_i40e_ping_vfs(uint16_t port, uint16_t vf);
 
 /**
  * Enable/Disable VF MAC anti spoofing.
@@ -174,7 +174,7 @@ int rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port,
+int rte_pmd_i40e_set_vf_mac_anti_spoof(uint16_t port,
 				       uint16_t vf_id,
 				       uint8_t on);
 
@@ -193,7 +193,7 @@ int rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port,
+int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port,
 					uint16_t vf_id,
 					uint8_t on);
 
@@ -210,7 +210,7 @@ int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_tx_loopback(uint8_t port,
+int rte_pmd_i40e_set_tx_loopback(uint16_t port,
 				 uint8_t on);
 
 /**
@@ -228,7 +228,7 @@ int rte_pmd_i40e_set_tx_loopback(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port,
+int rte_pmd_i40e_set_vf_unicast_promisc(uint16_t port,
 					uint16_t vf_id,
 					uint8_t on);
 
@@ -247,7 +247,7 @@ int rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port,
+int rte_pmd_i40e_set_vf_multicast_promisc(uint16_t port,
 					  uint16_t vf_id,
 					  uint8_t on);
 
@@ -271,7 +271,7 @@ int rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_mac_addr(uint16_t port, uint16_t vf_id,
 				 struct ether_addr *mac_addr);
 
 /**
@@ -291,7 +291,7 @@ int rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_i40e_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -309,7 +309,7 @@ rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_vlan_insert(uint16_t port, uint16_t vf_id,
 				    uint16_t vlan_id);
 
 /**
@@ -328,7 +328,7 @@ int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_broadcast(uint16_t port, uint16_t vf_id,
 				  uint8_t on);
 
 /**
@@ -347,7 +347,7 @@ int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on);
+int rte_pmd_i40e_set_vf_vlan_tag(uint16_t port, uint16_t vf_id, uint8_t on);
 
 /**
  * Enable/Disable VF VLAN filter
@@ -368,7 +368,7 @@ int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
+int rte_pmd_i40e_set_vf_vlan_filter(uint16_t port, uint16_t vlan_id,
 				    uint64_t vf_mask, uint8_t on);
 
 /**
@@ -393,7 +393,7 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_i40e_get_vf_stats(uint8_t port,
+int rte_pmd_i40e_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats);
 
@@ -409,7 +409,7 @@ int rte_pmd_i40e_get_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_reset_vf_stats(uint8_t port,
+int rte_pmd_i40e_reset_vf_stats(uint16_t port,
 				uint16_t vf_id);
 
 /**
@@ -434,7 +434,7 @@ int rte_pmd_i40e_reset_vf_stats(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_max_bw(uint8_t port,
+int rte_pmd_i40e_set_vf_max_bw(uint16_t port,
 			       uint16_t vf_id,
 			       uint32_t bw);
 
@@ -459,7 +459,7 @@ int rte_pmd_i40e_set_vf_max_bw(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port,
+int rte_pmd_i40e_set_vf_tc_bw_alloc(uint16_t port,
 				    uint16_t vf_id,
 				    uint8_t tc_num,
 				    uint8_t *bw_weight);
@@ -484,7 +484,7 @@ int rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port,
+int rte_pmd_i40e_set_vf_tc_max_bw(uint16_t port,
 				  uint16_t vf_id,
 				  uint8_t tc_no,
 				  uint32_t bw);
@@ -502,7 +502,7 @@ int rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map);
+int rte_pmd_i40e_set_tc_strict_prio(uint16_t port, uint8_t tc_map);
 
 /**
  * Load/Unload a ddp package
@@ -523,7 +523,7 @@ int rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map);
  *   - (-EACCES) if profile does not exist.
  *   - (-ENOTSUP) if operation not supported.
  */
-int rte_pmd_i40e_process_ddp_package(uint8_t port, uint8_t *buff,
+int rte_pmd_i40e_process_ddp_package(uint16_t port, uint8_t *buff,
 				     uint32_t size,
 				     enum rte_pmd_i40e_package_op op);
 
@@ -561,7 +561,7 @@ int rte_pmd_i40e_get_ddp_info(uint8_t *pkg, uint32_t pkg_size,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size);
+int rte_pmd_i40e_get_ddp_list(uint16_t port, uint8_t *buff, uint32_t size);
 
 /**
  * Update hardware defined ptype to software defined packet type
@@ -581,7 +581,7 @@ int rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size);
  *	set other PTYPEs maps to PTYPE_UNKNOWN.
  */
 int rte_pmd_i40e_ptype_mapping_update(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t count,
 			uint8_t exclusive);
@@ -593,7 +593,7 @@ int rte_pmd_i40e_ptype_mapping_update(
  * @param port
  *    pointer to port identifier of the device
  */
-int rte_pmd_i40e_ptype_mapping_reset(uint8_t port);
+int rte_pmd_i40e_ptype_mapping_reset(uint16_t port);
 
 /**
  * Get hardware defined ptype to software defined ptype
@@ -612,7 +612,7 @@ int rte_pmd_i40e_ptype_mapping_reset(uint8_t port);
  *    -(!0) only return mapping items which packet_type != RTE_PTYPE_UNKNOWN.
  */
 int rte_pmd_i40e_ptype_mapping_get(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t size,
 			uint16_t *count,
@@ -632,7 +632,7 @@ int rte_pmd_i40e_ptype_mapping_get(
  * @param pkt_type
  *    the new packet type to overwrite
  */
-int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
+int rte_pmd_i40e_ptype_mapping_replace(uint16_t port,
 				       uint32_t target,
 				       uint8_t mask,
 				       uint32_t pkt_type);
diff --git a/drivers/net/ixgbe/Makefile b/drivers/net/ixgbe/Makefile
index 5e57cb353..18ad4feca 100644
--- a/drivers/net/ixgbe/Makefile
+++ b/drivers/net/ixgbe/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 9ca5cbcd3..d873c409f 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2508,8 +2508,9 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	*    - fixed speed: TODO implement
 	*/
 	if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
-		PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; fix speed not supported",
-			     dev->data->port_id);
+		PMD_INIT_LOG(ERR,
+		"Invalid link_speeds for port %u, fix speed not supported",
+				dev->data->port_id);
 		return -EINVAL;
 	}
 
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.h b/drivers/net/ixgbe/ixgbe_rxtx.h
index 85feb0bdc..81c527fad 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.h
+++ b/drivers/net/ixgbe/ixgbe_rxtx.h
@@ -148,7 +148,7 @@ struct ixgbe_rx_queue {
 	uint16_t            queue_id; /**< RX queue index. */
 	uint16_t            reg_idx;  /**< RX queue register index. */
 	uint16_t            pkt_type_mask;  /**< Packet type mask for different NICs. */
-	uint8_t             port_id;  /**< Device port identifier. */
+	uint16_t            port_id;  /**< Device port identifier. */
 	uint8_t             crc_len;  /**< 0 if CRC stripped, 4 otherwise. */
 	uint8_t             drop_en;  /**< If not 0, set SRRCTL.Drop_En. */
 	uint8_t             rx_deferred_start; /**< not in global dev start. */
@@ -237,7 +237,7 @@ struct ixgbe_tx_queue {
 	uint16_t tx_next_rs; /**< next desc to set RS bit */
 	uint16_t            queue_id;      /**< TX queue index. */
 	uint16_t            reg_idx;       /**< TX queue register index. */
-	uint8_t             port_id;       /**< Device port identifier. */
+	uint16_t            port_id;       /**< Device port identifier. */
 	uint8_t             pthresh;       /**< Prefetch threshold register. */
 	uint8_t             hthresh;       /**< Host threshold register. */
 	uint8_t             wthresh;       /**< Write-back threshold reg. */
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
index 79897ff64..f12737857 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
@@ -38,7 +38,7 @@
 #include "rte_pmd_ixgbe.h"
 
 int
-rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_mac_addr(uint16_t port, uint16_t vf,
 			      struct ether_addr *mac_addr)
 {
 	struct ixgbe_hw *hw;
@@ -73,7 +73,7 @@ rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf)
+rte_pmd_ixgbe_ping_vf(uint16_t port, uint16_t vf)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_vf_info *vfinfo;
@@ -105,7 +105,7 @@ rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_mac_info *mac;
@@ -135,7 +135,7 @@ rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_mac_info *mac;
@@ -164,7 +164,7 @@ rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint16_t vlan_id)
+rte_pmd_ixgbe_set_vf_vlan_insert(uint16_t port, uint16_t vf, uint16_t vlan_id)
 {
 	struct ixgbe_hw *hw;
 	uint32_t ctrl;
@@ -200,7 +200,7 @@ rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint16_t vlan_id)
 }
 
 int
-rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on)
+rte_pmd_ixgbe_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t ctrl;
@@ -230,7 +230,7 @@ rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on)
+rte_pmd_ixgbe_set_all_queues_drop_en(uint16_t port, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t reg_value;
@@ -260,7 +260,7 @@ rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_split_drop_en(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t reg_value;
@@ -295,7 +295,7 @@ rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -342,7 +342,7 @@ rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_rxmode(uint16_t port, uint16_t vf,
 			    uint16_t rx_mask, uint8_t on)
 {
 	int val = 0;
@@ -389,7 +389,7 @@ rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_rx(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -439,7 +439,7 @@ rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_tx(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -489,7 +489,7 @@ rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+rte_pmd_ixgbe_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				 uint64_t vf_mask, uint8_t vlan_on)
 {
 	struct rte_eth_dev *dev;
@@ -524,7 +524,7 @@ rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
 }
 
 int
-rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk)
 {
 	struct rte_eth_dev *dev;
@@ -540,7 +540,7 @@ rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp)
+rte_pmd_ixgbe_macsec_enable(uint16_t port, uint8_t en, uint8_t rp)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -623,7 +623,7 @@ rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp)
 }
 
 int
-rte_pmd_ixgbe_macsec_disable(uint8_t port)
+rte_pmd_ixgbe_macsec_disable(uint16_t port)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -687,7 +687,7 @@ rte_pmd_ixgbe_macsec_disable(uint8_t port)
 }
 
 int
-rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac)
+rte_pmd_ixgbe_macsec_config_txsc(uint16_t port, uint8_t *mac)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -712,7 +712,7 @@ rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac)
 }
 
 int
-rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi)
+rte_pmd_ixgbe_macsec_config_rxsc(uint16_t port, uint8_t *mac, uint16_t pi)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -738,7 +738,7 @@ rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi)
 }
 
 int
-rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
+rte_pmd_ixgbe_macsec_select_txsa(uint16_t port, uint8_t idx, uint8_t an,
 				 uint32_t pn, uint8_t *key)
 {
 	struct ixgbe_hw *hw;
@@ -794,7 +794,7 @@ rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
 }
 
 int
-rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
+rte_pmd_ixgbe_macsec_select_rxsa(uint16_t port, uint8_t idx, uint8_t an,
 				 uint32_t pn, uint8_t *key)
 {
 	struct ixgbe_hw *hw;
@@ -837,7 +837,7 @@ rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
 }
 
 int
-rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
+rte_pmd_ixgbe_set_tc_bw_alloc(uint16_t port,
 			      uint8_t tc_num,
 			      uint8_t *bw_weight)
 {
@@ -911,7 +911,7 @@ rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
 
 #ifdef RTE_LIBRTE_IXGBE_BYPASS
 int
-rte_pmd_ixgbe_bypass_init(uint8_t port_id)
+rte_pmd_ixgbe_bypass_init(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -926,7 +926,7 @@ rte_pmd_ixgbe_bypass_init(uint8_t port_id)
 }
 
 int
-rte_pmd_ixgbe_bypass_state_show(uint8_t port_id, uint32_t *state)
+rte_pmd_ixgbe_bypass_state_show(uint16_t port_id, uint32_t *state)
 {
 	struct rte_eth_dev *dev;
 
@@ -940,7 +940,7 @@ rte_pmd_ixgbe_bypass_state_show(uint8_t port_id, uint32_t *state)
 }
 
 int
-rte_pmd_ixgbe_bypass_state_set(uint8_t port_id, uint32_t *new_state)
+rte_pmd_ixgbe_bypass_state_set(uint16_t port_id, uint32_t *new_state)
 {
 	struct rte_eth_dev *dev;
 
@@ -954,7 +954,7 @@ rte_pmd_ixgbe_bypass_state_set(uint8_t port_id, uint32_t *new_state)
 }
 
 int
-rte_pmd_ixgbe_bypass_event_show(uint8_t port_id,
+rte_pmd_ixgbe_bypass_event_show(uint16_t port_id,
 				uint32_t event,
 				uint32_t *state)
 {
@@ -970,7 +970,7 @@ rte_pmd_ixgbe_bypass_event_show(uint8_t port_id,
 }
 
 int
-rte_pmd_ixgbe_bypass_event_store(uint8_t port_id,
+rte_pmd_ixgbe_bypass_event_store(uint16_t port_id,
 				 uint32_t event,
 				 uint32_t state)
 {
@@ -986,7 +986,7 @@ rte_pmd_ixgbe_bypass_event_store(uint8_t port_id,
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port_id, uint32_t timeout)
+rte_pmd_ixgbe_bypass_wd_timeout_store(uint16_t port_id, uint32_t timeout)
 {
 	struct rte_eth_dev *dev;
 
@@ -1000,7 +1000,7 @@ rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port_id, uint32_t timeout)
 }
 
 int
-rte_pmd_ixgbe_bypass_ver_show(uint8_t port_id, uint32_t *ver)
+rte_pmd_ixgbe_bypass_ver_show(uint16_t port_id, uint32_t *ver)
 {
 	struct rte_eth_dev *dev;
 
@@ -1014,7 +1014,7 @@ rte_pmd_ixgbe_bypass_ver_show(uint8_t port_id, uint32_t *ver)
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port_id, uint32_t *wd_timeout)
+rte_pmd_ixgbe_bypass_wd_timeout_show(uint16_t port_id, uint32_t *wd_timeout)
 {
 	struct rte_eth_dev *dev;
 
@@ -1028,7 +1028,7 @@ rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port_id, uint32_t *wd_timeout)
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_reset(uint8_t port_id)
+rte_pmd_ixgbe_bypass_wd_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
index d33c285db..81b18f876 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
@@ -53,7 +53,7 @@
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* invalid.
  */
-int rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf);
+int rte_pmd_ixgbe_ping_vf(uint16_t port, uint16_t vf);
 
 /**
  * Set the VF MAC address.
@@ -69,7 +69,7 @@ int rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_ixgbe_set_vf_mac_addr(uint16_t port, uint16_t vf,
 		struct ether_addr *mac_addr);
 
 /**
@@ -87,7 +87,8 @@ int rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf,
+					 uint8_t on);
 
 /**
  * Enable/Disable VF MAC anti spoofing.
@@ -104,7 +105,7 @@ int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -122,7 +123,7 @@ int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+int rte_pmd_ixgbe_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id);
 
 /**
@@ -139,7 +140,7 @@ int rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on);
+int rte_pmd_ixgbe_set_tx_loopback(uint16_t port, uint8_t on);
 
 /**
  * set all queues drop enable bit
@@ -155,7 +156,7 @@ int rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on);
+int rte_pmd_ixgbe_set_all_queues_drop_en(uint16_t port, uint8_t on);
 
 /**
  * set drop enable bit in the VF split rx control register
@@ -174,7 +175,7 @@ int rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_split_drop_en(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan strip for all queues in a pool
@@ -194,7 +195,7 @@ int rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable MACsec offload.
@@ -212,7 +213,7 @@ rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp);
+int rte_pmd_ixgbe_macsec_enable(uint16_t port, uint8_t en, uint8_t rp);
 
 /**
  * Disable MACsec offload.
@@ -224,7 +225,7 @@ int rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_disable(uint8_t port);
+int rte_pmd_ixgbe_macsec_disable(uint16_t port);
 
 /**
  * Configure Tx SC (Secure Connection).
@@ -238,7 +239,7 @@ int rte_pmd_ixgbe_macsec_disable(uint8_t port);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac);
+int rte_pmd_ixgbe_macsec_config_txsc(uint16_t port, uint8_t *mac);
 
 /**
  * Configure Rx SC (Secure Connection).
@@ -254,7 +255,7 @@ int rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi);
+int rte_pmd_ixgbe_macsec_config_rxsc(uint16_t port, uint8_t *mac, uint16_t pi);
 
 /**
  * Enable Tx SA (Secure Association).
@@ -275,7 +276,7 @@ int rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi);
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
+int rte_pmd_ixgbe_macsec_select_txsa(uint16_t port, uint8_t idx, uint8_t an,
 		uint32_t pn, uint8_t *key);
 
 /**
@@ -297,7 +298,7 @@ int rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
+int rte_pmd_ixgbe_macsec_select_rxsa(uint16_t port, uint8_t idx, uint8_t an,
 		uint32_t pn, uint8_t *key);
 
 /**
@@ -323,7 +324,8 @@ int rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf, uint16_t rx_mask, uint8_t on);
+rte_pmd_ixgbe_set_vf_rxmode(uint16_t port, uint16_t vf, uint16_t rx_mask,
+			     uint8_t on);
 
 /**
 * Enable or disable a VF traffic receive of an Ethernet device.
@@ -342,7 +344,7 @@ rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf, uint16_t rx_mask, uint8_t
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_rx(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
 * Enable or disable a VF traffic transmit of the Ethernet device.
@@ -361,7 +363,7 @@ rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on);
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_tx(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
 * Enable/Disable hardware VF VLAN filtering by an Ethernet device of
@@ -383,7 +385,8 @@ rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on);
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan, uint64_t vf_mask, uint8_t vlan_on);
+rte_pmd_ixgbe_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
+				 uint64_t vf_mask, uint8_t vlan_on);
 
 /**
  * Set the rate limitation for a vf on an Ethernet device.
@@ -402,7 +405,8 @@ rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan, uint64_t vf_mask,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf, uint16_t tx_rate, uint64_t q_msk);
+int rte_pmd_ixgbe_set_vf_rate_limit(uint16_t port, uint16_t vf,
+				     uint16_t tx_rate, uint64_t q_msk);
 
 /**
  * Set all the TCs' bandwidth weight.
@@ -423,7 +427,7 @@ int rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf, uint16_t tx_rate,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
+int rte_pmd_ixgbe_set_tc_bw_alloc(uint16_t port,
 				  uint8_t tc_num,
 				  uint8_t *bw_weight);
 
@@ -439,7 +443,7 @@ int rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_init(uint8_t port);
+int rte_pmd_ixgbe_bypass_init(uint16_t port);
 
 /**
  * Return bypass state.
@@ -456,7 +460,7 @@ int rte_pmd_ixgbe_bypass_init(uint8_t port);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_state_show(uint8_t port, uint32_t *state);
+int rte_pmd_ixgbe_bypass_state_show(uint16_t port, uint32_t *state);
 
 /**
  * Set bypass state
@@ -473,7 +477,7 @@ int rte_pmd_ixgbe_bypass_state_show(uint8_t port, uint32_t *state);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_state_set(uint8_t port, uint32_t *new_state);
+int rte_pmd_ixgbe_bypass_state_set(uint16_t port, uint32_t *new_state);
 
 /**
  * Return bypass state when given event occurs.
@@ -497,7 +501,7 @@ int rte_pmd_ixgbe_bypass_state_set(uint8_t port, uint32_t *new_state);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_event_show(uint8_t port,
+int rte_pmd_ixgbe_bypass_event_show(uint16_t port,
 				    uint32_t event,
 				    uint32_t *state);
 
@@ -523,7 +527,7 @@ int rte_pmd_ixgbe_bypass_event_show(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_event_store(uint8_t port,
+int rte_pmd_ixgbe_bypass_event_store(uint16_t port,
 				     uint32_t event,
 				     uint32_t state);
 
@@ -547,7 +551,7 @@ int rte_pmd_ixgbe_bypass_event_store(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port, uint32_t timeout);
+int rte_pmd_ixgbe_bypass_wd_timeout_store(uint16_t port, uint32_t timeout);
 
 /**
  * Get bypass firmware version.
@@ -561,7 +565,7 @@ int rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port, uint32_t timeout);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_ver_show(uint8_t port, uint32_t *ver);
+int rte_pmd_ixgbe_bypass_ver_show(uint16_t port, uint32_t *ver);
 
 /**
  * Return bypass watchdog timeout in seconds
@@ -583,7 +587,7 @@ int rte_pmd_ixgbe_bypass_ver_show(uint8_t port, uint32_t *ver);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port, uint32_t *wd_timeout);
+int rte_pmd_ixgbe_bypass_wd_timeout_show(uint16_t port, uint32_t *wd_timeout);
 
 /**
  * Reset bypass watchdog timer
@@ -595,7 +599,7 @@ int rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port, uint32_t *wd_timeout);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_reset(uint8_t port);
+int rte_pmd_ixgbe_bypass_wd_reset(uint16_t port);
 
 
 /**
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 7de1d1086..238a64f43 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -112,14 +112,14 @@ struct rxq {
 	unsigned int sges_n:2; /* Log 2 of SGEs (max buffers per packet). */
 	unsigned int cqe_n:4; /* Log 2 of CQ elements. */
 	unsigned int elts_n:4; /* Log 2 of Mbufs. */
-	unsigned int port_id:8;
 	unsigned int rss_hash:1; /* RSS hash result is enabled. */
 	unsigned int mark:1; /* Marked flow available on the queue. */
 	unsigned int pending_err:1; /* CQE error needs to be handled. */
 	unsigned int trim_elts:1; /* Whether elts needs clean-up. */
-	unsigned int :6; /* Remaining bits. */
+	unsigned int :14; /* Remaining bits. */
 	volatile uint32_t *rq_db;
 	volatile uint32_t *cq_db;
+	uint16_t port_id;
 	uint16_t rq_ci;
 	uint16_t rq_pi;
 	uint16_t cq_ci;
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 92b03c4cb..f1b968fc2 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -1240,12 +1240,12 @@ nfp_net_dev_link_status_print(struct rte_eth_dev *dev)
 	nfp_net_dev_atomic_read_link_status(dev, &link);
 	if (link.link_status)
 		RTE_LOG(INFO, PMD, "Port %d: Link Up - speed %u Mbps - %s\n",
-			(int)(dev->data->port_id), (unsigned)link.link_speed,
+			dev->data->port_id, link.link_speed,
 			link.link_duplex == ETH_LINK_FULL_DUPLEX
 			? "full-duplex" : "half-duplex");
 	else
 		RTE_LOG(INFO, PMD, " Port %d: Link Down\n",
-			(int)(dev->data->port_id));
+			dev->data->port_id);
 
 	RTE_LOG(INFO, PMD, "PCI Address: %04d:%02d:%02d:%d\n",
 		pci_dev->addr.domain, pci_dev->addr.bus,
@@ -1549,7 +1549,7 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 			"tx_free_thresh must be less than the number of TX "
 			"descriptors. (tx_free_thresh=%u port=%d "
 			"queue=%d)\n", (unsigned int)tx_free_thresh,
-			(int)dev->data->port_id, (int)queue_idx);
+			dev->data->port_id, (int)queue_idx);
 		return -(EINVAL);
 	}
 
@@ -1847,9 +1847,9 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		 */
 		new_mb = rte_pktmbuf_alloc(rxq->mem_pool);
 		if (unlikely(new_mb == NULL)) {
-			RTE_LOG_DP(DEBUG, PMD, "RX mbuf alloc failed port_id=%u "
-				"queue_id=%u\n", (unsigned)rxq->port_id,
-				(unsigned)rxq->qidx);
+			RTE_LOG_DP(DEBUG, PMD,
+			"RX mbuf alloc failed port_id=%u queue_id=%u\n",
+				rxq->port_id, (unsigned int)rxq->qidx);
 			nfp_net_mbuf_alloc_failed(rxq);
 			break;
 		}
@@ -1933,7 +1933,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		return nb_hold;
 
 	PMD_RX_LOG(DEBUG, "RX  port_id=%u queue_id=%u, %d packets received\n",
-		   (unsigned)rxq->port_id, (unsigned)rxq->qidx, nb_hold);
+		   rxq->port_id, (unsigned int)rxq->qidx, nb_hold);
 
 	nb_hold += rxq->nb_rx_hold;
 
@@ -1944,7 +1944,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 	rte_wmb();
 	if (nb_hold > rxq->rx_free_thresh) {
 		PMD_RX_LOG(DEBUG, "port=%u queue=%u nb_hold=%u avail=%u\n",
-			   (unsigned)rxq->port_id, (unsigned)rxq->qidx,
+			   rxq->port_id, (unsigned int)rxq->qidx,
 			   (unsigned)nb_hold, (unsigned)avail);
 		nfp_qcp_ptr_add(rxq->qcp_fl, NFP_QCP_WRITE_PTR, nb_hold);
 		nb_hold = 0;
diff --git a/drivers/net/nfp/nfp_net_pmd.h b/drivers/net/nfp/nfp_net_pmd.h
index eec56bc1c..828d0d35b 100644
--- a/drivers/net/nfp/nfp_net_pmd.h
+++ b/drivers/net/nfp/nfp_net_pmd.h
@@ -250,7 +250,7 @@ struct nfp_net_txq {
 	uint32_t tx_hthresh;   /* not used by now. Future? */
 	uint32_t tx_wthresh;   /* not used by now. Future? */
 	uint32_t txq_flags;    /* not used by now. Future? */
-	uint8_t  port_id;
+	uint16_t port_id;
 	int qidx;
 	int tx_qcidx;
 	__le64 dma;
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c
index 5aef0591e..fa9313dec 100644
--- a/drivers/net/null/rte_eth_null.c
+++ b/drivers/net/null/rte_eth_null.c
@@ -68,7 +68,7 @@ struct null_queue {
 struct pmd_internals {
 	unsigned packet_size;
 	unsigned packet_copy;
-	uint8_t port_id;
+	uint16_t port_id;
 
 	struct null_queue rx_null_queues[RTE_MAX_QUEUES_PER_PORT];
 	struct null_queue tx_null_queues[RTE_MAX_QUEUES_PER_PORT];
diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index defb3b419..b51f16cbd 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -75,7 +75,7 @@ struct queue_stat {
 
 struct pcap_rx_queue {
 	pcap_t *pcap;
-	uint8_t in_port;
+	uint16_t in_port;
 	struct rte_mempool *mb_pool;
 	struct queue_stat rx_stat;
 	char name[PATH_MAX];
diff --git a/drivers/net/qede/qede_if.h b/drivers/net/qede/qede_if.h
index 9864bb448..96f0d351d 100644
--- a/drivers/net/qede/qede_if.h
+++ b/drivers/net/qede/qede_if.h
@@ -97,7 +97,7 @@ struct qed_link_output {
 	uint32_t speed;		/* In Mb/s */
 	uint32_t adv_speed;	/* Speed mask */
 	uint8_t duplex;		/* In DUPLEX defs */
-	uint8_t port;		/* In PORT defs */
+	uint16_t port;		/* In PORT defs */
 	bool autoneg;
 	uint32_t pause_config;
 };
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index 464d3d384..e3fa7b0e2 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -394,7 +394,7 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[],
 	};
 	char args_str[32] = { 0 };
 	char ring_name[32] = { 0 };
-	uint8_t port_id = RTE_MAX_ETHPORTS;
+	uint16_t port_id = RTE_MAX_ETHPORTS;
 	int ret;
 
 	/* do some parameter checking */
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 9c0d57cc1..d141acf0e 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -71,7 +71,7 @@
 struct szedata2_rx_queue {
 	struct szedata *sze;
 	uint8_t rx_channel;
-	uint8_t in_port;
+	uint16_t in_port;
 	struct rte_mempool *mb_pool;
 	volatile uint64_t rx_pkts;
 	volatile uint64_t rx_bytes;
diff --git a/drivers/net/thunderx/nicvf_struct.h b/drivers/net/thunderx/nicvf_struct.h
index 4ee6c3bb0..e54a96f8e 100644
--- a/drivers/net/thunderx/nicvf_struct.h
+++ b/drivers/net/thunderx/nicvf_struct.h
@@ -100,7 +100,7 @@ struct nicvf_rxq {
 	uint16_t queue_id;
 	uint16_t precharge_cnt;
 	uint8_t rx_drop_en;
-	uint8_t  port_id;
+	uint16_t port_id;
 	uint8_t  rbptr_offset;
 } __rte_cache_aligned;
 
diff --git a/drivers/net/vhost/Makefile b/drivers/net/vhost/Makefile
index 3ba8ad64f..258a917c7 100644
--- a/drivers/net/vhost/Makefile
+++ b/drivers/net/vhost/Makefile
@@ -43,7 +43,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_vhost_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 0dac5e60e..04179b4db 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -105,7 +105,7 @@ struct vhost_queue {
 	rte_atomic32_t while_queuing;
 	struct pmd_internal *internal;
 	struct rte_mempool *mb_pool;
-	uint8_t port;
+	uint16_t port;
 	uint16_t virtqueue_id;
 	struct vhost_stats stats;
 };
@@ -705,7 +705,7 @@ static struct vhost_device_ops vhost_ops = {
 };
 
 int
-rte_eth_vhost_get_queue_event(uint8_t port_id,
+rte_eth_vhost_get_queue_event(uint16_t port_id,
 		struct rte_eth_vhost_queue_event *event)
 {
 	struct rte_vhost_vring_state *state;
@@ -742,7 +742,7 @@ rte_eth_vhost_get_queue_event(uint8_t port_id,
 }
 
 int
-rte_eth_vhost_get_vid_from_port_id(uint8_t port_id)
+rte_eth_vhost_get_vid_from_port_id(uint16_t port_id)
 {
 	struct internal_list *list;
 	struct rte_eth_dev *eth_dev;
diff --git a/drivers/net/vhost/rte_eth_vhost.h b/drivers/net/vhost/rte_eth_vhost.h
index 39ca77197..948f3c810 100644
--- a/drivers/net/vhost/rte_eth_vhost.h
+++ b/drivers/net/vhost/rte_eth_vhost.h
@@ -69,7 +69,7 @@ struct rte_eth_vhost_queue_event {
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_vhost_get_queue_event(uint8_t port_id,
+int rte_eth_vhost_get_queue_event(uint16_t port_id,
 		struct rte_eth_vhost_queue_event *event);
 
 /**
@@ -79,7 +79,7 @@ int rte_eth_vhost_get_queue_event(uint8_t port_id,
  *  - On success, the 'vid' associated with 'port_id'.
  *  - On failure, a negative value.
  */
-int rte_eth_vhost_get_vid_from_port_id(uint8_t port_id);
+int rte_eth_vhost_get_vid_from_port_id(uint16_t port_id);
 
 #ifdef __cplusplus
 }
diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h
index 18caebdd7..330ee94be 100644
--- a/drivers/net/virtio/virtio_pci.h
+++ b/drivers/net/virtio/virtio_pci.h
@@ -260,7 +260,7 @@ struct virtio_hw {
 	uint8_t	    use_msix;
 	uint8_t     modern;
 	uint8_t     use_simple_rxtx;
-	uint8_t     port_id;
+	uint16_t    port_id;
 	uint8_t     mac_addr[ETHER_ADDR_LEN];
 	uint32_t    notify_off_multiplier;
 	uint8_t     *isr;
diff --git a/drivers/net/virtio/virtio_rxtx.h b/drivers/net/virtio/virtio_rxtx.h
index 28f82d6a8..198b2d8fb 100644
--- a/drivers/net/virtio/virtio_rxtx.h
+++ b/drivers/net/virtio/virtio_rxtx.h
@@ -54,7 +54,7 @@ struct virtnet_rx {
 	struct rte_mempool *mpool; /**< mempool for mbuf allocation */
 
 	uint16_t queue_id;   /**< DPDK queue index. */
-	uint8_t port_id;     /**< Device port identifier. */
+	uint16_t port_id;     /**< Device port identifier. */
 
 	/* Statistics */
 	struct virtnet_stats stats;
@@ -69,7 +69,7 @@ struct virtnet_tx {
 	phys_addr_t virtio_net_hdr_mem;  /**< hdr for each xmit packet */
 
 	uint16_t    queue_id;            /**< DPDK queue index. */
-	uint8_t     port_id;             /**< Device port identifier. */
+	uint16_t    port_id;             /**< Device port identifier. */
 
 	/* Statistics */
 	struct virtnet_stats stats;
@@ -82,7 +82,7 @@ struct virtnet_ctl {
 	/**< memzone to populate hdr. */
 	const struct rte_memzone *virtio_net_hdr_mz;
 	phys_addr_t virtio_net_hdr_mem; /**< hdr for each xmit packet */
-	uint8_t port_id;                /**< Device port identifier. */
+	uint16_t port_id;               /**< Device port identifier. */
 	const struct rte_memzone *mz;   /**< mem zone to populate RX ring. */
 };
 
diff --git a/drivers/net/vmxnet3/vmxnet3_ring.h b/drivers/net/vmxnet3/vmxnet3_ring.h
index d2e8323ba..a6fa93ac7 100644
--- a/drivers/net/vmxnet3/vmxnet3_ring.h
+++ b/drivers/net/vmxnet3/vmxnet3_ring.h
@@ -144,7 +144,7 @@ typedef struct vmxnet3_tx_queue {
 	const struct rte_memzone     *mz;
 	bool                         stopped;
 	uint16_t                     queue_id;      /**< Device TX queue index. */
-	uint8_t                      port_id;       /**< Device port identifier. */
+	uint16_t                     port_id;       /**< Device port identifier. */
 	uint16_t		     txdata_desc_size;
 } vmxnet3_tx_queue_t;
 
@@ -179,7 +179,7 @@ typedef struct vmxnet3_rx_queue {
 	const struct rte_memzone    *mz;
 	bool                        stopped;
 	uint16_t                    queue_id;      /**< Device RX queue index. */
-	uint8_t                     port_id;       /**< Device port identifier. */
+	uint16_t                    port_id;       /**< Device port identifier. */
 } vmxnet3_rx_queue_t;
 
 #endif /* _VMXNET3_RING_H_ */
diff --git a/lib/librte_bitratestats/Makefile b/lib/librte_bitratestats/Makefile
index 58a20ea09..a079cced7 100644
--- a/lib/librte_bitratestats/Makefile
+++ b/lib/librte_bitratestats/Makefile
@@ -38,7 +38,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_bitratestats_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_BITRATE) := rte_bitrate.c
diff --git a/lib/librte_bitratestats/rte_bitrate.c b/lib/librte_bitratestats/rte_bitrate.c
index 3ceb35166..f373697a7 100644
--- a/lib/librte_bitratestats/rte_bitrate.c
+++ b/lib/librte_bitratestats/rte_bitrate.c
@@ -84,7 +84,7 @@ rte_stats_bitrate_reg(struct rte_stats_bitrates *bitrate_data)
 
 int
 rte_stats_bitrate_calc(struct rte_stats_bitrates *bitrate_data,
-	uint8_t port_id)
+			uint16_t port_id)
 {
 	struct rte_stats_bitrate *port_data;
 	struct rte_eth_stats eth_stats;
diff --git a/lib/librte_bitratestats/rte_bitrate.h b/lib/librte_bitratestats/rte_bitrate.h
index 15fc270a3..16467221b 100644
--- a/lib/librte_bitratestats/rte_bitrate.h
+++ b/lib/librte_bitratestats/rte_bitrate.h
@@ -85,7 +85,7 @@ int rte_stats_bitrate_reg(struct rte_stats_bitrates *bitrate_data);
  *  - Negative value on error
  */
 int rte_stats_bitrate_calc(struct rte_stats_bitrates *bitrate_data,
-	uint8_t port_id);
+			   uint16_t port_id);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 201cb96fc..edcddf70d 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ethdev_version.map
 
-LIBABIVER := 7
+LIBABIVER := 8
 
 SRCS-y += rte_ethdev.c
 SRCS-y += rte_flow.c
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 1849a3bdd..0779c0d08 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -139,8 +139,8 @@ enum {
 	STAT_QMAP_RX
 };
 
-uint8_t
-rte_eth_find_next(uint8_t port_id)
+uint16_t
+rte_eth_find_next(uint16_t port_id)
 {
 	while (port_id < RTE_MAX_ETHPORTS &&
 	       rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED)
@@ -188,7 +188,7 @@ rte_eth_dev_allocated(const char *name)
 	return NULL;
 }
 
-static uint8_t
+static uint16_t
 rte_eth_dev_find_free_port(void)
 {
 	unsigned i;
@@ -201,7 +201,7 @@ rte_eth_dev_find_free_port(void)
 }
 
 static struct rte_eth_dev *
-eth_dev_get(uint8_t port_id)
+eth_dev_get(uint16_t port_id)
 {
 	struct rte_eth_dev *eth_dev = &rte_eth_devices[port_id];
 
@@ -217,7 +217,7 @@ eth_dev_get(uint8_t port_id)
 struct rte_eth_dev *
 rte_eth_dev_allocate(const char *name)
 {
-	uint8_t port_id;
+	uint16_t port_id;
 	struct rte_eth_dev *eth_dev;
 
 	port_id = rte_eth_dev_find_free_port();
@@ -252,7 +252,7 @@ rte_eth_dev_allocate(const char *name)
 struct rte_eth_dev *
 rte_eth_dev_attach_secondary(const char *name)
 {
-	uint8_t i;
+	uint16_t i;
 	struct rte_eth_dev *eth_dev;
 
 	if (rte_eth_dev_data == NULL)
@@ -286,7 +286,7 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
 }
 
 int
-rte_eth_dev_is_valid_port(uint8_t port_id)
+rte_eth_dev_is_valid_port(uint16_t port_id)
 {
 	if (port_id >= RTE_MAX_ETHPORTS ||
 	    (rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED &&
@@ -297,17 +297,17 @@ rte_eth_dev_is_valid_port(uint8_t port_id)
 }
 
 int
-rte_eth_dev_socket_id(uint8_t port_id)
+rte_eth_dev_socket_id(uint16_t port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 	return rte_eth_devices[port_id].data->numa_node;
 }
 
-uint8_t
+uint16_t
 rte_eth_dev_count(void)
 {
-	uint8_t p;
-	uint8_t count;
+	uint16_t p;
+	uint16_t count;
 
 	count = 0;
 
@@ -318,7 +318,7 @@ rte_eth_dev_count(void)
 }
 
 int
-rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
+rte_eth_dev_get_name_by_port(uint16_t port_id, char *name)
 {
 	const char *tmp;
 
@@ -337,7 +337,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
 }
 
 int
-rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
+rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)
 {
 	int ret;
 	int i;
@@ -362,7 +362,7 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
 }
 
 static int
-rte_eth_dev_is_detachable(uint8_t port_id)
+rte_eth_dev_is_detachable(uint16_t port_id)
 {
 	uint32_t dev_flags;
 
@@ -378,7 +378,7 @@ rte_eth_dev_is_detachable(uint8_t port_id)
 
 /* attach the new device, then store port_id of the device */
 int
-rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
+rte_eth_dev_attach(const char *devargs, uint16_t *port_id)
 {
 	int ret = -1;
 	int current = rte_eth_dev_count();
@@ -424,7 +424,7 @@ rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
 
 /* detach the device, then store the name of the device */
 int
-rte_eth_dev_detach(uint8_t port_id, char *name)
+rte_eth_dev_detach(uint16_t port_id, char *name)
 {
 	int ret = -1;
 
@@ -502,7 +502,7 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
 }
 
 int
-rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -528,7 +528,7 @@ rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -554,7 +554,7 @@ rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -580,7 +580,7 @@ rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -689,7 +689,7 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
 }
 
 int
-rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
+rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
 {
 	struct rte_eth_dev *dev;
@@ -850,7 +850,7 @@ _rte_eth_dev_reset(struct rte_eth_dev *dev)
 }
 
 static void
-rte_eth_dev_config_restore(uint8_t port_id)
+rte_eth_dev_config_restore(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -905,7 +905,7 @@ rte_eth_dev_config_restore(uint8_t port_id)
 }
 
 int
-rte_eth_dev_start(uint8_t port_id)
+rte_eth_dev_start(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int diag;
@@ -917,7 +917,7 @@ rte_eth_dev_start(uint8_t port_id)
 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_start, -ENOTSUP);
 
 	if (dev->data->dev_started != 0) {
-		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu8
+		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
 			" already started\n",
 			port_id);
 		return 0;
@@ -939,7 +939,7 @@ rte_eth_dev_start(uint8_t port_id)
 }
 
 void
-rte_eth_dev_stop(uint8_t port_id)
+rte_eth_dev_stop(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -949,7 +949,7 @@ rte_eth_dev_stop(uint8_t port_id)
 	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_stop);
 
 	if (dev->data->dev_started == 0) {
-		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu8
+		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
 			" already stopped\n",
 			port_id);
 		return;
@@ -960,7 +960,7 @@ rte_eth_dev_stop(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_up(uint8_t port_id)
+rte_eth_dev_set_link_up(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -973,7 +973,7 @@ rte_eth_dev_set_link_up(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_down(uint8_t port_id)
+rte_eth_dev_set_link_down(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -986,7 +986,7 @@ rte_eth_dev_set_link_down(uint8_t port_id)
 }
 
 void
-rte_eth_dev_close(uint8_t port_id)
+rte_eth_dev_close(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1006,7 +1006,7 @@ rte_eth_dev_close(uint8_t port_id)
 }
 
 int
-rte_eth_dev_reset(uint8_t port_id)
+rte_eth_dev_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int ret;
@@ -1023,7 +1023,7 @@ rte_eth_dev_reset(uint8_t port_id)
 }
 
 int
-rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 		       uint16_t nb_rx_desc, unsigned int socket_id,
 		       const struct rte_eth_rxconf *rx_conf,
 		       struct rte_mempool *mp)
@@ -1114,7 +1114,7 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
 }
 
 int
-rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 		       uint16_t nb_tx_desc, unsigned int socket_id,
 		       const struct rte_eth_txconf *tx_conf)
 {
@@ -1218,7 +1218,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size)
 }
 
 int
-rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt)
+rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 
@@ -1232,7 +1232,7 @@ rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt)
 }
 
 void
-rte_eth_promiscuous_enable(uint8_t port_id)
+rte_eth_promiscuous_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1245,7 +1245,7 @@ rte_eth_promiscuous_enable(uint8_t port_id)
 }
 
 void
-rte_eth_promiscuous_disable(uint8_t port_id)
+rte_eth_promiscuous_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1258,7 +1258,7 @@ rte_eth_promiscuous_disable(uint8_t port_id)
 }
 
 int
-rte_eth_promiscuous_get(uint8_t port_id)
+rte_eth_promiscuous_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1269,7 +1269,7 @@ rte_eth_promiscuous_get(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_enable(uint8_t port_id)
+rte_eth_allmulticast_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1282,7 +1282,7 @@ rte_eth_allmulticast_enable(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_disable(uint8_t port_id)
+rte_eth_allmulticast_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1295,7 +1295,7 @@ rte_eth_allmulticast_disable(uint8_t port_id)
 }
 
 int
-rte_eth_allmulticast_get(uint8_t port_id)
+rte_eth_allmulticast_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1320,7 +1320,7 @@ rte_eth_dev_atomic_read_link_status(struct rte_eth_dev *dev,
 }
 
 void
-rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get(uint16_t port_id, struct rte_eth_link *eth_link)
 {
 	struct rte_eth_dev *dev;
 
@@ -1337,7 +1337,7 @@ rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 void
-rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *eth_link)
 {
 	struct rte_eth_dev *dev;
 
@@ -1354,7 +1354,7 @@ rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 int
-rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
+rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
 {
 	struct rte_eth_dev *dev;
 
@@ -1370,7 +1370,7 @@ rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
 }
 
 void
-rte_eth_stats_reset(uint8_t port_id)
+rte_eth_stats_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1383,7 +1383,7 @@ rte_eth_stats_reset(uint8_t port_id)
 }
 
 static int
-get_xstats_count(uint8_t port_id)
+get_xstats_count(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int count;
@@ -1412,7 +1412,7 @@ get_xstats_count(uint8_t port_id)
 }
 
 int
-rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
+rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
 		uint64_t *id)
 {
 	int cnt_xstats, idx_xstat;
@@ -1456,7 +1456,7 @@ rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
 }
 
 int
-rte_eth_xstats_get_names_by_id(uint8_t port_id,
+rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names, unsigned int size,
 	uint64_t *ids)
 {
@@ -1573,7 +1573,7 @@ rte_eth_xstats_get_names_by_id(uint8_t port_id,
 }
 
 int
-rte_eth_xstats_get_names(uint8_t port_id,
+rte_eth_xstats_get_names(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names,
 	unsigned int size)
 {
@@ -1639,8 +1639,8 @@ rte_eth_xstats_get_names(uint8_t port_id,
 
 /* retrieve ethdev extended statistics */
 int
-rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids, uint64_t *values,
-	unsigned int n)
+rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
+			 uint64_t *values, unsigned int n)
 {
 	/* If need all xstats */
 	if (!ids) {
@@ -1765,7 +1765,7 @@ rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids, uint64_t *values,
 }
 
 int
-rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
+rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
 	unsigned int n)
 {
 	struct rte_eth_stats eth_stats;
@@ -1847,7 +1847,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
 
 /* reset ethdev extended statistics */
 void
-rte_eth_xstats_reset(uint8_t port_id)
+rte_eth_xstats_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1865,7 +1865,7 @@ rte_eth_xstats_reset(uint8_t port_id)
 }
 
 static int
-set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
+set_queue_stats_mapping(uint16_t port_id, uint16_t queue_id, uint8_t stat_idx,
 		uint8_t is_rx)
 {
 	struct rte_eth_dev *dev;
@@ -1881,7 +1881,7 @@ set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
 
 
 int
-rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t tx_queue_id,
 		uint8_t stat_idx)
 {
 	return set_queue_stats_mapping(port_id, tx_queue_id, stat_idx,
@@ -1890,7 +1890,7 @@ rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
 
 
 int
-rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t rx_queue_id,
 		uint8_t stat_idx)
 {
 	return set_queue_stats_mapping(port_id, rx_queue_id, stat_idx,
@@ -1898,7 +1898,7 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
 }
 
 int
-rte_eth_dev_fw_version_get(uint8_t port_id, char *fw_version, size_t fw_size)
+rte_eth_dev_fw_version_get(uint16_t port_id, char *fw_version, size_t fw_size)
 {
 	struct rte_eth_dev *dev;
 
@@ -1910,7 +1910,7 @@ rte_eth_dev_fw_version_get(uint8_t port_id, char *fw_version, size_t fw_size)
 }
 
 void
-rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
+rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)
 {
 	struct rte_eth_dev *dev;
 	const struct rte_eth_desc_lim lim = {
@@ -1934,7 +1934,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
 }
 
 int
-rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
+rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
 				 uint32_t *ptypes, int num)
 {
 	int i, j;
@@ -1960,7 +1960,7 @@ rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
 }
 
 void
-rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
+rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *dev;
 
@@ -1971,7 +1971,7 @@ rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
 
 
 int
-rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
+rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu)
 {
 	struct rte_eth_dev *dev;
 
@@ -1983,7 +1983,7 @@ rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
 }
 
 int
-rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
+rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
 {
 	int ret;
 	struct rte_eth_dev *dev;
@@ -2000,7 +2000,7 @@ rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
 }
 
 int
-rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
+rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on)
 {
 	struct rte_eth_dev *dev;
 	int ret;
@@ -2039,7 +2039,8 @@ rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
 }
 
 int
-rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int on)
+rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
+				    int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2057,7 +2058,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int o
 }
 
 int
-rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 				enum rte_vlan_type vlan_type,
 				uint16_t tpid)
 {
@@ -2071,7 +2072,7 @@ rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
 }
 
 int
-rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
+rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 {
 	struct rte_eth_dev *dev;
 	int ret = 0;
@@ -2114,7 +2115,7 @@ rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
 }
 
 int
-rte_eth_dev_get_vlan_offload(uint8_t port_id)
+rte_eth_dev_get_vlan_offload(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int ret = 0;
@@ -2135,7 +2136,7 @@ rte_eth_dev_get_vlan_offload(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
+rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2148,7 +2149,7 @@ rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
 }
 
 int
-rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2160,7 +2161,7 @@ rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2176,7 +2177,8 @@ rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id, struct rte_eth_pfc_conf *pfc_conf)
+rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
+				   struct rte_eth_pfc_conf *pfc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2242,7 +2244,7 @@ rte_eth_check_reta_entry(struct rte_eth_rss_reta_entry64 *reta_conf,
 }
 
 int
-rte_eth_dev_rss_reta_update(uint8_t port_id,
+rte_eth_dev_rss_reta_update(uint16_t port_id,
 			    struct rte_eth_rss_reta_entry64 *reta_conf,
 			    uint16_t reta_size)
 {
@@ -2268,7 +2270,7 @@ rte_eth_dev_rss_reta_update(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_reta_query(uint8_t port_id,
+rte_eth_dev_rss_reta_query(uint16_t port_id,
 			   struct rte_eth_rss_reta_entry64 *reta_conf,
 			   uint16_t reta_size)
 {
@@ -2288,7 +2290,8 @@ rte_eth_dev_rss_reta_query(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
+rte_eth_dev_rss_hash_update(uint16_t port_id,
+			    struct rte_eth_rss_conf *rss_conf)
 {
 	struct rte_eth_dev *dev;
 	uint16_t rss_hash_protos;
@@ -2307,7 +2310,7 @@ rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
 }
 
 int
-rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 			      struct rte_eth_rss_conf *rss_conf)
 {
 	struct rte_eth_dev *dev;
@@ -2319,7 +2322,7 @@ rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
 				struct rte_eth_udp_tunnel *udp_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -2341,7 +2344,7 @@ rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
 				   struct rte_eth_udp_tunnel *udp_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -2364,7 +2367,7 @@ rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
 }
 
 int
-rte_eth_led_on(uint8_t port_id)
+rte_eth_led_on(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2375,7 +2378,7 @@ rte_eth_led_on(uint8_t port_id)
 }
 
 int
-rte_eth_led_off(uint8_t port_id)
+rte_eth_led_off(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2390,7 +2393,7 @@ rte_eth_led_off(uint8_t port_id)
  * an empty spot.
  */
 static int
-get_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
+get_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2409,7 +2412,7 @@ get_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
 static const struct ether_addr null_mac_addr;
 
 int
-rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_mac_addr_add(uint16_t port_id, struct ether_addr *addr,
 			uint32_t pool)
 {
 	struct rte_eth_dev *dev;
@@ -2462,7 +2465,7 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_mac_addr_remove(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev *dev;
 	int index;
@@ -2491,7 +2494,7 @@ rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev *dev;
 
@@ -2517,7 +2520,7 @@ rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr *addr)
  * an empty spot.
  */
 static int
-get_hash_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
+get_hash_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2536,7 +2539,7 @@ get_hash_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct ether_addr *addr,
 				uint8_t on)
 {
 	int index;
@@ -2588,7 +2591,7 @@ rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
+rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2600,7 +2603,7 @@ rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
 	return (*dev->dev_ops->uc_all_hash_table_set)(dev, on);
 }
 
-int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 					uint16_t tx_rate)
 {
 	struct rte_eth_dev *dev;
@@ -2631,7 +2634,7 @@ int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
 }
 
 int
-rte_eth_mirror_rule_set(uint8_t port_id,
+rte_eth_mirror_rule_set(uint16_t port_id,
 			struct rte_eth_mirror_conf *mirror_conf,
 			uint8_t rule_id, uint8_t on)
 {
@@ -2669,7 +2672,7 @@ rte_eth_mirror_rule_set(uint8_t port_id,
 }
 
 int
-rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
+rte_eth_mirror_rule_reset(uint16_t port_id, uint8_t rule_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2682,7 +2685,7 @@ rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
 }
 
 int
-rte_eth_dev_callback_register(uint8_t port_id,
+rte_eth_dev_callback_register(uint16_t port_id,
 			enum rte_eth_event_type event,
 			rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2722,7 +2725,7 @@ rte_eth_dev_callback_register(uint8_t port_id,
 }
 
 int
-rte_eth_dev_callback_unregister(uint8_t port_id,
+rte_eth_dev_callback_unregister(uint16_t port_id,
 			enum rte_eth_event_type event,
 			rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2794,7 +2797,7 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 }
 
 int
-rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 {
 	uint32_t vec;
 	struct rte_eth_dev *dev;
@@ -2855,7 +2858,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
 }
 
 int
-rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			  int epfd, int op, void *data)
 {
 	uint32_t vec;
@@ -2895,7 +2898,7 @@ rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_dev_rx_intr_enable(uint8_t port_id,
+rte_eth_dev_rx_intr_enable(uint16_t port_id,
 			   uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
@@ -2909,7 +2912,7 @@ rte_eth_dev_rx_intr_enable(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rx_intr_disable(uint8_t port_id,
+rte_eth_dev_rx_intr_disable(uint16_t port_id,
 			    uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
@@ -2924,7 +2927,8 @@ rte_eth_dev_rx_intr_disable(uint8_t port_id,
 
 
 int
-rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
+rte_eth_dev_filter_supported(uint16_t port_id,
+			     enum rte_filter_type filter_type)
 {
 	struct rte_eth_dev *dev;
 
@@ -2937,7 +2941,7 @@ rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
 }
 
 int
-rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
+rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
 		       enum rte_filter_op filter_op, void *arg)
 {
 	struct rte_eth_dev *dev;
@@ -2950,7 +2954,7 @@ rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
 }
 
 void *
-rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -2992,7 +2996,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 void *
-rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3027,7 +3031,7 @@ rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 void *
-rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_tx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3070,7 +3074,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3104,7 +3108,7 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3138,7 +3142,7 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_rxq_info *qinfo)
 {
 	struct rte_eth_dev *dev;
@@ -3162,7 +3166,7 @@ rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_txq_info *qinfo)
 {
 	struct rte_eth_dev *dev;
@@ -3186,7 +3190,7 @@ rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_dev_set_mc_addr_list(uint8_t port_id,
+rte_eth_dev_set_mc_addr_list(uint16_t port_id,
 			     struct ether_addr *mc_addr_set,
 			     uint32_t nb_mc_addr)
 {
@@ -3200,7 +3204,7 @@ rte_eth_dev_set_mc_addr_list(uint8_t port_id,
 }
 
 int
-rte_eth_timesync_enable(uint8_t port_id)
+rte_eth_timesync_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3212,7 +3216,7 @@ rte_eth_timesync_enable(uint8_t port_id)
 }
 
 int
-rte_eth_timesync_disable(uint8_t port_id)
+rte_eth_timesync_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3224,7 +3228,7 @@ rte_eth_timesync_disable(uint8_t port_id)
 }
 
 int
-rte_eth_timesync_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp,
+rte_eth_timesync_read_rx_timestamp(uint16_t port_id, struct timespec *timestamp,
 				   uint32_t flags)
 {
 	struct rte_eth_dev *dev;
@@ -3237,7 +3241,8 @@ rte_eth_timesync_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp,
 }
 
 int
-rte_eth_timesync_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp)
+rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
+				   struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3249,7 +3254,7 @@ rte_eth_timesync_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp)
 }
 
 int
-rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta)
+rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta)
 {
 	struct rte_eth_dev *dev;
 
@@ -3261,7 +3266,7 @@ rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta)
 }
 
 int
-rte_eth_timesync_read_time(uint8_t port_id, struct timespec *timestamp)
+rte_eth_timesync_read_time(uint16_t port_id, struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3273,7 +3278,7 @@ rte_eth_timesync_read_time(uint8_t port_id, struct timespec *timestamp)
 }
 
 int
-rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
+rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3285,7 +3290,7 @@ rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
 }
 
 int
-rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
+rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3297,7 +3302,7 @@ rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
 }
 
 int
-rte_eth_dev_get_eeprom_length(uint8_t port_id)
+rte_eth_dev_get_eeprom_length(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3309,7 +3314,7 @@ rte_eth_dev_get_eeprom_length(uint8_t port_id)
 }
 
 int
-rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
+rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3321,7 +3326,7 @@ rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
 }
 
 int
-rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
+rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3333,7 +3338,7 @@ rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
 }
 
 int
-rte_eth_dev_get_dcb_info(uint8_t port_id,
+rte_eth_dev_get_dcb_info(uint16_t port_id,
 			     struct rte_eth_dcb_info *dcb_info)
 {
 	struct rte_eth_dev *dev;
@@ -3348,7 +3353,7 @@ rte_eth_dev_get_dcb_info(uint8_t port_id,
 }
 
 int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
 				    struct rte_eth_l2_tunnel_conf *l2_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -3371,7 +3376,7 @@ rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
 }
 
 int
-rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
 				  struct rte_eth_l2_tunnel_conf *l2_tunnel,
 				  uint32_t mask,
 				  uint8_t en)
@@ -3415,7 +3420,7 @@ rte_eth_dev_adjust_nb_desc(uint16_t *nb_desc,
 }
 
 int
-rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
 				 uint16_t *nb_rx_desc,
 				 uint16_t *nb_tx_desc)
 {
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 99cdd54d4..34f729ab8 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1572,7 +1572,7 @@ struct eth_dev_ops {
  * @return
  *   The number of packets returned to the user.
  */
-typedef uint16_t (*rte_rx_callback_fn)(uint8_t port, uint16_t queue,
+typedef uint16_t (*rte_rx_callback_fn)(uint16_t port, uint16_t queue,
 	struct rte_mbuf *pkts[], uint16_t nb_pkts, uint16_t max_pkts,
 	void *user_param);
 
@@ -1596,7 +1596,7 @@ typedef uint16_t (*rte_rx_callback_fn)(uint8_t port, uint16_t queue,
  * @return
  *   The number of packets to be written to the NIC.
  */
-typedef uint16_t (*rte_tx_callback_fn)(uint8_t port, uint16_t queue,
+typedef uint16_t (*rte_tx_callback_fn)(uint16_t port, uint16_t queue,
 	struct rte_mbuf *pkts[], uint16_t nb_pkts, void *user_param);
 
 /**
@@ -1699,7 +1699,7 @@ struct rte_eth_dev_data {
 	/** bitmap array of associating Ethernet MAC addresses to pools */
 	struct ether_addr* hash_mac_addrs;
 	/** Device Ethernet MAC addresses of hash filtering. */
-	uint8_t port_id;           /**< Device [external] port identifier. */
+	uint16_t port_id;           /**< Device [external] port identifier. */
 	__extension__
 	uint8_t promiscuous   : 1, /**< RX promiscuous mode ON(1) / OFF(0). */
 		scattered_rx : 1,  /**< RX of scattered packets is ON(1) / OFF(0) */
@@ -1741,7 +1741,7 @@ extern struct rte_eth_dev rte_eth_devices[];
  * @return
  *   Next valid port id, RTE_MAX_ETHPORTS if there is none.
  */
-uint8_t rte_eth_find_next(uint8_t port_id);
+uint16_t rte_eth_find_next(uint16_t port_id);
 
 /**
  * Macro to iterate over all enabled ethdev ports.
@@ -1764,7 +1764,7 @@ uint8_t rte_eth_find_next(uint8_t port_id);
  * @return
  *   - The total number of usable Ethernet devices.
  */
-uint8_t rte_eth_dev_count(void);
+uint16_t rte_eth_dev_count(void);
 
 /**
  * @internal
@@ -1825,7 +1825,7 @@ int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev);
  * @return
  *  0 on success and port_id is filled, negative on error
  */
-int rte_eth_dev_attach(const char *devargs, uint8_t *port_id);
+int rte_eth_dev_attach(const char *devargs, uint16_t *port_id);
 
 /**
  * Detach a Ethernet device specified by port identifier.
@@ -1840,7 +1840,7 @@ int rte_eth_dev_attach(const char *devargs, uint8_t *port_id);
  * @return
  *  0 on success and devname is filled, negative on error
  */
-int rte_eth_dev_detach(uint8_t port_id, char *devname);
+int rte_eth_dev_detach(uint16_t port_id, char *devname);
 
 /**
  * Convert a numerical speed in Mbps to a bitmap flag that can be used in
@@ -1884,7 +1884,7 @@ uint32_t rte_eth_speed_bitflag(uint32_t speed, int duplex);
  *   - 0: Success, device configured.
  *   - <0: Error code returned by the driver configuration function.
  */
-int rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_queue,
+int rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_queue,
 		uint16_t nb_tx_queue, const struct rte_eth_conf *eth_conf);
 
 /**
@@ -1939,7 +1939,7 @@ void _rte_eth_dev_reset(struct rte_eth_dev *dev);
  *      allocate network memory buffers from the memory pool when
  *      initializing receive descriptors.
  */
-int rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
+int rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 		uint16_t nb_rx_desc, unsigned int socket_id,
 		const struct rte_eth_rxconf *rx_conf,
 		struct rte_mempool *mb_pool);
@@ -1987,7 +1987,7 @@ int rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
  *   - 0: Success, the transmit queue is correctly set up.
  *   - -ENOMEM: Unable to allocate the transmit ring descriptors.
  */
-int rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
+int rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 		uint16_t nb_tx_desc, unsigned int socket_id,
 		const struct rte_eth_txconf *tx_conf);
 
@@ -2001,7 +2001,7 @@ int rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
  *   a default of zero if the socket could not be determined.
  *   -1 is returned is the port_id value is out of range.
  */
-int rte_eth_dev_socket_id(uint8_t port_id);
+int rte_eth_dev_socket_id(uint16_t port_id);
 
 /**
  * Check if port_id of device is attached
@@ -2012,7 +2012,7 @@ int rte_eth_dev_socket_id(uint8_t port_id);
  *   - 0 if port is out of range or not attached
  *   - 1 if device is attached
  */
-int rte_eth_dev_is_valid_port(uint8_t port_id);
+int rte_eth_dev_is_valid_port(uint16_t port_id);
 
 /**
  * Start specified RX queue of a port. It is used when rx_deferred_start
@@ -2029,7 +2029,7 @@ int rte_eth_dev_is_valid_port(uint8_t port_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id);
+int rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id);
 
 /**
  * Stop specified RX queue of a port
@@ -2045,7 +2045,7 @@ int rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id);
+int rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id);
 
 /**
  * Start TX for specified queue of a port. It is used when tx_deferred_start
@@ -2062,7 +2062,7 @@ int rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id);
+int rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id);
 
 /**
  * Stop specified TX queue of a port
@@ -2078,7 +2078,7 @@ int rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id);
+int rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id);
 
 
 
@@ -2097,7 +2097,7 @@ int rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id);
  *   - 0: Success, Ethernet device started.
  *   - <0: Error code of the driver device start function.
  */
-int rte_eth_dev_start(uint8_t port_id);
+int rte_eth_dev_start(uint16_t port_id);
 
 /**
  * Stop an Ethernet device. The device can be restarted with a call to
@@ -2106,7 +2106,7 @@ int rte_eth_dev_start(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_dev_stop(uint8_t port_id);
+void rte_eth_dev_stop(uint16_t port_id);
 
 
 /**
@@ -2121,7 +2121,7 @@ void rte_eth_dev_stop(uint8_t port_id);
  *   - 0: Success, Ethernet device linked up.
  *   - <0: Error code of the driver device link up function.
  */
-int rte_eth_dev_set_link_up(uint8_t port_id);
+int rte_eth_dev_set_link_up(uint16_t port_id);
 
 /**
  * Link down an Ethernet device.
@@ -2132,7 +2132,7 @@ int rte_eth_dev_set_link_up(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-int rte_eth_dev_set_link_down(uint8_t port_id);
+int rte_eth_dev_set_link_down(uint16_t port_id);
 
 /**
  * Close a stopped Ethernet device. The device cannot be restarted!
@@ -2142,7 +2142,7 @@ int rte_eth_dev_set_link_down(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_dev_close(uint8_t port_id);
+void rte_eth_dev_close(uint16_t port_id);
 
 /**
  * Reset a Ethernet device and keep its port id.
@@ -2172,7 +2172,7 @@ void rte_eth_dev_close(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-int rte_eth_dev_reset(uint8_t port_id);
+int rte_eth_dev_reset(uint16_t port_id);
 
 /**
  * Enable receipt in promiscuous mode for an Ethernet device.
@@ -2180,7 +2180,7 @@ int rte_eth_dev_reset(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_promiscuous_enable(uint8_t port_id);
+void rte_eth_promiscuous_enable(uint16_t port_id);
 
 /**
  * Disable receipt in promiscuous mode for an Ethernet device.
@@ -2188,7 +2188,7 @@ void rte_eth_promiscuous_enable(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_promiscuous_disable(uint8_t port_id);
+void rte_eth_promiscuous_disable(uint16_t port_id);
 
 /**
  * Return the value of promiscuous mode for an Ethernet device.
@@ -2200,7 +2200,7 @@ void rte_eth_promiscuous_disable(uint8_t port_id);
  *   - (0) if promiscuous is disabled.
  *   - (-1) on error
  */
-int rte_eth_promiscuous_get(uint8_t port_id);
+int rte_eth_promiscuous_get(uint16_t port_id);
 
 /**
  * Enable the receipt of any multicast frame by an Ethernet device.
@@ -2208,7 +2208,7 @@ int rte_eth_promiscuous_get(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_allmulticast_enable(uint8_t port_id);
+void rte_eth_allmulticast_enable(uint16_t port_id);
 
 /**
  * Disable the receipt of all multicast frames by an Ethernet device.
@@ -2216,7 +2216,7 @@ void rte_eth_allmulticast_enable(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_allmulticast_disable(uint8_t port_id);
+void rte_eth_allmulticast_disable(uint16_t port_id);
 
 /**
  * Return the value of allmulticast mode for an Ethernet device.
@@ -2228,7 +2228,7 @@ void rte_eth_allmulticast_disable(uint8_t port_id);
  *   - (0) if allmulticast is disabled.
  *   - (-1) on error
  */
-int rte_eth_allmulticast_get(uint8_t port_id);
+int rte_eth_allmulticast_get(uint16_t port_id);
 
 /**
  * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
@@ -2241,7 +2241,7 @@ int rte_eth_allmulticast_get(uint8_t port_id);
  *   A pointer to an *rte_eth_link* structure to be filled with
  *   the status, the speed and the mode of the Ethernet device link.
  */
-void rte_eth_link_get(uint8_t port_id, struct rte_eth_link *link);
+void rte_eth_link_get(uint16_t port_id, struct rte_eth_link *link);
 
 /**
  * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
@@ -2254,7 +2254,7 @@ void rte_eth_link_get(uint8_t port_id, struct rte_eth_link *link);
  *   A pointer to an *rte_eth_link* structure to be filled with
  *   the status, the speed and the mode of the Ethernet device link.
  */
-void rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *link);
+void rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *link);
 
 /**
  * Retrieve the general I/O statistics of an Ethernet device.
@@ -2273,7 +2273,7 @@ void rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *link);
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats);
+int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats);
 
 /**
  * Reset the general I/O statistics of an Ethernet device.
@@ -2281,7 +2281,7 @@ int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_stats_reset(uint8_t port_id);
+void rte_eth_stats_reset(uint16_t port_id);
 
 /**
  * Retrieve names of extended statistics of an Ethernet device.
@@ -2303,7 +2303,7 @@ void rte_eth_stats_reset(uint8_t port_id);
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get_names(uint8_t port_id,
+int rte_eth_xstats_get_names(uint16_t port_id,
 		struct rte_eth_xstat_name *xstats_names,
 		unsigned int size);
 
@@ -2329,7 +2329,7 @@ int rte_eth_xstats_get_names(uint8_t port_id,
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
+int rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
 		unsigned int n);
 
 /**
@@ -2355,7 +2355,7 @@ int rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
  *   - A negative value on error (invalid port id).
  */
 int
-rte_eth_xstats_get_names_by_id(uint8_t port_id,
+rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names, unsigned int size,
 	uint64_t *ids);
 
@@ -2382,7 +2382,7 @@ rte_eth_xstats_get_names_by_id(uint8_t port_id,
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids,
+int rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 			     uint64_t *values, unsigned int n);
 
 /**
@@ -2402,7 +2402,7 @@ int rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids,
  *    -ENODEV for invalid port_id,
  *    -EINVAL if the xstat_name doesn't exist in port_id
  */
-int rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
+int rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
 		uint64_t *id);
 
 /**
@@ -2411,7 +2411,7 @@ int rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_xstats_reset(uint8_t port_id);
+void rte_eth_xstats_reset(uint16_t port_id);
 
 /**
  *  Set a mapping for the specified transmit queue to the specified per-queue
@@ -2430,7 +2430,7 @@ void rte_eth_xstats_reset(uint8_t port_id);
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id,
+int rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id,
 		uint16_t tx_queue_id, uint8_t stat_idx);
 
 /**
@@ -2450,7 +2450,7 @@ int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id,
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id,
+int rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id,
 					   uint16_t rx_queue_id,
 					   uint8_t stat_idx);
 
@@ -2463,7 +2463,7 @@ int rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id,
  *   A pointer to a structure of type *ether_addr* to be filled with
  *   the Ethernet address of the Ethernet device.
  */
-void rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr);
+void rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr);
 
 /**
  * Retrieve the contextual information of an Ethernet device.
@@ -2474,7 +2474,7 @@ void rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr);
  *   A pointer to a structure of type *rte_eth_dev_info* to be filled with
  *   the contextual information of the Ethernet device.
  */
-void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info);
+void rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info);
 
 /**
  * Retrieve the firmware version of a device.
@@ -2494,7 +2494,7 @@ void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info);
  *   - (>0) if *fw_size* is not enough to store firmware version, return
  *          the size of the non truncated string.
  */
-int rte_eth_dev_fw_version_get(uint8_t port_id,
+int rte_eth_dev_fw_version_get(uint16_t port_id,
 			       char *fw_version, size_t fw_size);
 
 /**
@@ -2535,7 +2535,7 @@ int rte_eth_dev_fw_version_get(uint8_t port_id,
  *           count of supported ptypes will be returned.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
+int rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
 				     uint32_t *ptypes, int num);
 
 /**
@@ -2549,7 +2549,7 @@ int rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
  *   - (0) if successful.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu);
+int rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu);
 
 /**
  * Change the MTU of an Ethernet device.
@@ -2565,7 +2565,7 @@ int rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu);
  *   - (-EINVAL) if *mtu* invalid.
  *   - (-EBUSY) if operation is not allowed when the port is running
  */
-int rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu);
+int rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu);
 
 /**
  * Enable/Disable hardware filtering by an Ethernet device of received
@@ -2585,7 +2585,7 @@ int rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu);
  *   - (-ENOSYS) if VLAN filtering on *port_id* disabled.
  *   - (-EINVAL) if *vlan_id* > 4095.
  */
-int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on);
+int rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on);
 
 /**
  * Enable/Disable hardware VLAN Strip by a rx queue of an Ethernet device.
@@ -2606,7 +2606,7 @@ int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if *rx_queue_id* invalid.
  */
-int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id,
+int rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
 		int on);
 
 /**
@@ -2625,7 +2625,7 @@ int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id,
  *   - (-ENOSUP) if hardware-assisted VLAN TPID setup is not supported.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+int rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 				    enum rte_vlan_type vlan_type,
 				    uint16_t tag_type);
 
@@ -2649,7 +2649,7 @@ int rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
  *   - (-ENOSUP) if hardware-assisted VLAN filtering not configured.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask);
+int rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask);
 
 /**
  * Read VLAN Offload configuration from an Ethernet device
@@ -2663,7 +2663,7 @@ int rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask);
  *       ETH_VLAN_EXTEND_OFFLOAD
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_vlan_offload(uint8_t port_id);
+int rte_eth_dev_get_vlan_offload(uint16_t port_id);
 
 /**
  * Set port based TX VLAN insertion on or off.
@@ -2679,7 +2679,7 @@ int rte_eth_dev_get_vlan_offload(uint8_t port_id);
  *   - (0) if successful.
  *   - negative if failed.
  */
-int rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on);
+int rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on);
 
 /**
  *
@@ -2764,7 +2764,7 @@ int rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on);
  *   *rx_pkts* array.
  */
 static inline uint16_t
-rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_burst(uint16_t port_id, uint16_t queue_id,
 		 struct rte_mbuf **rx_pkts, const uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2809,7 +2809,7 @@ rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
  *     (-ENOTSUP) if the device does not support this function
  */
 static inline int
-rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id)
+rte_eth_rx_queue_count(uint16_t port_id, uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2838,7 +2838,7 @@ rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id)
  *  - (-ENOTSUP) if the device does not support this function
  */
 static inline int
-rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset)
+rte_eth_rx_descriptor_done(uint16_t port_id, uint16_t queue_id, uint16_t offset)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
@@ -2885,7 +2885,7 @@ rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset)
  *  - (-ENODEV) bad port or queue (only if compiled with debug).
  */
 static inline int
-rte_eth_rx_descriptor_status(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_descriptor_status(uint16_t port_id, uint16_t queue_id,
 	uint16_t offset)
 {
 	struct rte_eth_dev *dev;
@@ -2942,7 +2942,7 @@ rte_eth_rx_descriptor_status(uint8_t port_id, uint16_t queue_id,
  *  - (-ENOTSUP) if the device does not support this function.
  *  - (-ENODEV) bad port or queue (only if compiled with debug).
  */
-static inline int rte_eth_tx_descriptor_status(uint8_t port_id,
+static inline int rte_eth_tx_descriptor_status(uint16_t port_id,
 	uint16_t queue_id, uint16_t offset)
 {
 	struct rte_eth_dev *dev;
@@ -3026,7 +3026,7 @@ static inline int rte_eth_tx_descriptor_status(uint8_t port_id,
  *   *tx_pkts* parameter when the transmit ring is full or has been filled up.
  */
 static inline uint16_t
-rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id,
 		 struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -3115,7 +3115,7 @@ rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
 #ifndef RTE_ETHDEV_TX_PREPARE_NOOP
 
 static inline uint16_t
-rte_eth_tx_prepare(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_prepare(uint16_t port_id, uint16_t queue_id,
 		struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev;
@@ -3157,7 +3157,8 @@ rte_eth_tx_prepare(uint8_t port_id, uint16_t queue_id,
  */
 
 static inline uint16_t
-rte_eth_tx_prepare(__rte_unused uint8_t port_id, __rte_unused uint16_t queue_id,
+rte_eth_tx_prepare(__rte_unused uint16_t port_id,
+		__rte_unused uint16_t queue_id,
 		__rte_unused struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	return nb_pkts;
@@ -3226,7 +3227,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size);
  *   callback is called for any packets which could not be sent.
  */
 static inline uint16_t
-rte_eth_tx_buffer_flush(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_buffer_flush(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_dev_tx_buffer *buffer)
 {
 	uint16_t sent;
@@ -3278,7 +3279,7 @@ rte_eth_tx_buffer_flush(uint8_t port_id, uint16_t queue_id,
  *     the rest.
  */
 static __rte_always_inline uint16_t
-rte_eth_tx_buffer(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_buffer(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_dev_tx_buffer *buffer, struct rte_mbuf *tx_pkt)
 {
 	buffer->pkts[buffer->length++] = tx_pkt;
@@ -3394,7 +3395,7 @@ rte_eth_tx_buffer_count_callback(struct rte_mbuf **pkts, uint16_t unsent,
  *     are in use.
  */
 int
-rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt);
+rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt);
 
 /**
  * The eth device event type for interrupt, and maybe others in the future.
@@ -3412,7 +3413,7 @@ enum rte_eth_event_type {
 	RTE_ETH_EVENT_MAX       /**< max value of this enum */
 };
 
-typedef int (*rte_eth_dev_cb_fn)(uint8_t port_id,
+typedef int (*rte_eth_dev_cb_fn)(uint16_t port_id,
 		enum rte_eth_event_type event, void *cb_arg, void *ret_param);
 /**< user application callback to be registered for interrupts */
 
@@ -3434,7 +3435,7 @@ typedef int (*rte_eth_dev_cb_fn)(uint8_t port_id,
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_dev_callback_register(uint8_t port_id,
+int rte_eth_dev_callback_register(uint16_t port_id,
 			enum rte_eth_event_type event,
 		rte_eth_dev_cb_fn cb_fn, void *cb_arg);
 
@@ -3455,7 +3456,7 @@ int rte_eth_dev_callback_register(uint8_t port_id,
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_dev_callback_unregister(uint8_t port_id,
+int rte_eth_dev_callback_unregister(uint16_t port_id,
 			enum rte_eth_event_type event,
 		rte_eth_dev_cb_fn cb_fn, void *cb_arg);
 
@@ -3501,7 +3502,7 @@ int _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id);
+int rte_eth_dev_rx_intr_enable(uint16_t port_id, uint16_t queue_id);
 
 /**
  * When lcore wakes up from rx interrupt indicating packet coming, disable rx
@@ -3522,7 +3523,7 @@ int rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id);
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id);
+int rte_eth_dev_rx_intr_disable(uint16_t port_id, uint16_t queue_id);
 
 /**
  * RX Interrupt control per port.
@@ -3541,7 +3542,7 @@ int rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id);
  *   - On success, zero.
  *   - On failure, a negative value.
  */
-int rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data);
+int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
 
 /**
  * RX Interrupt control per queue.
@@ -3564,7 +3565,7 @@ int rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data);
  *   - On success, zero.
  *   - On failure, a negative value.
  */
-int rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			      int epfd, int op, void *data);
 
 /**
@@ -3579,7 +3580,7 @@ int rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int  rte_eth_led_on(uint8_t port_id);
+int  rte_eth_led_on(uint16_t port_id);
 
 /**
  * Turn off the LED on the Ethernet device.
@@ -3593,7 +3594,7 @@ int  rte_eth_led_on(uint8_t port_id);
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int  rte_eth_led_off(uint8_t port_id);
+int  rte_eth_led_off(uint16_t port_id);
 
 /**
  * Get current status of the Ethernet link flow control for Ethernet device
@@ -3607,7 +3608,7 @@ int  rte_eth_led_off(uint8_t port_id);
  *   - (-ENOTSUP) if hardware doesn't support flow control.
  *   - (-ENODEV)  if *port_id* invalid.
  */
-int rte_eth_dev_flow_ctrl_get(uint8_t port_id,
+int rte_eth_dev_flow_ctrl_get(uint16_t port_id,
 			      struct rte_eth_fc_conf *fc_conf);
 
 /**
@@ -3624,7 +3625,7 @@ int rte_eth_dev_flow_ctrl_get(uint8_t port_id,
  *   - (-EINVAL)  if bad parameter
  *   - (-EIO)     if flow control setup failure
  */
-int rte_eth_dev_flow_ctrl_set(uint8_t port_id,
+int rte_eth_dev_flow_ctrl_set(uint16_t port_id,
 			      struct rte_eth_fc_conf *fc_conf);
 
 /**
@@ -3642,7 +3643,7 @@ int rte_eth_dev_flow_ctrl_set(uint8_t port_id,
  *   - (-EINVAL)  if bad parameter
  *   - (-EIO)     if flow control setup failure
  */
-int rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id,
+int rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
 				struct rte_eth_pfc_conf *pfc_conf);
 
 /**
@@ -3663,7 +3664,7 @@ int rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id,
  *   - (-ENOSPC) if no more MAC addresses can be added.
  *   - (-EINVAL) if MAC address is invalid.
  */
-int rte_eth_dev_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
+int rte_eth_dev_mac_addr_add(uint16_t port, struct ether_addr *mac_addr,
 				uint32_t pool);
 
 /**
@@ -3679,7 +3680,7 @@ int rte_eth_dev_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EADDRINUSE) if attempting to remove the default MAC address
  */
-int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr);
+int rte_eth_dev_mac_addr_remove(uint16_t port, struct ether_addr *mac_addr);
 
 /**
  * Set the default MAC address.
@@ -3694,8 +3695,8 @@ int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if MAC address is invalid.
  */
-int rte_eth_dev_default_mac_addr_set(uint8_t port, struct ether_addr *mac_addr);
-
+int rte_eth_dev_default_mac_addr_set(uint16_t port,
+		struct ether_addr *mac_addr);
 
 /**
  * Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
@@ -3712,7 +3713,7 @@ int rte_eth_dev_default_mac_addr_set(uint8_t port, struct ether_addr *mac_addr);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_reta_update(uint8_t port,
+int rte_eth_dev_rss_reta_update(uint16_t port,
 				struct rte_eth_rss_reta_entry64 *reta_conf,
 				uint16_t reta_size);
 
@@ -3731,7 +3732,7 @@ int rte_eth_dev_rss_reta_update(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_reta_query(uint8_t port,
+int rte_eth_dev_rss_reta_query(uint16_t port,
 			       struct rte_eth_rss_reta_entry64 *reta_conf,
 			       uint16_t reta_size);
 
@@ -3753,8 +3754,8 @@ int rte_eth_dev_rss_reta_query(uint8_t port,
   *  - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_uc_hash_table_set(uint8_t port,struct ether_addr *addr,
-					uint8_t on);
+int rte_eth_dev_uc_hash_table_set(uint16_t port, struct ether_addr *addr,
+				  uint8_t on);
 
  /**
  * Updates all unicast hash bitmaps for receiving packet with any Unicast
@@ -3773,7 +3774,7 @@ int rte_eth_dev_uc_hash_table_set(uint8_t port,struct ether_addr *addr,
   *  - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_uc_all_hash_table_set(uint8_t port,uint8_t on);
+int rte_eth_dev_uc_all_hash_table_set(uint16_t port, uint8_t on);
 
 /**
  * Set a traffic mirroring rule on an Ethernet device
@@ -3796,7 +3797,7 @@ int rte_eth_dev_uc_all_hash_table_set(uint8_t port,uint8_t on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if the mr_conf information is not correct.
  */
-int rte_eth_mirror_rule_set(uint8_t port_id,
+int rte_eth_mirror_rule_set(uint16_t port_id,
 			struct rte_eth_mirror_conf *mirror_conf,
 			uint8_t rule_id,
 			uint8_t on);
@@ -3814,7 +3815,7 @@ int rte_eth_mirror_rule_set(uint8_t port_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_mirror_rule_reset(uint8_t port_id,
+int rte_eth_mirror_rule_reset(uint16_t port_id,
 					 uint8_t rule_id);
 
 /**
@@ -3832,7 +3833,7 @@ int rte_eth_mirror_rule_reset(uint8_t port_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 			uint16_t tx_rate);
 
  /**
@@ -3848,7 +3849,7 @@ int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_hash_update(uint8_t port_id,
+int rte_eth_dev_rss_hash_update(uint16_t port_id,
 				struct rte_eth_rss_conf *rss_conf);
 
  /**
@@ -3865,7 +3866,7 @@ int rte_eth_dev_rss_hash_update(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support RSS.
  */
 int
-rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 			      struct rte_eth_rss_conf *rss_conf);
 
  /**
@@ -3886,7 +3887,7 @@ rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
 				struct rte_eth_udp_tunnel *tunnel_udp);
 
  /**
@@ -3908,7 +3909,7 @@ rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
 				   struct rte_eth_udp_tunnel *tunnel_udp);
 
 /**
@@ -3924,7 +3925,8 @@ rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support this filter type.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type);
+int rte_eth_dev_filter_supported(uint16_t port_id,
+		enum rte_filter_type filter_type);
 
 /**
  * Take operations to assigned filter type on an Ethernet device.
@@ -3944,7 +3946,7 @@ int rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_ty
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
+int rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op, void *arg);
 
 /**
@@ -3959,7 +3961,7 @@ int rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
  *   - (-ENODEV) if port identifier is invalid.
  *   - (-ENOTSUP) if hardware doesn't support.
  */
-int rte_eth_dev_get_dcb_info(uint8_t port_id,
+int rte_eth_dev_get_dcb_info(uint16_t port_id,
 			     struct rte_eth_dcb_info *dcb_info);
 
 /**
@@ -3986,7 +3988,7 @@ int rte_eth_dev_get_dcb_info(uint8_t port_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param);
 
 /**
@@ -4014,7 +4016,7 @@ void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param);
 
 /**
@@ -4041,7 +4043,7 @@ void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_tx_callback_fn fn, void *user_param);
 
 /**
@@ -4074,7 +4076,7 @@ void *rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -EINVAL:  The port_id or the queue_id is out of range, or the callback
  *               is NULL or not found for the port/queue.
  */
-int rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
+int rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb);
 
 /**
@@ -4107,7 +4109,7 @@ int rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -EINVAL:  The port_id or the queue_id is out of range, or the callback
  *               is NULL or not found for the port/queue.
  */
-int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
+int rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb);
 
 /**
@@ -4127,7 +4129,7 @@ int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -ENOTSUP: routine is not supported by the device PMD.
  *   - -EINVAL:  The port_id or the queue_id is out of range.
  */
-int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+int rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_rxq_info *qinfo);
 
 /**
@@ -4147,7 +4149,7 @@ int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
  *   - -ENOTSUP: routine is not supported by the device PMD.
  *   - -EINVAL:  The port_id or the queue_id is out of range.
  */
-int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+int rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_txq_info *qinfo);
 
 /**
@@ -4166,7 +4168,7 @@ int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info);
+int rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info);
 
 /**
  * Retrieve size of device EEPROM
@@ -4179,7 +4181,7 @@ int rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_eeprom_length(uint8_t port_id);
+int rte_eth_dev_get_eeprom_length(uint16_t port_id);
 
 /**
  * Retrieve EEPROM and EEPROM attribute
@@ -4195,7 +4197,7 @@ int rte_eth_dev_get_eeprom_length(uint8_t port_id);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
+int rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info);
 
 /**
  * Program EEPROM with provided data
@@ -4211,7 +4213,7 @@ int rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
+int rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info);
 
 /**
  * Set the list of multicast addresses to filter on an Ethernet device.
@@ -4230,7 +4232,7 @@ int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
  *   - (-ENOTSUP) if PMD of *port_id* doesn't support multicast filtering.
  *   - (-ENOSPC) if *port_id* has not enough multicast filtering resources.
  */
-int rte_eth_dev_set_mc_addr_list(uint8_t port_id,
+int rte_eth_dev_set_mc_addr_list(uint16_t port_id,
 				 struct ether_addr *mc_addr_set,
 				 uint32_t nb_mc_addr);
 
@@ -4245,7 +4247,7 @@ int rte_eth_dev_set_mc_addr_list(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_enable(uint8_t port_id);
+int rte_eth_timesync_enable(uint16_t port_id);
 
 /**
  * Disable IEEE1588/802.1AS timestamping for an Ethernet device.
@@ -4258,7 +4260,7 @@ int rte_eth_timesync_enable(uint8_t port_id);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_disable(uint8_t port_id);
+int rte_eth_timesync_disable(uint16_t port_id);
 
 /**
  * Read an IEEE1588/802.1AS RX timestamp from an Ethernet device.
@@ -4277,7 +4279,7 @@ int rte_eth_timesync_disable(uint8_t port_id);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
+int rte_eth_timesync_read_rx_timestamp(uint16_t port_id,
 		struct timespec *timestamp, uint32_t flags);
 
 /**
@@ -4294,7 +4296,7 @@ int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
+int rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
 		struct timespec *timestamp);
 
 /**
@@ -4313,7 +4315,7 @@ int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta);
+int rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta);
 
 /**
  * Read the time from the timesync clock on an Ethernet device.
@@ -4329,7 +4331,7 @@ int rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta);
  * @return
  *   - 0: Success.
  */
-int rte_eth_timesync_read_time(uint8_t port_id, struct timespec *time);
+int rte_eth_timesync_read_time(uint16_t port_id, struct timespec *time);
 
 /**
  * Set the time of the timesync clock on an Ethernet device.
@@ -4348,7 +4350,7 @@ int rte_eth_timesync_read_time(uint8_t port_id, struct timespec *time);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *time);
+int rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *time);
 
 /**
  * Create memzone for HW rings.
@@ -4389,7 +4391,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
 				    struct rte_eth_l2_tunnel_conf *l2_tunnel);
 
 /**
@@ -4416,7 +4418,7 @@ rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
 				  struct rte_eth_l2_tunnel_conf *l2_tunnel,
 				  uint32_t mask,
 				  uint8_t en);
@@ -4434,7 +4436,7 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
 *   - (-ENODEV or -EINVAL) on failure.
 */
 int
-rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id);
+rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id);
 
 /**
 * Get the device name from port id
@@ -4448,7 +4450,7 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id);
 *   - (-EINVAL) on failure.
 */
 int
-rte_eth_dev_get_name_by_port(uint8_t port_id, char *name);
+rte_eth_dev_get_name_by_port(uint16_t port_id, char *name);
 
 /**
  * Check that numbers of Rx and Tx descriptors satisfy descriptors limits from
@@ -4466,7 +4468,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name);
  *   - (0) if successful.
  *   - (-ENOTSUP, -ENODEV or -EINVAL) on failure.
  */
-int rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+int rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
 				     uint16_t *nb_rx_desc,
 				     uint16_t *nb_tx_desc);
 
diff --git a/lib/librte_ether/rte_flow.c b/lib/librte_ether/rte_flow.c
index 2001fbbf4..95d9ee007 100644
--- a/lib/librte_ether/rte_flow.c
+++ b/lib/librte_ether/rte_flow.c
@@ -108,7 +108,7 @@ static const struct rte_flow_desc_data rte_flow_desc_action[] = {
 
 /* Get generic flow operations structure from a port. */
 const struct rte_flow_ops *
-rte_flow_ops_get(uint8_t port_id, struct rte_flow_error *error)
+rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	const struct rte_flow_ops *ops;
diff --git a/lib/librte_ether/rte_flow_driver.h b/lib/librte_ether/rte_flow_driver.h
index 4d95391d8..8573cefa3 100644
--- a/lib/librte_ether/rte_flow_driver.h
+++ b/lib/librte_ether/rte_flow_driver.h
@@ -178,7 +178,7 @@ rte_flow_error_set(struct rte_flow_error *error,
  *   additional details.
  */
 const struct rte_flow_ops *
-rte_flow_ops_get(uint8_t port_id, struct rte_flow_error *error);
+rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_ether/rte_tm.c b/lib/librte_ether/rte_tm.c
index 71679650e..ceac34115 100644
--- a/lib/librte_ether/rte_tm.c
+++ b/lib/librte_ether/rte_tm.c
@@ -40,7 +40,7 @@
 
 /* Get generic traffic manager operations structure from a port. */
 const struct rte_tm_ops *
-rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error)
+rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	const struct rte_tm_ops *ops;
@@ -87,7 +87,7 @@ rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error)
 
 /* Get number of leaf nodes */
 int
-rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
+rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
 	uint32_t *n_leaf_nodes,
 	struct rte_tm_error *error)
 {
@@ -113,7 +113,7 @@ rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
 
 /* Check node type (leaf or non-leaf) */
 int
-rte_tm_node_type_get(uint8_t port_id,
+rte_tm_node_type_get(uint16_t port_id,
 	uint32_t node_id,
 	int *is_leaf,
 	struct rte_tm_error *error)
@@ -124,7 +124,7 @@ rte_tm_node_type_get(uint8_t port_id,
 }
 
 /* Get capabilities */
-int rte_tm_capabilities_get(uint8_t port_id,
+int rte_tm_capabilities_get(uint16_t port_id,
 	struct rte_tm_capabilities *cap,
 	struct rte_tm_error *error)
 {
@@ -134,7 +134,7 @@ int rte_tm_capabilities_get(uint8_t port_id,
 }
 
 /* Get level capabilities */
-int rte_tm_level_capabilities_get(uint8_t port_id,
+int rte_tm_level_capabilities_get(uint16_t port_id,
 	uint32_t level_id,
 	struct rte_tm_level_capabilities *cap,
 	struct rte_tm_error *error)
@@ -145,7 +145,7 @@ int rte_tm_level_capabilities_get(uint8_t port_id,
 }
 
 /* Get node capabilities */
-int rte_tm_node_capabilities_get(uint8_t port_id,
+int rte_tm_node_capabilities_get(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_capabilities *cap,
 	struct rte_tm_error *error)
@@ -156,7 +156,7 @@ int rte_tm_node_capabilities_get(uint8_t port_id,
 }
 
 /* Add WRED profile */
-int rte_tm_wred_profile_add(uint8_t port_id,
+int rte_tm_wred_profile_add(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_wred_params *profile,
 	struct rte_tm_error *error)
@@ -167,7 +167,7 @@ int rte_tm_wred_profile_add(uint8_t port_id,
 }
 
 /* Delete WRED profile */
-int rte_tm_wred_profile_delete(uint8_t port_id,
+int rte_tm_wred_profile_delete(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
 {
@@ -177,7 +177,7 @@ int rte_tm_wred_profile_delete(uint8_t port_id,
 }
 
 /* Add/update shared WRED context */
-int rte_tm_shared_wred_context_add_update(uint8_t port_id,
+int rte_tm_shared_wred_context_add_update(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
@@ -188,7 +188,7 @@ int rte_tm_shared_wred_context_add_update(uint8_t port_id,
 }
 
 /* Delete shared WRED context */
-int rte_tm_shared_wred_context_delete(uint8_t port_id,
+int rte_tm_shared_wred_context_delete(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	struct rte_tm_error *error)
 {
@@ -198,7 +198,7 @@ int rte_tm_shared_wred_context_delete(uint8_t port_id,
 }
 
 /* Add shaper profile */
-int rte_tm_shaper_profile_add(uint8_t port_id,
+int rte_tm_shaper_profile_add(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_shaper_params *profile,
 	struct rte_tm_error *error)
@@ -209,7 +209,7 @@ int rte_tm_shaper_profile_add(uint8_t port_id,
 }
 
 /* Delete WRED profile */
-int rte_tm_shaper_profile_delete(uint8_t port_id,
+int rte_tm_shaper_profile_delete(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
 {
@@ -219,7 +219,7 @@ int rte_tm_shaper_profile_delete(uint8_t port_id,
 }
 
 /* Add shared shaper */
-int rte_tm_shared_shaper_add_update(uint8_t port_id,
+int rte_tm_shared_shaper_add_update(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
@@ -230,7 +230,7 @@ int rte_tm_shared_shaper_add_update(uint8_t port_id,
 }
 
 /* Delete shared shaper */
-int rte_tm_shared_shaper_delete(uint8_t port_id,
+int rte_tm_shared_shaper_delete(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	struct rte_tm_error *error)
 {
@@ -240,7 +240,7 @@ int rte_tm_shared_shaper_delete(uint8_t port_id,
 }
 
 /* Add node to port traffic manager hierarchy */
-int rte_tm_node_add(uint8_t port_id,
+int rte_tm_node_add(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -256,7 +256,7 @@ int rte_tm_node_add(uint8_t port_id,
 }
 
 /* Delete node from traffic manager hierarchy */
-int rte_tm_node_delete(uint8_t port_id,
+int rte_tm_node_delete(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -266,7 +266,7 @@ int rte_tm_node_delete(uint8_t port_id,
 }
 
 /* Suspend node */
-int rte_tm_node_suspend(uint8_t port_id,
+int rte_tm_node_suspend(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -276,7 +276,7 @@ int rte_tm_node_suspend(uint8_t port_id,
 }
 
 /* Resume node */
-int rte_tm_node_resume(uint8_t port_id,
+int rte_tm_node_resume(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -286,7 +286,7 @@ int rte_tm_node_resume(uint8_t port_id,
 }
 
 /* Commit the initial port traffic manager hierarchy */
-int rte_tm_hierarchy_commit(uint8_t port_id,
+int rte_tm_hierarchy_commit(uint16_t port_id,
 	int clear_on_fail,
 	struct rte_tm_error *error)
 {
@@ -296,7 +296,7 @@ int rte_tm_hierarchy_commit(uint8_t port_id,
 }
 
 /* Update node parent  */
-int rte_tm_node_parent_update(uint8_t port_id,
+int rte_tm_node_parent_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -309,7 +309,7 @@ int rte_tm_node_parent_update(uint8_t port_id,
 }
 
 /* Update node private shaper */
-int rte_tm_node_shaper_update(uint8_t port_id,
+int rte_tm_node_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
@@ -320,7 +320,7 @@ int rte_tm_node_shaper_update(uint8_t port_id,
 }
 
 /* Update node shared shapers */
-int rte_tm_node_shared_shaper_update(uint8_t port_id,
+int rte_tm_node_shared_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_shaper_id,
 	int add,
@@ -332,7 +332,7 @@ int rte_tm_node_shared_shaper_update(uint8_t port_id,
 }
 
 /* Update node stats */
-int rte_tm_node_stats_update(uint8_t port_id,
+int rte_tm_node_stats_update(uint16_t port_id,
 	uint32_t node_id,
 	uint64_t stats_mask,
 	struct rte_tm_error *error)
@@ -343,7 +343,7 @@ int rte_tm_node_stats_update(uint8_t port_id,
 }
 
 /* Update WFQ weight mode */
-int rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
+int rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
 	uint32_t node_id,
 	int *wfq_weight_mode,
 	uint32_t n_sp_priorities,
@@ -355,7 +355,7 @@ int rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
 }
 
 /* Update node congestion management mode */
-int rte_tm_node_cman_update(uint8_t port_id,
+int rte_tm_node_cman_update(uint16_t port_id,
 	uint32_t node_id,
 	enum rte_tm_cman_mode cman,
 	struct rte_tm_error *error)
@@ -366,7 +366,7 @@ int rte_tm_node_cman_update(uint8_t port_id,
 }
 
 /* Update node private WRED context */
-int rte_tm_node_wred_context_update(uint8_t port_id,
+int rte_tm_node_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
@@ -377,7 +377,7 @@ int rte_tm_node_wred_context_update(uint8_t port_id,
 }
 
 /* Update node shared WRED context */
-int rte_tm_node_shared_wred_context_update(uint8_t port_id,
+int rte_tm_node_shared_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_wred_context_id,
 	int add,
@@ -389,7 +389,7 @@ int rte_tm_node_shared_wred_context_update(uint8_t port_id,
 }
 
 /* Read and/or clear stats counters for specific node */
-int rte_tm_node_stats_read(uint8_t port_id,
+int rte_tm_node_stats_read(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_stats *stats,
 	uint64_t *stats_mask,
@@ -402,7 +402,7 @@ int rte_tm_node_stats_read(uint8_t port_id,
 }
 
 /* Packet marking - VLAN DEI */
-int rte_tm_mark_vlan_dei(uint8_t port_id,
+int rte_tm_mark_vlan_dei(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -414,7 +414,7 @@ int rte_tm_mark_vlan_dei(uint8_t port_id,
 }
 
 /* Packet marking - IPv4/IPv6 ECN */
-int rte_tm_mark_ip_ecn(uint8_t port_id,
+int rte_tm_mark_ip_ecn(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -426,7 +426,7 @@ int rte_tm_mark_ip_ecn(uint8_t port_id,
 }
 
 /* Packet marking - IPv4/IPv6 DSCP */
-int rte_tm_mark_ip_dscp(uint8_t port_id,
+int rte_tm_mark_ip_dscp(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
diff --git a/lib/librte_ether/rte_tm.h b/lib/librte_ether/rte_tm.h
index ebbfa1eec..2b25a8715 100644
--- a/lib/librte_ether/rte_tm.h
+++ b/lib/librte_ether/rte_tm.h
@@ -1040,7 +1040,7 @@ struct rte_tm_error {
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
+rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
 	uint32_t *n_leaf_nodes,
 	struct rte_tm_error *error);
 
@@ -1064,7 +1064,7 @@ rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_node_type_get(uint8_t port_id,
+rte_tm_node_type_get(uint16_t port_id,
 	uint32_t node_id,
 	int *is_leaf,
 	struct rte_tm_error *error);
@@ -1082,7 +1082,7 @@ rte_tm_node_type_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_capabilities_get(uint8_t port_id,
+rte_tm_capabilities_get(uint16_t port_id,
 	struct rte_tm_capabilities *cap,
 	struct rte_tm_error *error);
 
@@ -1102,7 +1102,7 @@ rte_tm_capabilities_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_level_capabilities_get(uint8_t port_id,
+rte_tm_level_capabilities_get(uint16_t port_id,
 	uint32_t level_id,
 	struct rte_tm_level_capabilities *cap,
 	struct rte_tm_error *error);
@@ -1122,7 +1122,7 @@ rte_tm_level_capabilities_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_node_capabilities_get(uint8_t port_id,
+rte_tm_node_capabilities_get(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_capabilities *cap,
 	struct rte_tm_error *error);
@@ -1147,7 +1147,7 @@ rte_tm_node_capabilities_get(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_n_max
  */
 int
-rte_tm_wred_profile_add(uint8_t port_id,
+rte_tm_wred_profile_add(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_wred_params *profile,
 	struct rte_tm_error *error);
@@ -1170,7 +1170,7 @@ rte_tm_wred_profile_add(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_n_max
  */
 int
-rte_tm_wred_profile_delete(uint8_t port_id,
+rte_tm_wred_profile_delete(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
 
@@ -1201,7 +1201,7 @@ rte_tm_wred_profile_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_shared_wred_context_add_update(uint8_t port_id,
+rte_tm_shared_wred_context_add_update(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
@@ -1225,7 +1225,7 @@ rte_tm_shared_wred_context_add_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_shared_wred_context_delete(uint8_t port_id,
+rte_tm_shared_wred_context_delete(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	struct rte_tm_error *error);
 
@@ -1249,7 +1249,7 @@ rte_tm_shared_wred_context_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_n_max
  */
 int
-rte_tm_shaper_profile_add(uint8_t port_id,
+rte_tm_shaper_profile_add(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_shaper_params *profile,
 	struct rte_tm_error *error);
@@ -1272,7 +1272,7 @@ rte_tm_shaper_profile_add(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_n_max
  */
 int
-rte_tm_shaper_profile_delete(uint8_t port_id,
+rte_tm_shaper_profile_delete(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
 
@@ -1301,7 +1301,7 @@ rte_tm_shaper_profile_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_shared_shaper_add_update(uint8_t port_id,
+rte_tm_shared_shaper_add_update(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
@@ -1324,7 +1324,7 @@ rte_tm_shared_shaper_add_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_shared_shaper_delete(uint8_t port_id,
+rte_tm_shared_shaper_delete(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	struct rte_tm_error *error);
 
@@ -1392,7 +1392,7 @@ rte_tm_shared_shaper_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities
  */
 int
-rte_tm_node_add(uint8_t port_id,
+rte_tm_node_add(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -1425,7 +1425,7 @@ rte_tm_node_add(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_ADD_DELETE
  */
 int
-rte_tm_node_delete(uint8_t port_id,
+rte_tm_node_delete(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1449,7 +1449,7 @@ rte_tm_node_delete(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
  */
 int
-rte_tm_node_suspend(uint8_t port_id,
+rte_tm_node_suspend(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1472,7 +1472,7 @@ rte_tm_node_suspend(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
  */
 int
-rte_tm_node_resume(uint8_t port_id,
+rte_tm_node_resume(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1513,7 +1513,7 @@ rte_tm_node_resume(uint8_t port_id,
  * @see rte_tm_node_delete()
  */
 int
-rte_tm_hierarchy_commit(uint8_t port_id,
+rte_tm_hierarchy_commit(uint16_t port_id,
 	int clear_on_fail,
 	struct rte_tm_error *error);
 
@@ -1549,7 +1549,7 @@ rte_tm_hierarchy_commit(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL
  */
 int
-rte_tm_node_parent_update(uint8_t port_id,
+rte_tm_node_parent_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -1578,7 +1578,7 @@ rte_tm_node_parent_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_private_n_max
  */
 int
-rte_tm_node_shaper_update(uint8_t port_id,
+rte_tm_node_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
@@ -1605,7 +1605,7 @@ rte_tm_node_shaper_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_node_shared_shaper_update(uint8_t port_id,
+rte_tm_node_shared_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_shaper_id,
 	int add,
@@ -1632,7 +1632,7 @@ rte_tm_node_shared_shaper_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_STATS
  */
 int
-rte_tm_node_stats_update(uint8_t port_id,
+rte_tm_node_stats_update(uint16_t port_id,
 	uint32_t node_id,
 	uint64_t stats_mask,
 	struct rte_tm_error *error);
@@ -1660,7 +1660,7 @@ rte_tm_node_stats_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_N_SP_PRIORITIES
  */
 int
-rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
+rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
 	uint32_t node_id,
 	int *wfq_weight_mode,
 	uint32_t n_sp_priorities,
@@ -1683,7 +1683,7 @@ rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_CMAN
  */
 int
-rte_tm_node_cman_update(uint8_t port_id,
+rte_tm_node_cman_update(uint16_t port_id,
 	uint32_t node_id,
 	enum rte_tm_cman_mode cman,
 	struct rte_tm_error *error);
@@ -1707,7 +1707,7 @@ rte_tm_node_cman_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_private_n_max
 */
 int
-rte_tm_node_wred_context_update(uint8_t port_id,
+rte_tm_node_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
@@ -1732,7 +1732,7 @@ rte_tm_node_wred_context_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_node_shared_wred_context_update(uint8_t port_id,
+rte_tm_node_shared_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_wred_context_id,
 	int add,
@@ -1764,7 +1764,7 @@ rte_tm_node_shared_wred_context_update(uint8_t port_id,
  * @see enum rte_tm_stats_type
  */
 int
-rte_tm_node_stats_read(uint8_t port_id,
+rte_tm_node_stats_read(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_stats *stats,
 	uint64_t *stats_mask,
@@ -1801,7 +1801,7 @@ rte_tm_node_stats_read(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_vlan_dei_supported
  */
 int
-rte_tm_mark_vlan_dei(uint8_t port_id,
+rte_tm_mark_vlan_dei(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -1851,7 +1851,7 @@ rte_tm_mark_vlan_dei(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_ip_ecn_sctp_supported
  */
 int
-rte_tm_mark_ip_ecn(uint8_t port_id,
+rte_tm_mark_ip_ecn(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -1899,7 +1899,7 @@ rte_tm_mark_ip_ecn(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_ip_dscp_supported
  */
 int
-rte_tm_mark_ip_dscp(uint8_t port_id,
+rte_tm_mark_ip_dscp(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
diff --git a/lib/librte_ether/rte_tm_driver.h b/lib/librte_ether/rte_tm_driver.h
index a5b698fe0..b2e8ccf80 100644
--- a/lib/librte_ether/rte_tm_driver.h
+++ b/lib/librte_ether/rte_tm_driver.h
@@ -357,7 +357,7 @@ rte_tm_error_set(struct rte_tm_error *error,
  *   success, NULL otherwise.
  */
 const struct rte_tm_ops *
-rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error);
+rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h
index 37deb4727..87812cd55 100644
--- a/lib/librte_kni/rte_kni.h
+++ b/lib/librte_kni/rte_kni.h
@@ -63,13 +63,13 @@ struct rte_mbuf;
  * Structure which has the function pointers for KNI interface.
  */
 struct rte_kni_ops {
-	uint8_t port_id; /* Port ID */
+	uint16_t port_id; /* Port ID */
 
 	/* Pointer to function of changing MTU */
-	int (*change_mtu)(uint8_t port_id, unsigned new_mtu);
+	int (*change_mtu)(uint16_t port_id, unsigned int new_mtu);
 
 	/* Pointer to function of configuring network interface */
-	int (*config_network_if)(uint8_t port_id, uint8_t if_up);
+	int (*config_network_if)(uint16_t port_id, uint8_t if_up);
 };
 
 /**
diff --git a/lib/librte_latencystats/rte_latencystats.c b/lib/librte_latencystats/rte_latencystats.c
index ce029a12c..d6ad13c4e 100644
--- a/lib/librte_latencystats/rte_latencystats.c
+++ b/lib/librte_latencystats/rte_latencystats.c
@@ -135,7 +135,7 @@ rte_latencystats_fill_values(struct rte_metric_value *values)
 }
 
 static uint16_t
-add_time_stamps(uint8_t pid __rte_unused,
+add_time_stamps(uint16_t pid __rte_unused,
 		uint16_t qid __rte_unused,
 		struct rte_mbuf **pkts,
 		uint16_t nb_pkts,
@@ -165,7 +165,7 @@ add_time_stamps(uint8_t pid __rte_unused,
 }
 
 static uint16_t
-calc_latency(uint8_t pid __rte_unused,
+calc_latency(uint16_t pid __rte_unused,
 		uint16_t qid __rte_unused,
 		struct rte_mbuf **pkts,
 		uint16_t nb_pkts,
@@ -226,10 +226,10 @@ rte_latencystats_init(uint64_t app_samp_intvl,
 		rte_latency_stats_flow_type_fn user_cb)
 {
 	unsigned int i;
-	uint8_t pid;
+	uint16_t pid;
 	uint16_t qid;
 	struct rxtx_cbs *cbs = NULL;
-	const uint8_t nb_ports = rte_eth_dev_count();
+	const uint16_t nb_ports = rte_eth_dev_count();
 	const char *ptr_strings[NUM_LATENCY_STATS] = {0};
 	const struct rte_memzone *mz = NULL;
 	const unsigned int flags = 0;
@@ -290,11 +290,11 @@ rte_latencystats_init(uint64_t app_samp_intvl,
 int
 rte_latencystats_uninit(void)
 {
-	uint8_t pid;
+	uint16_t pid;
 	uint16_t qid;
 	int ret = 0;
 	struct rxtx_cbs *cbs = NULL;
-	const uint8_t nb_ports = rte_eth_dev_count();
+	const uint16_t nb_ports = rte_eth_dev_count();
 
 	/** De register Rx/Tx callbacks */
 	for (pid = 0; pid < nb_ports; pid++) {
diff --git a/lib/librte_pdump/Makefile b/lib/librte_pdump/Makefile
index 1c03bcbb7..6b21c62e5 100644
--- a/lib/librte_pdump/Makefile
+++ b/lib/librte_pdump/Makefile
@@ -40,7 +40,7 @@ LDLIBS += -lpthread
 
 EXPORT_MAP := rte_pdump_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_PDUMP) := rte_pdump.c
diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c
index 729e79a36..e6182d35c 100644
--- a/lib/librte_pdump/rte_pdump.c
+++ b/lib/librte_pdump/rte_pdump.c
@@ -207,7 +207,7 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
 }
 
 static uint16_t
-pdump_rx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
+pdump_rx(uint16_t port __rte_unused, uint16_t qidx __rte_unused,
 	struct rte_mbuf **pkts, uint16_t nb_pkts,
 	uint16_t max_pkts __rte_unused,
 	void *user_params)
@@ -217,7 +217,7 @@ pdump_rx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
 }
 
 static uint16_t
-pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
+pdump_tx(uint16_t port __rte_unused, uint16_t qidx __rte_unused,
 		struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
 {
 	pdump_copy(pkts, nb_pkts, user_params);
@@ -225,7 +225,7 @@ pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
 }
 
 static int
-pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
+pdump_regitser_rx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
 				struct rte_ring *ring, struct rte_mempool *mp,
 				uint16_t operation)
 {
@@ -279,7 +279,7 @@ pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
 }
 
 static int
-pdump_regitser_tx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
+pdump_regitser_tx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
 				struct rte_ring *ring, struct rte_mempool *mp,
 				uint16_t operation)
 {
@@ -337,7 +337,7 @@ static int
 set_pdump_rxtx_cbs(struct pdump_request *p)
 {
 	uint16_t nb_rx_q = 0, nb_tx_q = 0, end_q, queue;
-	uint8_t port;
+	uint16_t port;
 	int ret = 0;
 	uint32_t flags;
 	uint16_t operation;
@@ -764,7 +764,7 @@ pdump_validate_flags(uint32_t flags)
 }
 
 static int
-pdump_validate_port(uint8_t port, char *name)
+pdump_validate_port(uint16_t port, char *name)
 {
 	int ret = 0;
 
@@ -828,7 +828,7 @@ pdump_prepare_client_request(char *device, uint16_t queue,
 }
 
 int
-rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
+rte_pdump_enable(uint16_t port, uint16_t queue, uint32_t flags,
 			struct rte_ring *ring,
 			struct rte_mempool *mp,
 			void *filter)
@@ -876,7 +876,7 @@ rte_pdump_enable_by_deviceid(char *device_id, uint16_t queue,
 }
 
 int
-rte_pdump_disable(uint8_t port, uint16_t queue, uint32_t flags)
+rte_pdump_disable(uint16_t port, uint16_t queue, uint32_t flags)
 {
 	int ret = 0;
 	char name[DEVICE_ID_SIZE];
diff --git a/lib/librte_pdump/rte_pdump.h b/lib/librte_pdump/rte_pdump.h
index ba6e39b09..4ec0a106f 100644
--- a/lib/librte_pdump/rte_pdump.h
+++ b/lib/librte_pdump/rte_pdump.h
@@ -113,7 +113,7 @@ rte_pdump_uninit(void);
  */
 
 int
-rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
+rte_pdump_enable(uint16_t port, uint16_t queue, uint32_t flags,
 		struct rte_ring *ring,
 		struct rte_mempool *mp,
 		void *filter);
@@ -136,7 +136,7 @@ rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
  */
 
 int
-rte_pdump_disable(uint8_t port, uint16_t queue, uint32_t flags);
+rte_pdump_disable(uint16_t port, uint16_t queue, uint32_t flags);
 
 /**
  * Enables packet capturing on given device id and queue.
diff --git a/lib/librte_port/rte_port_ethdev.c b/lib/librte_port/rte_port_ethdev.c
index d5c5fba55..4ed10f276 100644
--- a/lib/librte_port/rte_port_ethdev.c
+++ b/lib/librte_port/rte_port_ethdev.c
@@ -60,7 +60,7 @@ struct rte_port_ethdev_reader {
 	struct rte_port_in_stats stats;
 
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
@@ -156,7 +156,7 @@ struct rte_port_ethdev_writer {
 	uint16_t tx_buf_count;
 	uint64_t bsz_mask;
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
@@ -337,7 +337,7 @@ struct rte_port_ethdev_writer_nodrop {
 	uint64_t bsz_mask;
 	uint64_t n_retries;
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
diff --git a/lib/librte_port/rte_port_ethdev.h b/lib/librte_port/rte_port_ethdev.h
index 201a79e41..f5ed9ab2d 100644
--- a/lib/librte_port/rte_port_ethdev.h
+++ b/lib/librte_port/rte_port_ethdev.h
@@ -54,7 +54,7 @@ extern "C" {
 /** ethdev_reader port parameters */
 struct rte_port_ethdev_reader_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
@@ -66,7 +66,7 @@ extern struct rte_port_in_ops rte_port_ethdev_reader_ops;
 /** ethdev_writer port parameters */
 struct rte_port_ethdev_writer_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
@@ -82,7 +82,7 @@ extern struct rte_port_out_ops rte_port_ethdev_writer_ops;
 /** ethdev_writer_nodrop port parameters */
 struct rte_port_ethdev_writer_nodrop_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
-- 
2.13.3

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v6 1/5] net/bonding: remove bonding APIs using ABI versioning
  2017-09-29  7:17  4%       ` [dpdk-dev] [PATCH v6 0/5] " Zhiyong Yang
@ 2017-09-29  7:17  7%         ` Zhiyong Yang
  2017-09-29  7:17  1%         ` [dpdk-dev] [PATCH v6 2/5] ethdev: increase port_id range Zhiyong Yang
  2017-10-06  2:15  0%         ` [dpdk-dev] [PATCH v6 0/5] " Ferruh Yigit
  2 siblings, 0 replies; 200+ results
From: Zhiyong Yang @ 2017-09-29  7:17 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, thomas, Zhiyong Yang

There are two bonding APIs using ABI versioning, and both have
port_id as parameter. Since we are already breaking ABI, no need
to keep older versions of APIs.

Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
 drivers/net/bonding/rte_eth_bond_8023ad.c    | 149 +--------------------------
 drivers/net/bonding/rte_eth_bond_8023ad.h    |  18 ----
 drivers/net/bonding/rte_eth_bond_version.map |   4 -
 3 files changed, 2 insertions(+), 169 deletions(-)

diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index 20b5a8961..c2b9e053c 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -1111,27 +1111,6 @@ bond_mode_8023ad_conf_get(struct rte_eth_dev *dev,
 	conf->tx_period_ms = mode4->tx_period_timeout / ms_ticks;
 	conf->update_timeout_ms = mode4->update_timeout_us / 1000;
 	conf->rx_marker_period_ms = mode4->rx_marker_timeout / ms_ticks;
-}
-
-static void
-bond_mode_8023ad_conf_get_v1607(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	bond_mode_8023ad_conf_get(dev, conf);
-	conf->slowrx_cb = mode4->slowrx_cb;
-}
-
-static void
-bond_mode_8023ad_conf_get_v1708(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	bond_mode_8023ad_conf_get(dev, conf);
 	conf->slowrx_cb = mode4->slowrx_cb;
 	conf->agg_selection = mode4->agg_selection;
 }
@@ -1171,27 +1150,6 @@ bond_mode_8023ad_conf_assign(struct mode8023ad_private *mode4,
 	mode4->dedicated_queues.tx_qid = UINT16_MAX;
 }
 
-static void
-bond_mode_8023ad_setup_v20(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_bond_8023ad_conf def_conf;
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	if (conf == NULL) {
-		conf = &def_conf;
-		bond_mode_8023ad_conf_get_default(conf);
-	}
-
-	bond_mode_8023ad_stop(dev);
-	bond_mode_8023ad_conf_assign(mode4, conf);
-
-	if (dev->data->dev_started)
-		bond_mode_8023ad_start(dev);
-}
-
-
 void
 bond_mode_8023ad_setup(struct rte_eth_dev *dev,
 		struct rte_eth_bond_8023ad_conf *conf)
@@ -1207,27 +1165,6 @@ bond_mode_8023ad_setup(struct rte_eth_dev *dev,
 
 	bond_mode_8023ad_stop(dev);
 	bond_mode_8023ad_conf_assign(mode4, conf);
-
-
-	if (dev->data->dev_started)
-		bond_mode_8023ad_start(dev);
-}
-
-static void
-bond_mode_8023ad_setup_v1708(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_bond_8023ad_conf def_conf;
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	if (conf == NULL) {
-		conf = &def_conf;
-		bond_mode_8023ad_conf_get_default(conf);
-	}
-
-	bond_mode_8023ad_stop(dev);
-	bond_mode_8023ad_conf_assign(mode4, conf);
 	mode4->slowrx_cb = conf->slowrx_cb;
 	mode4->agg_selection = AGG_STABLE;
 
@@ -1358,7 +1295,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
 }
 
 int
-rte_eth_bond_8023ad_conf_get_v20(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1373,46 +1310,6 @@ rte_eth_bond_8023ad_conf_get_v20(uint8_t port_id,
 	bond_mode_8023ad_conf_get(bond_dev, conf);
 	return 0;
 }
-VERSION_SYMBOL(rte_eth_bond_8023ad_conf_get, _v20, 2.0);
-
-int
-rte_eth_bond_8023ad_conf_get_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-
-	if (valid_bonded_port_id(port_id) != 0)
-		return -EINVAL;
-
-	if (conf == NULL)
-		return -EINVAL;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_conf_get_v1607(bond_dev, conf);
-	return 0;
-}
-VERSION_SYMBOL(rte_eth_bond_8023ad_conf_get, _v1607, 16.07);
-
-int
-rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-
-	if (valid_bonded_port_id(port_id) != 0)
-		return -EINVAL;
-
-	if (conf == NULL)
-		return -EINVAL;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_conf_get_v1708(bond_dev, conf);
-	return 0;
-}
-MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_conf_get(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf),
-		rte_eth_bond_8023ad_conf_get_v1708);
-BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_conf_get, _v1708, 17.08);
 
 int
 rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
@@ -1483,25 +1380,7 @@ bond_8023ad_setup_validate(uint8_t port_id,
 }
 
 int
-rte_eth_bond_8023ad_setup_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-	int err;
-
-	err = bond_8023ad_setup_validate(port_id, conf);
-	if (err != 0)
-		return err;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_setup_v20(bond_dev, conf);
-
-	return 0;
-}
-VERSION_SYMBOL(rte_eth_bond_8023ad_setup, _v20, 2.0);
-
-int
-rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1516,30 +1395,6 @@ rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
 
 	return 0;
 }
-VERSION_SYMBOL(rte_eth_bond_8023ad_setup, _v1607, 16.07);
-
-
-int
-rte_eth_bond_8023ad_setup_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-	int err;
-
-	err = bond_8023ad_setup_validate(port_id, conf);
-	if (err != 0)
-		return err;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_setup_v1708(bond_dev, conf);
-
-	return 0;
-}
-BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_setup, _v1708, 17.08);
-MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf),
-		rte_eth_bond_8023ad_setup_v1708);
-
 
 
 
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h
index 1d353c734..d609745e0 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.h
@@ -194,15 +194,6 @@ struct rte_eth_bond_8023ad_slave_info {
 int
 rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
  * @internal
@@ -218,15 +209,6 @@ rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
 int
 rte_eth_bond_8023ad_setup(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
  * @internal
diff --git a/drivers/net/bonding/rte_eth_bond_version.map b/drivers/net/bonding/rte_eth_bond_version.map
index 0f4e847da..ec3374b0f 100644
--- a/drivers/net/bonding/rte_eth_bond_version.map
+++ b/drivers/net/bonding/rte_eth_bond_version.map
@@ -1,8 +1,6 @@
 DPDK_2.0 {
 	global:
 
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
 	rte_eth_bond_active_slaves_get;
 	rte_eth_bond_create;
 	rte_eth_bond_link_monitoring_set;
@@ -39,8 +37,6 @@ DPDK_16.07 {
 	rte_eth_bond_8023ad_ext_distrib;
 	rte_eth_bond_8023ad_ext_distrib_get;
 	rte_eth_bond_8023ad_ext_slowtx;
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
 
 } DPDK_16.04;
 
-- 
2.13.3

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v6 0/5] increase port_id range
  2017-09-25  3:22  4%     ` [dpdk-dev] [PATCH v5 0/5] " Zhiyong Yang
  2017-09-25  3:22  7%       ` [dpdk-dev] [PATCH v5 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
  2017-09-25  3:22  1%       ` [dpdk-dev] [PATCH v5 2/5] ethdev: increase port_id range Zhiyong Yang
@ 2017-09-29  7:17  4%       ` Zhiyong Yang
  2017-09-29  7:17  7%         ` [dpdk-dev] [PATCH v6 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
                           ` (2 more replies)
  2 siblings, 3 replies; 200+ results
From: Zhiyong Yang @ 2017-09-29  7:17 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, thomas

port_id is currently defined as uint8_t, which is limited to the range
0 to 255. A larger range is required for vdev scalability.

It is necessary for a redefinition of port_id to extend it from
1 bytes to 2 bytes. All ethdev APIs and usages related to port_id will
be changed at the same time.

Discussion about port_id is the following thread.
http://www.dpdk.org/dev/patchwork/patch/23208/

Changes in V2:
1. cover more PMDs to increase port_id range.
2. cover more examples to increase port_id range.
3. add 17.11 release note.

Changes in V3:
1.  cover mlx4 and mlx5.
2.  add to increase port_id range in test code.
3.  The patch "librte_mbuf: modify port initialization value" is merged
    into the patchset.

Changes in V4:
1.  Add a patch to remove bonding APIs using ABI versioning according to
    Ferruh's comments.
2.  Unify to use typedef portid_t in testpmd code.
3.  update release note deprecation doc in 2/5
4.  fix some issues according to comments.

Changes in V5:
1.  For 1/5, bond_mode_8023ad_conf_get_v1708() and bond_mode_8023ad_conf
    _get() are merged into one function bond_mode_8023ad_conf_get.

Changes in V6:
1.  For 2/5, remove the unnecessary LIBABIVER in Makefile and update
    the release notes "Shared Library Versions".
    Note: The patchset have dependency on the following patch.
    http://www.dpdk.org/dev/patchwork/patch/28738/
    http://www.dpdk.org/dev/patchwork/patch/29219/

Note: 3/5 and 4/5 patches' building depends on 2/5 patch since 2/5 patch
breaks lib/PMD API/ABI.

Zhiyong Yang (5):
  net/bonding: remove bonding APIs using ABI versioning
  ethdev: increase port_id range
  examples: increase port_id range
  test: increase port_id range
  librte_mbuf: modify port initialization value

 app/pdump/main.c                                   |   2 +-
 app/test-pmd/cmdline.c                             |   6 +-
 app/test-pmd/config.c                              |   4 +-
 app/test-pmd/ieee1588fwd.c                         |  26 +--
 app/test-pmd/parameters.c                          |   2 +-
 app/test-pmd/rxonly.c                              |   2 +-
 app/test-pmd/testpmd.c                             |  18 +-
 app/test-pmd/testpmd.h                             |   4 +-
 doc/guides/rel_notes/deprecation.rst               |   6 -
 doc/guides/rel_notes/release_17_11.rst             |  24 +-
 drivers/net/af_packet/rte_eth_af_packet.c          |   2 +-
 drivers/net/ark/ark_ethdev.c                       |   2 +-
 drivers/net/avp/avp_ethdev.c                       |   2 +-
 drivers/net/bnx2x/bnx2x_rxtx.h                     |   4 +-
 drivers/net/bnxt/Makefile                          |   2 +-
 drivers/net/bnxt/bnxt.h                            |   2 +-
 drivers/net/bnxt/bnxt_ethdev.c                     |   4 +-
 drivers/net/bnxt/bnxt_rxq.h                        |   2 +-
 drivers/net/bnxt/bnxt_txq.h                        |   2 +-
 drivers/net/bnxt/rte_pmd_bnxt.c                    |  32 +--
 drivers/net/bnxt/rte_pmd_bnxt.h                    |  32 +--
 drivers/net/bonding/Makefile                       |   2 +-
 drivers/net/bonding/rte_eth_bond.h                 |  41 ++--
 drivers/net/bonding/rte_eth_bond_8023ad.c          | 203 +++--------------
 drivers/net/bonding/rte_eth_bond_8023ad.h          |  48 ++--
 drivers/net/bonding/rte_eth_bond_8023ad_private.h  |  12 +-
 drivers/net/bonding/rte_eth_bond_alb.c             |   6 +-
 drivers/net/bonding/rte_eth_bond_alb.h             |   6 +-
 drivers/net/bonding/rte_eth_bond_api.c             |  64 +++---
 drivers/net/bonding/rte_eth_bond_args.c            |   2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c             |  62 +++---
 drivers/net/bonding/rte_eth_bond_private.h         |  45 ++--
 drivers/net/bonding/rte_eth_bond_version.map       |   4 -
 drivers/net/e1000/em_ethdev.c                      |   2 +-
 drivers/net/e1000/em_rxtx.c                        |   4 +-
 drivers/net/e1000/igb_rxtx.c                       |   4 +-
 drivers/net/failsafe/failsafe_ether.c              |   4 +-
 drivers/net/failsafe/failsafe_private.h            |   4 +-
 drivers/net/fm10k/fm10k.h                          |   6 +-
 drivers/net/i40e/Makefile                          |   2 +-
 drivers/net/i40e/i40e_ethdev.c                     |   5 +-
 drivers/net/i40e/i40e_rxtx.h                       |   4 +-
 drivers/net/i40e/rte_pmd_i40e.c                    |  50 ++---
 drivers/net/i40e/rte_pmd_i40e.h                    |  48 ++--
 drivers/net/ixgbe/Makefile                         |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c                   |   5 +-
 drivers/net/ixgbe/ixgbe_rxtx.h                     |   4 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c                  |  60 ++---
 drivers/net/ixgbe/rte_pmd_ixgbe.h                  |  64 +++---
 drivers/net/mlx5/mlx5_rxtx.h                       |   4 +-
 drivers/net/nfp/nfp_net.c                          |  16 +-
 drivers/net/nfp/nfp_net_pmd.h                      |   2 +-
 drivers/net/null/rte_eth_null.c                    |   2 +-
 drivers/net/pcap/rte_eth_pcap.c                    |   2 +-
 drivers/net/qede/qede_if.h                         |   2 +-
 drivers/net/ring/rte_eth_ring.c                    |   2 +-
 drivers/net/szedata2/rte_eth_szedata2.c            |   2 +-
 drivers/net/thunderx/nicvf_struct.h                |   2 +-
 drivers/net/vhost/Makefile                         |   2 +-
 drivers/net/vhost/rte_eth_vhost.c                  |   6 +-
 drivers/net/vhost/rte_eth_vhost.h                  |   4 +-
 drivers/net/virtio/virtio_pci.h                    |   2 +-
 drivers/net/virtio/virtio_rxtx.h                   |   6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h                 |   4 +-
 examples/bond/main.c                               |  16 +-
 examples/distributor/main.c                        |  26 +--
 examples/exception_path/main.c                     |  35 ++-
 examples/ip_fragmentation/main.c                   |  33 +--
 examples/ip_pipeline/init.c                        |   4 +-
 examples/ip_reassembly/main.c                      |  34 +--
 examples/ipv4_multicast/main.c                     |  30 +--
 examples/kni/main.c                                |  30 +--
 examples/l2fwd-cat/l2fwd-cat.c                     |  12 +-
 examples/l2fwd-jobstats/main.c                     |  34 +--
 examples/l2fwd-keepalive/main.c                    |  50 ++---
 examples/l2fwd/main.c                              |  47 ++--
 examples/l3fwd-acl/main.c                          |   9 +-
 examples/l3fwd-power/main.c                        |  60 ++---
 examples/l3fwd-vf/main.c                           |  50 +++--
 examples/l3fwd/l3fwd.h                             |  10 +-
 examples/l3fwd/l3fwd_common.h                      |   2 +-
 examples/l3fwd/l3fwd_em.c                          |   2 +-
 examples/l3fwd/l3fwd_em.h                          |   6 +-
 examples/l3fwd/l3fwd_em_hlm.h                      |  14 +-
 examples/l3fwd/l3fwd_lpm.c                         |  15 +-
 examples/l3fwd/l3fwd_lpm.h                         |   4 +-
 examples/l3fwd/l3fwd_lpm_neon.h                    |   4 +-
 examples/l3fwd/l3fwd_lpm_sse.h                     |   4 +-
 examples/l3fwd/main.c                              |  30 +--
 examples/link_status_interrupt/main.c              |   9 +-
 examples/load_balancer/config.c                    |  14 +-
 examples/load_balancer/init.c                      |  34 ++-
 examples/load_balancer/main.h                      |  11 +-
 examples/load_balancer/runtime.c                   |  12 +-
 .../client_server_mp/mp_client/client.c            |  17 +-
 .../client_server_mp/mp_server/args.c              |   4 +-
 .../client_server_mp/mp_server/args.h              |   2 +-
 .../client_server_mp/mp_server/init.c              |  11 +-
 .../client_server_mp/mp_server/main.c              |   2 +-
 .../multi_process/client_server_mp/shared/common.h |   4 +-
 examples/multi_process/l2fwd_fork/main.c           |  23 +-
 examples/netmap_compat/lib/compat_netmap.c         |  52 +++--
 examples/netmap_compat/lib/compat_netmap.h         |   2 +-
 examples/packet_ordering/main.c                    |  19 +-
 examples/performance-thread/l3fwd-thread/main.c    | 143 ++++++------
 examples/ptpclient/ptpclient.c                     |   4 +-
 examples/qos_sched/args.c                          |  12 +-
 examples/qos_sched/init.c                          |  31 +--
 examples/qos_sched/main.c                          |  14 +-
 examples/qos_sched/main.h                          |  24 +-
 examples/qos_sched/stats.c                         |  16 +-
 examples/quota_watermark/qw/init.c                 |   4 +-
 examples/quota_watermark/qw/main.c                 |  10 +-
 examples/rxtx_callbacks/main.c                     |   8 +-
 examples/server_node_efd/server/main.c             |   2 +-
 examples/server_node_efd/shared/common.h           |   4 +-
 examples/skeleton/basicfwd.c                       |  12 +-
 examples/vhost/main.c                              |  10 +-
 lib/librte_bitratestats/Makefile                   |   2 +-
 lib/librte_bitratestats/rte_bitrate.c              |   2 +-
 lib/librte_bitratestats/rte_bitrate.h              |   2 +-
 lib/librte_ether/Makefile                          |   2 +-
 lib/librte_ether/rte_ethdev.c                      | 241 +++++++++++----------
 lib/librte_ether/rte_ethdev.h                      | 238 ++++++++++----------
 lib/librte_ether/rte_flow.c                        |   2 +-
 lib/librte_ether/rte_flow_driver.h                 |   2 +-
 lib/librte_ether/rte_tm.c                          |  62 +++---
 lib/librte_ether/rte_tm.h                          |  60 ++---
 lib/librte_ether/rte_tm_driver.h                   |   2 +-
 lib/librte_kni/rte_kni.h                           |   6 +-
 lib/librte_latencystats/rte_latencystats.c         |  12 +-
 lib/librte_mbuf/rte_mbuf.c                         |   2 +-
 lib/librte_mbuf/rte_mbuf.h                         |   4 +-
 lib/librte_pdump/Makefile                          |   2 +-
 lib/librte_pdump/rte_pdump.c                       |  16 +-
 lib/librte_pdump/rte_pdump.h                       |   4 +-
 lib/librte_port/rte_port_ethdev.c                  |   6 +-
 lib/librte_port/rte_port_ethdev.h                  |   6 +-
 test/test/test_kni.c                               |  12 +-
 test/test/test_link_bonding.c                      |  40 ++--
 test/test/test_link_bonding_mode4.c                |  12 +-
 test/test/test_pmd_perf.c                          |  30 +--
 test/test/test_pmd_ring_perf.c                     |   2 +-
 test/test/virtual_pmd.c                            |  24 +-
 test/test/virtual_pmd.h                            |  28 +--
 145 files changed, 1394 insertions(+), 1499 deletions(-)

-- 
2.13.3

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v5 0/3] ethdev new offloads API
  2017-09-17  6:54  4%   ` [dpdk-dev] [PATCH v4 0/3] " Shahaf Shuler
  2017-09-18  7:51  0%     ` Andrew Rybchenko
@ 2017-09-28 18:54  4%     ` Shahaf Shuler
  2017-10-04  8:17  4%       ` [dpdk-dev] [PATCH v6 0/4] " Shahaf Shuler
  1 sibling, 1 reply; 200+ results
From: Shahaf Shuler @ 2017-09-28 18:54 UTC (permalink / raw)
  To: ferruh.yigit, thomas; +Cc: arybchenko, konstantin.ananyev, jerin.jacob, dev

Tx offloads configuration is per queue. Tx offloads are enabled by default, 
and can be disabled using ETH_TXQ_FLAGS_NO* flags. 
This behaviour is not consistent with the Rx side where the Rx offloads
configuration is per port. Rx offloads are disabled by default and enabled 
according to bit field in rte_eth_rxmode structure.

Moreover, considering more Tx and Rx offloads will be added 
over time, the cost of managing them all inside the PMD will be tremendous,
as the PMD will need to check the matching for the entire offload set 
for each mbuf it handles.
In addition, on the current approach each Rx offload added breaks the
ABI compatibility as it requires to add entries to existing bit-fields.
 
The series address above issues by defining a new offloads API.
In the new API, offloads are divided into per-port and per-queue offloads,
with a corresponding capability for each.
The offloads are disabled by default. Each offload can be enabled or
disabled using the existing DEV_TX_OFFLOADS_* or DEV_RX_OFFLOADS_* flags.
Such API will enable to easily add or remove offloads, without breaking the
ABI compatibility.

In order to provide a smooth transition between the APIs the following actions
were taken:
*  The old offloads API is kept for the meanwhile.
*  Helper function which copy from old to new API were added to ethdev,
   enabling the PMD to support only one of the APIs.
*  Helper function which copy from new to old API were also added,
   to enable application to use the new API with PMD which still supports
   the old one.

Per discussion made on the RFC of this series [1], the integration plan which was
decided is to do the transition in two phases:
* ethdev API will move on 17.11.
* Apps and examples will move on 18.02.

This to enable PMD maintainers sufficient time to adopt the new API.

[1]
http://dpdk.org/ml/archives/dev/2017-August/072643.html

on v5:
 - fix documentation.
 - fix comments on port offloads configuration.

on v4:
 - Added another patch for documentation.
 - Fixed ETH_TXQ_FLAGS_IGNORE flag override.
 - clarify the description of DEV_TX_OFFLOAD_MBUF_FAST_FREE offload.

on v3:
 - Introduce the DEV_TX_OFFLOAD_MBUF_FAST_FREE to act as an equivalent
   for the no refcnt and single mempool flags.
 - Fix features documentation.
 - Fix comment style.

on v2:
 - Taking new approach of dividing offloads into per-queue and per-port one.
 - Postpone the Tx/Rx public struct renaming to 18.02
 - squash the helper functions into the Rx/Tx offloads intro patches.

Shahaf Shuler (3):
  ethdev: introduce Rx queue offloads API
  ethdev: introduce Tx queue offloads API
  doc: add details on ethdev offloads API

 doc/guides/nics/features.rst            |  66 +++++---
 doc/guides/prog_guide/poll_mode_drv.rst |  20 +++
 lib/librte_ether/rte_ethdev.c           | 223 +++++++++++++++++++++++++--
 lib/librte_ether/rte_ethdev.h           |  89 ++++++++++-
 4 files changed, 358 insertions(+), 40 deletions(-)

Series-reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
-- 
2.12.0

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] DPDK Community Survey 2017
  @ 2017-09-28 13:58  3% ` Kevin Traynor
  0 siblings, 0 replies; 200+ results
From: Kevin Traynor @ 2017-09-28 13:58 UTC (permalink / raw)
  To: Jain, Deepak K, dev, users; +Cc: Thomas Monjalon

On 09/22/2017 11:47 AM, Jain, Deepak K wrote:
> Hi All,
> 
> As part of our ongoing efforts to improve DPDK, we'd like to hear your feedback!
> 
> We have created a number of DPDK-related questions here.
> 
> https://www.surveymonkey.com/r/DPDK_Community_Survey_2017
> 
> and want to hear your views!!
> 
> The survey will close at midnight GMT on Sunday October 1st, 2017.
> 
> Thanks in advance for your feedback - the more responses we get the more data we have to drive further features, improvements, etc.
> 
> So please respond!!!
> 
> Regards
> Deepak
> 
> 
> 

Hi Deepak,

Thanks for the survey, I hope people will take the time to fill it out -
it was a recurring theme of the conference over the last few days that
more user input is needed. I'm not suggesting a survey on the survey ;-)
but a few comments below. Just my $0.02.

The deadline is really short - I'm not sure why the rush.

Some questions are for users and some for devs. Probably should note
that in the intro, so devs hang in there until the relevant questions.

Q5, I don't think it's a good idea to use radio buttons here, as a user
may have multiple applications. It would also be good to ask the stage
of applications. i.e. poc, development, product

Q10/Q12. I'm not sure if users of OVS will know under the hood if
OVS uses vhost pmd and vhost lib (it only uses vhost lib). You could
probably extrapolate from a combination of other answers, but anyway
both answers indicate vhost lib is being used and maybe that's good
enough info.

Q13. There should be an additional question on hardware generation. We
see hardware deprecation sometimes for older hardware, so need to ask
users which hardware generations they are using.

Q14. Probably this Q should allow multiple selections also.

Q15. It would be interesting to combine the kernels from the choices in
this question with the usage of KNI, igb_uio etc.

Q16. Does "usability of API", include release to release stability, or
just how easy it is to program against? I think maybe another option is
needed.

Q17. Typical trade offs between good and optimal performance should be
listed. Otherwise, why would anyone not say optimal. For example, things
like older hardware support, API/ABI stability etc. I'm sure there's others.

thanks,
Kevin.

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2 03/12] cryptodev: avoid dependency on rte_vdev.h
  2017-09-28 13:55  2% ` [dpdk-dev] [PATCH v2 00/12] support to run vdev in the secondary process Jianfeng Tan
@ 2017-09-28 13:55  2%   ` Jianfeng Tan
  2017-10-05 13:13  0%     ` Jan Blunck
  0 siblings, 1 reply; 200+ results
From: Jianfeng Tan @ 2017-09-28 13:55 UTC (permalink / raw)
  To: dev
  Cc: bruce.richardson, konstantin.ananyev, pablo.de.lara.guarch,
	thomas, yliu, maxime.coquelin, mtetsuyah, ferruh.yigit,
	Jianfeng Tan

The helper API, rte_cryptodev_vdev_pmd_init(), has a parameter of
struct rte_vdev_device *, which needs to include rte_vdev.h.

We will move vdev into drivers/bus, so we need to avoid such
dependency. And also, we cannot break the ABI.

This patch changes that pointer to void *, and defines an internal
structure same with struct rte_vdev_device.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 lib/librte_cryptodev/rte_cryptodev_pmd.c  |   9 +-
 lib/librte_cryptodev/rte_cryptodev_vdev.c | 161 ++++++++++++++++++++++++++++++
 lib/librte_cryptodev/rte_cryptodev_vdev.h |   3 +-
 3 files changed, 169 insertions(+), 4 deletions(-)
 create mode 100644 lib/librte_cryptodev/rte_cryptodev_vdev.c

diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.c b/lib/librte_cryptodev/rte_cryptodev_pmd.c
index a57faad..60b3980 100644
--- a/lib/librte_cryptodev/rte_cryptodev_pmd.c
+++ b/lib/librte_cryptodev/rte_cryptodev_pmd.c
@@ -75,9 +75,14 @@ rte_cryptodev_vdev_parse_integer_arg(const char *key __rte_unused,
 	return 0;
 }
 
+struct vdev_device {
+	TAILQ_ENTRY(rte_vdev_device) next;
+	struct rte_device device;
+};
+
 struct rte_cryptodev *
 rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
-		int socket_id, struct rte_vdev_device *vdev)
+		int socket_id, void *vdev)
 {
 	struct rte_cryptodev *cryptodev;
 
@@ -99,7 +104,7 @@ rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
 					" data");
 	}
 
-	cryptodev->device = &vdev->device;
+	cryptodev->device = &((struct vdev_device *)vdev)->device;
 
 	/* initialise user call-back tail queue */
 	TAILQ_INIT(&(cryptodev->link_intr_cbs));
diff --git a/lib/librte_cryptodev/rte_cryptodev_vdev.c b/lib/librte_cryptodev/rte_cryptodev_vdev.c
new file mode 100644
index 0000000..4af8d51
--- /dev/null
+++ b/lib/librte_cryptodev/rte_cryptodev_vdev.c
@@ -0,0 +1,161 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of the copyright holder nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/queue.h>
+
+#include "rte_cryptodev_vdev.h"
+#include "rte_cryptodev_pci.h"
+#include "rte_cryptodev_pmd.h"
+
+/**
+ * Parse name from argument
+ */
+static int
+rte_cryptodev_vdev_parse_name_arg(const char *key __rte_unused,
+		const char *value, void *extra_args)
+{
+	struct rte_crypto_vdev_init_params *params = extra_args;
+
+	if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) {
+		CDEV_LOG_ERR("Invalid name %s, should be less than "
+				"%u bytes", value,
+				RTE_CRYPTODEV_NAME_MAX_LEN - 1);
+		return -1;
+	}
+
+	strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN);
+
+	return 0;
+}
+
+/**
+ * Parse integer from argument
+ */
+static int
+rte_cryptodev_vdev_parse_integer_arg(const char *key __rte_unused,
+		const char *value, void *extra_args)
+{
+	int *i = extra_args;
+
+	*i = atoi(value);
+	if (*i < 0) {
+		CDEV_LOG_ERR("Argument has to be positive.");
+		return -1;
+	}
+
+	return 0;
+}
+
+struct vdev_device {
+	TAILQ_ENTRY(rte_vdev_device) next;
+	struct rte_device device;
+};
+
+struct rte_cryptodev *
+rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
+		int socket_id, void *vdev)
+{
+	struct rte_cryptodev *cryptodev;
+
+	/* allocate device structure */
+	cryptodev = rte_cryptodev_pmd_allocate(name, socket_id);
+	if (cryptodev == NULL)
+		return NULL;
+
+	/* allocate private device structure */
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		cryptodev->data->dev_private =
+				rte_zmalloc_socket("cryptodev device private",
+						dev_private_size,
+						RTE_CACHE_LINE_SIZE,
+						socket_id);
+
+		if (cryptodev->data->dev_private == NULL)
+			rte_panic("Cannot allocate memzone for private device"
+					" data");
+	}
+
+	cryptodev->device = &((struct vdev_device *)vdev)->device;
+
+	/* initialise user call-back tail queue */
+	TAILQ_INIT(&(cryptodev->link_intr_cbs));
+
+	return cryptodev;
+}
+
+int
+rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params,
+		const char *input_args)
+{
+	struct rte_kvargs *kvlist = NULL;
+	int ret = 0;
+
+	if (params == NULL)
+		return -EINVAL;
+
+	if (input_args) {
+		kvlist = rte_kvargs_parse(input_args,
+				cryptodev_vdev_valid_params);
+		if (kvlist == NULL)
+			return -1;
+
+		ret = rte_kvargs_process(kvlist,
+					RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG,
+					&rte_cryptodev_vdev_parse_integer_arg,
+					&params->max_nb_queue_pairs);
+		if (ret < 0)
+			goto free_kvlist;
+
+		ret = rte_kvargs_process(kvlist,
+					RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG,
+					&rte_cryptodev_vdev_parse_integer_arg,
+					&params->max_nb_sessions);
+		if (ret < 0)
+			goto free_kvlist;
+
+		ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_SOCKET_ID,
+					&rte_cryptodev_vdev_parse_integer_arg,
+					&params->socket_id);
+		if (ret < 0)
+			goto free_kvlist;
+
+		ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_NAME,
+					&rte_cryptodev_vdev_parse_name_arg,
+					params);
+		if (ret < 0)
+			goto free_kvlist;
+	}
+
+free_kvlist:
+	rte_kvargs_free(kvlist);
+	return ret;
+}
diff --git a/lib/librte_cryptodev/rte_cryptodev_vdev.h b/lib/librte_cryptodev/rte_cryptodev_vdev.h
index 94ab9d3..1142d1d 100644
--- a/lib/librte_cryptodev/rte_cryptodev_vdev.h
+++ b/lib/librte_cryptodev/rte_cryptodev_vdev.h
@@ -33,7 +33,6 @@
 #ifndef _RTE_CRYPTODEV_VDEV_H_
 #define _RTE_CRYPTODEV_VDEV_H_
 
-#include <rte_vdev.h>
 #include <inttypes.h>
 
 #include "rte_cryptodev.h"
@@ -80,7 +79,7 @@ struct rte_crypto_vdev_init_params {
  */
 struct rte_cryptodev *
 rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size,
-		int socket_id, struct rte_vdev_device *vdev);
+		int socket_id, void *vdev);
 
 /**
  * @internal
-- 
2.7.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v2 00/12] support to run vdev in the secondary process
    @ 2017-09-28 13:55  2% ` Jianfeng Tan
  2017-09-28 13:55  2%   ` [dpdk-dev] [PATCH v2 03/12] cryptodev: avoid dependency on rte_vdev.h Jianfeng Tan
  1 sibling, 1 reply; 200+ results
From: Jianfeng Tan @ 2017-09-28 13:55 UTC (permalink / raw)
  To: dev
  Cc: bruce.richardson, konstantin.ananyev, pablo.de.lara.guarch,
	thomas, yliu, maxime.coquelin, mtetsuyah, ferruh.yigit,
	Jianfeng Tan

v2:
  - Address Gaetan's comment in patch 2.
  - Add RTE_LOGTYPE_BUS suggested by Gaetan.
  - Don't moving crypto vdev into drivers/bus/vdev, instead we use a
    new way (details in patch 3) which may break the ABI (the
    validate_abi.sh report a low warning of "Problems with Symbols").
  - Rename CONFIG_RTE_LIBRTE_VDEV to CONFIG_RTE_LIBRTE_VDEV_BUS.
  - Return error if there's an existing action for an action name.
  - Redefine rte_eal_primary_secondary_t as func pointer, and change
    the first parameter type to avoid explicit type casting.
  - Handle the case for vhost "primary - VM - secondary" sequence.
  - Fix a bug in recv multiple messages as one message.
  - Fix a bug of get vid of -1 in secondary process.
  - Remove the modification on helloworld example, instead we use
    symmetric_mp as the test case.
  - Address yuanhan's comment on code refactor on mp channel.

Patch 1~6: move vdev bus into drivers/bus.
Patch 7: add unix socket channel for primary/secondary communication.
Patch 8~9: make use of the channel to discover and probe virtual devices
         the primary process.
Patch 10~12: support to run vhost-pmd in the secondary process.

How to test:

Step 1: run symmetric_mp as the primary process.
  $ ./symmetric_mp -c 2 --proc-type=auto ... \
          --vdev 'net_vhost0,iface=/tmp/sock1,queues=2' \
	  --vdev 'net_vhost1,iface=/tmp/sock2,queues=2' \
	  -- -p 3 --num-procs=2 --proc-id=0

Step 2: run testpmd as the secondary process.
  $ ./symmetric_mp -c 4 --proc-type=auto -- -p 3 --num-procs=2 --proc-id=1

Step 3: start VM1.
  $ ./qemu-system-x86_64 ... -chardev socket,id=chr1,path=/tmp/sock1 \
          -netdev type=vhost-user,id=net1,chardev=chr1,vhostforce,queues=2 \
          -device virtio-net-pci,netdev=net1,mq=on,vectors=6 ...

Step 4: start VM2.
  $ ./qemu-system-x86_64 ... -chardev socket,id=chr1,path=/tmp/sock2 \
          -netdev type=vhost-user,id=net1,chardev=chr1,vhostforce,queues=2 \
          -device virtio-net-pci,netdev=net1,mq=on,vectors=6 ...

Step 5: enable multi queue in VM1 and VM2.
  $ ethtool -L ethX combined 2

Note in this test case, only queue 1, i.e., secondary process can process
packets. To use queue 1, basically, we can run command like:
  $ taskset -c 1 <commands>


Jianfeng Tan (12):
  cryptodev: remove crypto vdev init API
  eal: avoid calling rte_vdev_init()
  cryptodev: avoid dependency on rte_vdev.h
  bus/fslmc: introduce RTE_LOGTYPE_BUS for bus drivers
  bus/vdev: move to vdev bus to drivers/bus
  bus/vdev: normalize log type
  eal: add channel for primary/secondary communication
  bus/vdev: scan and probe vdev in secondary processes
  ethdev: support attach vdev in secondary process
  vhost: allocate virtio_net in memzone
  vhost: support to kick in secondary process
  net/vhost: support to run in the secondary process

 config/common_base                              |   5 +
 doc/guides/rel_notes/deprecation.rst            |   5 -
 drivers/bus/Makefile                            |   2 +
 drivers/bus/fslmc/fslmc_bus.c                   |   5 +-
 drivers/bus/fslmc/fslmc_logs.h                  |  42 +-
 drivers/bus/fslmc/fslmc_vfio.c                  |   4 +-
 drivers/bus/vdev/Makefile                       |  55 +++
 drivers/bus/vdev/rte_bus_vdev_version.map       |  10 +
 drivers/bus/vdev/rte_vdev.h                     | 153 ++++++++
 drivers/bus/vdev/vdev.c                         | 440 +++++++++++++++++++++
 drivers/bus/vdev/vdev_logs.h                    |  40 ++
 drivers/net/vhost/rte_eth_vhost.c               | 200 +++++++++-
 lib/librte_cryptodev/rte_cryptodev.c            |   6 -
 lib/librte_cryptodev/rte_cryptodev.h            |  18 -
 lib/librte_cryptodev/rte_cryptodev_pmd.c        |   9 +-
 lib/librte_cryptodev/rte_cryptodev_vdev.c       | 161 ++++++++
 lib/librte_cryptodev/rte_cryptodev_vdev.h       |   3 +-
 lib/librte_cryptodev/rte_cryptodev_version.map  |   1 -
 lib/librte_eal/bsdapp/eal/Makefile              |   1 -
 lib/librte_eal/bsdapp/eal/rte_eal_version.map   |   8 +
 lib/librte_eal/common/Makefile                  |   2 +-
 lib/librte_eal/common/eal_common_dev.c          |  21 +-
 lib/librte_eal/common/eal_common_log.c          |   1 +
 lib/librte_eal/common/eal_common_proc.c         | 498 ++++++++++++++++++++++++
 lib/librte_eal/common/eal_common_vdev.c         | 342 ----------------
 lib/librte_eal/common/eal_filesystem.h          |  18 +
 lib/librte_eal/common/eal_private.h             |  10 +
 lib/librte_eal/common/include/rte_dev.h         |  24 +-
 lib/librte_eal/common/include/rte_eal.h         |  68 ++++
 lib/librte_eal/common/include/rte_log.h         |   1 +
 lib/librte_eal/common/include/rte_vdev.h        | 131 -------
 lib/librte_eal/linuxapp/eal/Makefile            |   1 -
 lib/librte_eal/linuxapp/eal/eal.c               |   6 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map |   8 +
 lib/librte_ether/rte_ethdev_vdev.h              |  26 +-
 lib/librte_vhost/rte_vhost.h                    |   3 +
 lib/librte_vhost/rte_vhost_version.map          |   7 +
 lib/librte_vhost/socket.c                       |   2 +
 lib/librte_vhost/vhost.c                        |  71 +++-
 lib/librte_vhost/vhost.h                        |   7 +-
 lib/librte_vhost/vhost_user.c                   |  17 +-
 mk/rte.app.mk                                   |   1 +
 42 files changed, 1799 insertions(+), 634 deletions(-)
 create mode 100644 drivers/bus/vdev/Makefile
 create mode 100644 drivers/bus/vdev/rte_bus_vdev_version.map
 create mode 100644 drivers/bus/vdev/rte_vdev.h
 create mode 100644 drivers/bus/vdev/vdev.c
 create mode 100644 drivers/bus/vdev/vdev_logs.h
 create mode 100644 lib/librte_cryptodev/rte_cryptodev_vdev.c
 delete mode 100644 lib/librte_eal/common/eal_common_vdev.c
 delete mode 100644 lib/librte_eal/common/include/rte_vdev.h

-- 
2.7.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v3 13/13] doc: add notes on EAL PCI API update
  @ 2017-09-25 15:24  4%     ` Gaetan Rivet
    1 sibling, 0 replies; 200+ results
From: Gaetan Rivet @ 2017-09-25 15:24 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

Add a section related to EAL API changes to 17.11 release notes.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8bf91bd..d5546ba 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -130,6 +130,34 @@ API Changes
   * Rework start and stop APIs into ``rte_service_runstate_set``
   * Added API to set runstate of service implementation to indicate readyness
 
+* **PCI bus API moved outside of the EAL**
+
+  The PCI bus previously implemented within the EAL has been moved.
+  A first part has been added as an RTE library providing PCI helpers to
+  parse device locations or other such utilities.
+  A second part consisting in the actual bus driver has been moved to its
+  proper subdirectory, without changing its functionalities.
+
+  As such, several PCI-related functions are not proposed by the EAL anymore:
+
+  * rte_pci_detach
+  * rte_pci_dump
+  * rte_pci_ioport_map
+  * rte_pci_ioport_read
+  * rte_pci_ioport_unmap
+  * rte_pci_ioport_write
+  * rte_pci_map_device
+  * rte_pci_probe
+  * rte_pci_probe_one
+  * rte_pci_read_config
+  * rte_pci_register
+  * rte_pci_scan
+  * rte_pci_unmap_device
+  * rte_pci_unregister
+  * rte_pci_write_config
+
+  These functions are made available either as part of ``librte_pci`` or
+  ``librte_bus_pci``.
 
 ABI Changes
 -----------
-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 1/5] net/bonding: remove bonding APIs using ABI versioning
  2017-09-25  3:22  7%       ` [dpdk-dev] [PATCH v5 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
@ 2017-09-25 11:34  4%         ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-09-25 11:34 UTC (permalink / raw)
  To: Zhiyong Yang, dev; +Cc: thomas, adrien.mazarguil

On 9/25/2017 4:22 AM, Zhiyong Yang wrote:
> There are two bonding APIs using ABI versioning, and both have
> port_id as parameter. Since we are already breaking ABI, no need
> to keep older versions of APIs.
> 
> Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>

Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v4] devtools: rework abi checker script
  2017-09-25  9:11  9%       ` Olivier MATZ
@ 2017-09-25 11:21  4%         ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2017-09-25 11:21 UTC (permalink / raw)
  To: Olivier MATZ; +Cc: dev, bruce.richardson

On Mon, Sep 25, 2017 at 11:11:20AM +0200, Olivier MATZ wrote:
> On Thu, Sep 21, 2017 at 11:40:35AM -0400, Neil Horman wrote:
> > On Wed, Sep 20, 2017 at 11:12:53AM +0200, Olivier Matz wrote:
> > > The initial version of the script had some limitations:
> > > - cannot work on a non-clean workspace
> > > - environment variables are not documented
> > > - no compilation log in case of failure
> > > - return success even it abi is incompatible
> > >
> > > This patch addresses these issues and rework the code.
> > >
> > > Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> > > ---
> > >
> > > v3->v4:
> > > - clarify logs on incompatible abi
> > > - log when an error returned an error
> > > - [really] fix the report path
> > > - log the output of make config in the proper file
> > >
> > > v2->v3:
> > > - fix when not launched from dpdk root dir
> > > - use "-Og -Wno-error" instead of "-O0"
> > > - fix typo in commit log
> > >
> > > v1->v2:
> > > - use /usr/bin/env to find bash (which is required)
> > > - fix displayed path to html reports
> > > - reword help for -f option
> > >
> > >
> > >  devtools/validate-abi.sh | 397 ++++++++++++++++++++++++-----------------------
> > >  1 file changed, 205 insertions(+), 192 deletions(-)
> > >
> > This looks better, thank you for the iterations.  One last note: The abi dumper
> > utility errors out with error code of 12 if a given object has no exported
> > symbols, and I see a few of those.  You may want to consider catching that
> > error, logging an appropriate message and skipping the error emit.  That can be
> > handled later though, as its a corner case.  I'd go with this patch, and then
> > do a incremental improvement later
> 
> Unfortunately the error code 12 does not exist on my version of abi-dumper
> (debian stable, v0.99.16). I'm currently doing this as a workaround:
> 
>     cmd $abidump ${i} -o $dst/${1}/${i}.dump -lver ${1} || true
>     # hack to ignore empty SymbolsInfo section (no public ABI)
>     if grep -q "'SymbolInfo' => {}," $dst/${1}/${i}.dump 2> /dev/null; then
>         log "INFO" "${i} has no public ABI, remove dump file"
>         cmd rm -f $dst/${1}/${i}.dump
>     fi
> 
> I tested with the latest abi-dumper version, and I indeed see
> these errors in the logs. It seems we don't go inside the 'if'
> above with a recent abi-dumper, and the .dump file is not generated.
> 
> I can add a check to display the same additional log
> "INFO" "${i} has no public ABI, remove dump file" if abi-dumper
> returns 12. Something like this:
> 
>     ret=0
>     cmd $abidump ${i} -o $dst/${1}/${i}.dump -lver ${1} || ret=$?
>     # hack to ignore empty SymbolsInfo section (no public ABI)
>     if [ ${ret} = 12 ]; then
>             log "INFO" "${i} has no public ABI"
>     fi
>     if grep -q "'SymbolInfo' => {}," $dst/${1}/${i}.dump 2> /dev/null; then
>         log "INFO" "${i} has no public ABI, remove dump file"
>         cmd rm -f $dst/${1}/${i}.dump
>     fi
> 
Agreed, that makes sense.
Thanks.
Neil

> 
> Olivier
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3 3/6] net/i40e: implement dynamic mapping of sw flow types to hw pctypes
  2017-09-20 14:33  4%   ` [dpdk-dev] [PATCH v3 3/6] net/i40e: implement dynamic mapping of sw flow types to hw pctypes Kirill Rybalchenko
@ 2017-09-25  9:44  0%     ` Xing, Beilei
  0 siblings, 0 replies; 200+ results
From: Xing, Beilei @ 2017-09-25  9:44 UTC (permalink / raw)
  To: Rybalchenko, Kirill, dev; +Cc: Chilikin, Andrey, Wu, Jingjing

> -----Original Message-----
> From: Rybalchenko, Kirill
> Sent: Wednesday, September 20, 2017 10:33 PM
> To: dev@dpdk.org
> Cc: Rybalchenko, Kirill <kirill.rybalchenko@intel.com>; Chilikin, Andrey
> <andrey.chilikin@intel.com>; Xing, Beilei <beilei.xing@intel.com>; Wu,
> Jingjing <jingjing.wu@intel.com>
> Subject: [PATCH v3 3/6] net/i40e: implement dynamic mapping of sw flow
> types to hw pctypes
> 
> Implement dynamic mapping of software flow types to hardware pctypes.
> This allows to add new flow types and pctypes for DDP without changing API
> of the driver. The mapping table is located in private data area for particular
> network adapter and can be individually modified with set of appropriate
> functions.
> 
> v2:
> Re-arrange patchset to avoid compillation errors.
> Remove usage of statically defined flow types and pctypes.
> 
> v3:
> Changed prototypes of some static functions.
> Fixed bugs in i40e_pctype_to_flowtype and i40e_flowtype_to_pctype
> functions.
> Various small modifications after reviewing.
> 
> Signed-off-by: Kirill Rybalchenko <kirill.rybalchenko@intel.com>
> ---
>  drivers/net/i40e/i40e_ethdev.c    | 343 ++++++++++++--------------------------
>  drivers/net/i40e/i40e_ethdev.h    |  17 +-
>  drivers/net/i40e/i40e_ethdev_vf.c |  16 +-
>  drivers/net/i40e/i40e_fdir.c      |  54 +++---
>  drivers/net/i40e/i40e_flow.c      |   5 +-
>  drivers/net/i40e/i40e_rxtx.c      |  57 +++++++
>  drivers/net/i40e/i40e_rxtx.h      |   1 +
>  7 files changed, 208 insertions(+), 285 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 18eac07..e396f73 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c

<snip>

> 
>  static int
> -i40e_hash_global_config_check(struct rte_eth_hash_global_conf *g_cfg)
> +i40e_hash_global_config_check(struct rte_eth_hash_global_conf *g_cfg,
> +			      struct i40e_adapter *adapter)

how about chaning the parameter order?
i40e_hash_global_config_check(struct i40e_adapter *adapter, struct rte_eth_hash_global_conf *g_cfg)?

>  {
>  	uint32_t i;
> -	uint32_t mask0, i40e_mask = I40E_FLOW_TYPES;
> +	uint32_t mask0, i40e_mask = adapter->flow_types_mask;
> 
>  	if (g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_TOEPLITZ &&
>  		g_cfg->hash_func !=
> RTE_ETH_HASH_FUNCTION_SIMPLE_XOR && @@ -7899,64 +7839,32 @@
> static int  i40e_set_hash_filter_global_config(struct i40e_hw *hw,
>  				   struct rte_eth_hash_global_conf *g_cfg)  {
> +	struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back;
>  	int ret;
> -	uint16_t i;
> +	uint16_t i, j;
>  	uint32_t reg;
> -	uint32_t mask0 = g_cfg->valid_bit_mask[0];
> -	enum i40e_filter_pctype pctype;
> +	/*
> +	 * We work only with lowest 32 bits which is not correct, but to work
> +	 * properly the valid_bit_mask size should be increased up to 64 bits
> +	 * and this will brake ABI. This modification will be done in next
> release
> +	 */
> +	uint32_t mask0 = g_cfg->valid_bit_mask[0] &
> +(uint32_t)adapter->flow_types_mask;
> 
>  	/* Check the input parameters */
> -	ret = i40e_hash_global_config_check(g_cfg);
> +	ret = i40e_hash_global_config_check(g_cfg, adapter);
>  	if (ret < 0)
>  		return ret;
> 
> -	for (i = 0; mask0 && i < UINT32_BIT; i++) {
> -		if (!(mask0 & (1UL << i)))
> -			continue;
> -		mask0 &= ~(1UL << i);
> -		/* if flowtype is invalid, continue */
> -		if (!I40E_VALID_FLOW(i))
> -			continue;
> -		pctype = i40e_flowtype_to_pctype(i);
> -		reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
> -				I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
> -		if (hw->mac.type == I40E_MAC_X722) {
> -			if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP)
> {

<snip>

> -				  reg);
> -			} else {
> -				i40e_write_rx_ctl(hw,
> I40E_GLQF_HSYM(pctype),
> -				  reg);
> +	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < UINT32_BIT; i++) {

Should it be like following?
for (i = RTE_ETH_FLOW_UNKNOWN + 1; mask0 && i < UINT32_BIT; i++) {

> +		if (mask0 & (1UL << i)) {
> +			reg = (g_cfg->sym_hash_enable_mask[0] & (1UL <<
> i)) ?
> +
> 	I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
> +
> +			for (j = I40E_FILTER_PCTYPE_INVALID + 1;
> +			     j < I40E_FILTER_PCTYPE_MAX; j++) {
> +				if (adapter->pctypes_tbl[i] & (1ULL << j))
> +					i40e_write_rx_ctl(hw,
> I40E_GLQF_HSYM(j), reg);
>  			}
> -		} else {
> -			i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype),
> reg);
>  		}
>  	}
> 
> @@ -8581,13 +8489,10 @@ i40e_filter_input_set_init(struct i40e_pf *pf)
> 
>  	for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
>  	     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) {
> -		if (hw->mac.type == I40E_MAC_X722) {
> -			if (!I40E_VALID_PCTYPE_X722(pctype))
> -				continue;
> -		} else {
> -			if (!I40E_VALID_PCTYPE(pctype))
> -				continue;
> -		}
> +		uint16_t flow_type = i40e_pctype_to_flowtype(pf->adapter,
> pctype);

Move the variable to the beginning of the function according to the code style.

> +
> +		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
> +			continue;
> 
>  		input_set = i40e_get_default_input_set(pctype);
> 
> @@ -8650,7 +8555,8 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
>  		return -EINVAL;
>  	}
> 
> -	if (!I40E_VALID_FLOW(conf->flow_type)) {
> +	pctype = i40e_flowtype_to_pctype(pf->adapter, conf->flow_type);
> +	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
>  		PMD_DRV_LOG(ERR, "invalid flow_type input.");
>  		return -EINVAL;
>  	}

<snip>

> diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c index
> 84c0a1f..810d384 100644
> --- a/drivers/net/i40e/i40e_fdir.c
> +++ b/drivers/net/i40e/i40e_fdir.c
> @@ -344,15 +344,10 @@ i40e_init_flx_pld(struct i40e_pf *pf)
>  	/* initialize the masks */
>  	for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
>  	     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) {
> -		if (hw->mac.type == I40E_MAC_X722) {
> -			if (!I40E_VALID_PCTYPE_X722(
> -				 (enum i40e_filter_pctype)pctype))
> -				continue;
> -		} else {
> -			if (!I40E_VALID_PCTYPE(
> -				 (enum i40e_filter_pctype)pctype))
> -				continue;
> -		}
> +		uint16_t flow_type = i40e_pctype_to_flowtype(pf->adapter,
> pctype);

Same comments here, move 'uint16_t flow_type' to the beginning of the function.

> +
> +		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
> +			continue;
>  		pf->fdir.flex_mask[pctype].word_mask = 0;
>  		i40e_write_rx_ctl(hw, I40E_PRTQF_FD_FLXINSET(pctype), 0);
>  		for (i = 0; i < I40E_FDIR_BITMASK_NUM_WORD; i++) { @@ -
> 449,7 +444,8 @@ i40e_check_fdir_flex_payload(const struct
> rte_eth_flex_payload_cfg *flex_cfg)
>   * arguments are valid
>   */
>  static int
> -i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
> +i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf,
> +			  const struct i40e_adapter *adapter)

How about i40e_check_fdir_flex_conf(const struct i40e_adapter *adapter , const struct rte_eth_fdir_flex_conf *conf)?

>  {
>  	const struct rte_eth_flex_payload_cfg *flex_cfg;
>  	const struct rte_eth_fdir_flex_mask *flex_mask; @@ -486,8 +482,11
> @@ i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
>  		return -EINVAL;
>  	}
>  	for (i = 0; i < conf->nb_flexmasks; i++) {
> +		enum i40e_filter_pctype pctype;

Move the variable to the beginning of the function.

> +
>  		flex_mask = &conf->flex_mask[i];
> -		if (!I40E_VALID_FLOW(flex_mask->flow_type)) {
> +		pctype = i40e_flowtype_to_pctype(adapter, flex_mask-
> >flow_type);
> +		if (pctype == I40E_FILTER_PCTYPE_INVALID) {
>  			PMD_DRV_LOG(WARNING, "invalid flow type.");
>  			return -EINVAL;
>  		}

<snip>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4] devtools: rework abi checker script
  2017-09-21 15:40  7%     ` Neil Horman
@ 2017-09-25  9:11  9%       ` Olivier MATZ
  2017-09-25 11:21  4%         ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Olivier MATZ @ 2017-09-25  9:11 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev, bruce.richardson

On Thu, Sep 21, 2017 at 11:40:35AM -0400, Neil Horman wrote:
> On Wed, Sep 20, 2017 at 11:12:53AM +0200, Olivier Matz wrote:
> > The initial version of the script had some limitations:
> > - cannot work on a non-clean workspace
> > - environment variables are not documented
> > - no compilation log in case of failure
> > - return success even it abi is incompatible
> >
> > This patch addresses these issues and rework the code.
> >
> > Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> > ---
> >
> > v3->v4:
> > - clarify logs on incompatible abi
> > - log when an error returned an error
> > - [really] fix the report path
> > - log the output of make config in the proper file
> >
> > v2->v3:
> > - fix when not launched from dpdk root dir
> > - use "-Og -Wno-error" instead of "-O0"
> > - fix typo in commit log
> >
> > v1->v2:
> > - use /usr/bin/env to find bash (which is required)
> > - fix displayed path to html reports
> > - reword help for -f option
> >
> >
> >  devtools/validate-abi.sh | 397 ++++++++++++++++++++++++-----------------------
> >  1 file changed, 205 insertions(+), 192 deletions(-)
> >
> This looks better, thank you for the iterations.  One last note: The abi dumper
> utility errors out with error code of 12 if a given object has no exported
> symbols, and I see a few of those.  You may want to consider catching that
> error, logging an appropriate message and skipping the error emit.  That can be
> handled later though, as its a corner case.  I'd go with this patch, and then
> do a incremental improvement later

Unfortunately the error code 12 does not exist on my version of abi-dumper
(debian stable, v0.99.16). I'm currently doing this as a workaround:

    cmd $abidump ${i} -o $dst/${1}/${i}.dump -lver ${1} || true
    # hack to ignore empty SymbolsInfo section (no public ABI)
    if grep -q "'SymbolInfo' => {}," $dst/${1}/${i}.dump 2> /dev/null; then
        log "INFO" "${i} has no public ABI, remove dump file"
        cmd rm -f $dst/${1}/${i}.dump
    fi

I tested with the latest abi-dumper version, and I indeed see
these errors in the logs. It seems we don't go inside the 'if'
above with a recent abi-dumper, and the .dump file is not generated.

I can add a check to display the same additional log
"INFO" "${i} has no public ABI, remove dump file" if abi-dumper
returns 12. Something like this:

    ret=0
    cmd $abidump ${i} -o $dst/${1}/${i}.dump -lver ${1} || ret=$?
    # hack to ignore empty SymbolsInfo section (no public ABI)
    if [ ${ret} = 12 ]; then
            log "INFO" "${i} has no public ABI"
    fi
    if grep -q "'SymbolInfo' => {}," $dst/${1}/${i}.dump 2> /dev/null; then
        log "INFO" "${i} has no public ABI, remove dump file"
        cmd rm -f $dst/${1}/${i}.dump
    fi


Olivier

^ permalink raw reply	[relevance 9%]

* [dpdk-dev] [PATCH v5 2/5] ethdev: increase port_id range
  2017-09-25  3:22  4%     ` [dpdk-dev] [PATCH v5 0/5] " Zhiyong Yang
  2017-09-25  3:22  7%       ` [dpdk-dev] [PATCH v5 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
@ 2017-09-25  3:22  1%       ` Zhiyong Yang
  2017-09-29  7:17  4%       ` [dpdk-dev] [PATCH v6 0/5] " Zhiyong Yang
  2 siblings, 0 replies; 200+ results
From: Zhiyong Yang @ 2017-09-25  3:22 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, thomas, adrien.mazarguil, Zhiyong Yang

Extend port_id definition from uint8_t to uint16_t in lib and drivers
data structures, specifically rte_eth_dev_data. Modify the APIs,
drivers and app using port_id at the same time.

Fix some checkpatch issues from the original code and remove some
unnecessary cast operations.

release_17_11 and deprecation have been updated in this patch.

Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
---
 app/pdump/main.c                                  |   2 +-
 app/test-pmd/cmdline.c                            |   6 +-
 app/test-pmd/config.c                             |   4 +-
 app/test-pmd/ieee1588fwd.c                        |  26 ++-
 app/test-pmd/parameters.c                         |   2 +-
 app/test-pmd/rxonly.c                             |   2 +-
 app/test-pmd/testpmd.c                            |  18 +-
 app/test-pmd/testpmd.h                            |   4 +-
 doc/guides/rel_notes/deprecation.rst              |   6 -
 doc/guides/rel_notes/release_17_11.rst            |  18 +-
 drivers/net/af_packet/Makefile                    |   2 +-
 drivers/net/af_packet/rte_eth_af_packet.c         |   2 +-
 drivers/net/ark/ark_ethdev.c                      |   2 +-
 drivers/net/avp/Makefile                          |   2 +-
 drivers/net/avp/avp_ethdev.c                      |   2 +-
 drivers/net/bnx2x/Makefile                        |   2 +-
 drivers/net/bnx2x/bnx2x_rxtx.h                    |   4 +-
 drivers/net/bnxt/Makefile                         |   2 +-
 drivers/net/bnxt/bnxt.h                           |   2 +-
 drivers/net/bnxt/bnxt_ethdev.c                    |   4 +-
 drivers/net/bnxt/bnxt_rxq.h                       |   2 +-
 drivers/net/bnxt/bnxt_txq.h                       |   2 +-
 drivers/net/bnxt/rte_pmd_bnxt.c                   |  32 +--
 drivers/net/bnxt/rte_pmd_bnxt.h                   |  32 +--
 drivers/net/bonding/Makefile                      |   2 +-
 drivers/net/bonding/rte_eth_bond.h                |  41 ++--
 drivers/net/bonding/rte_eth_bond_8023ad.c         |  60 +++---
 drivers/net/bonding/rte_eth_bond_8023ad.h         |  30 +--
 drivers/net/bonding/rte_eth_bond_8023ad_private.h |  12 +-
 drivers/net/bonding/rte_eth_bond_alb.c            |   6 +-
 drivers/net/bonding/rte_eth_bond_alb.h            |   6 +-
 drivers/net/bonding/rte_eth_bond_api.c            |  64 +++---
 drivers/net/bonding/rte_eth_bond_args.c           |   2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c            |  62 +++---
 drivers/net/bonding/rte_eth_bond_private.h        |  45 ++--
 drivers/net/e1000/Makefile                        |   2 +-
 drivers/net/e1000/em_ethdev.c                     |   2 +-
 drivers/net/e1000/em_rxtx.c                       |   4 +-
 drivers/net/e1000/igb_rxtx.c                      |   4 +-
 drivers/net/failsafe/Makefile                     |   2 +-
 drivers/net/failsafe/failsafe_ether.c             |   4 +-
 drivers/net/failsafe/failsafe_private.h           |   4 +-
 drivers/net/fm10k/Makefile                        |   2 +-
 drivers/net/fm10k/fm10k.h                         |   6 +-
 drivers/net/i40e/Makefile                         |   2 +-
 drivers/net/i40e/i40e_ethdev.c                    |   5 +-
 drivers/net/i40e/i40e_rxtx.h                      |   4 +-
 drivers/net/i40e/rte_pmd_i40e.c                   |  50 ++---
 drivers/net/i40e/rte_pmd_i40e.h                   |  48 ++---
 drivers/net/ixgbe/Makefile                        |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c                  |   5 +-
 drivers/net/ixgbe/ixgbe_rxtx.h                    |   4 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c                 |  60 +++---
 drivers/net/ixgbe/rte_pmd_ixgbe.h                 |  64 +++---
 drivers/net/mlx5/mlx5_rxtx.h                      |   4 +-
 drivers/net/nfp/nfp_net.c                         |  16 +-
 drivers/net/nfp/nfp_net_pmd.h                     |   2 +-
 drivers/net/null/Makefile                         |   2 +-
 drivers/net/null/rte_eth_null.c                   |   2 +-
 drivers/net/pcap/Makefile                         |   2 +-
 drivers/net/pcap/rte_eth_pcap.c                   |   2 +-
 drivers/net/qede/qede_if.h                        |   2 +-
 drivers/net/ring/rte_eth_ring.c                   |   2 +-
 drivers/net/szedata2/rte_eth_szedata2.c           |   2 +-
 drivers/net/thunderx/nicvf_struct.h               |   2 +-
 drivers/net/vhost/Makefile                        |   2 +-
 drivers/net/vhost/rte_eth_vhost.c                 |   6 +-
 drivers/net/vhost/rte_eth_vhost.h                 |   4 +-
 drivers/net/virtio/Makefile                       |   2 +-
 drivers/net/virtio/virtio_pci.h                   |   2 +-
 drivers/net/virtio/virtio_rxtx.h                  |   6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h                |   4 +-
 lib/librte_bitratestats/Makefile                  |   2 +-
 lib/librte_bitratestats/rte_bitrate.c             |   2 +-
 lib/librte_bitratestats/rte_bitrate.h             |   2 +-
 lib/librte_ether/Makefile                         |   2 +-
 lib/librte_ether/rte_ethdev.c                     | 241 +++++++++++-----------
 lib/librte_ether/rte_ethdev.h                     | 238 ++++++++++-----------
 lib/librte_ether/rte_flow.c                       |   2 +-
 lib/librte_ether/rte_flow_driver.h                |   2 +-
 lib/librte_ether/rte_tm.c                         |  62 +++---
 lib/librte_ether/rte_tm.h                         |  60 +++---
 lib/librte_ether/rte_tm_driver.h                  |   2 +-
 lib/librte_kni/Makefile                           |   2 +-
 lib/librte_kni/rte_kni.h                          |   6 +-
 lib/librte_latencystats/rte_latencystats.c        |  12 +-
 lib/librte_pdump/Makefile                         |   2 +-
 lib/librte_pdump/rte_pdump.c                      |  16 +-
 lib/librte_pdump/rte_pdump.h                      |   4 +-
 lib/librte_port/Makefile                          |   2 +-
 lib/librte_port/rte_port_ethdev.c                 |   6 +-
 lib/librte_port/rte_port_ethdev.h                 |   6 +-
 92 files changed, 773 insertions(+), 746 deletions(-)

diff --git a/app/pdump/main.c b/app/pdump/main.c
index 3b13753d9..090a50cfc 100644
--- a/app/pdump/main.c
+++ b/app/pdump/main.c
@@ -623,7 +623,7 @@ static void
 create_mp_ring_vdev(void)
 {
 	int i;
-	uint8_t portid;
+	uint16_t portid;
 	struct pdump_tuples *pt = NULL;
 	struct rte_mempool *mbuf_pool = NULL;
 	char vdev_args[SIZE];
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index ccdf239d6..d9d083888 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -4588,7 +4588,7 @@ struct cmd_show_bonding_config_result {
 	cmdline_fixed_string_t show;
 	cmdline_fixed_string_t bonding;
 	cmdline_fixed_string_t config;
-	uint8_t port_id;
+	portid_t port_id;
 };
 
 static void cmd_show_bonding_config_parsed(void *parsed_result,
@@ -4597,7 +4597,7 @@ static void cmd_show_bonding_config_parsed(void *parsed_result,
 {
 	struct cmd_show_bonding_config_result *res = parsed_result;
 	int bonding_mode, agg_mode;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	portid_t slaves[RTE_MAX_ETHPORTS];
 	int num_slaves, num_active_slaves;
 	int primary_id;
 	int i;
@@ -11500,7 +11500,7 @@ struct cmd_vf_vlan_stripq_result {
 	cmdline_fixed_string_t vf;
 	cmdline_fixed_string_t vlan;
 	cmdline_fixed_string_t stripq;
-	uint8_t port_id;
+	portid_t port_id;
 	uint16_t vf_id;
 	cmdline_fixed_string_t on_off;
 };
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 3ae3e1cd8..155136dd5 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -358,7 +358,7 @@ rx_queue_infos_display(portid_t port_id, uint16_t queue_id)
 
 	rc = rte_eth_rx_queue_info_get(port_id, queue_id, &qinfo);
 	if (rc != 0) {
-		printf("Failed to retrieve information for port: %hhu, "
+		printf("Failed to retrieve information for port: %u, "
 			"RX queue: %hu\nerror desc: %s(%d)\n",
 			port_id, queue_id, strerror(-rc), rc);
 		return;
@@ -391,7 +391,7 @@ tx_queue_infos_display(portid_t port_id, uint16_t queue_id)
 
 	rc = rte_eth_tx_queue_info_get(port_id, queue_id, &qinfo);
 	if (rc != 0) {
-		printf("Failed to retrieve information for port: %hhu, "
+		printf("Failed to retrieve information for port: %u, "
 			"TX queue: %hu\nerror desc: %s(%d)\n",
 			port_id, queue_id, strerror(-rc), rc);
 		return;
diff --git a/app/test-pmd/ieee1588fwd.c b/app/test-pmd/ieee1588fwd.c
index 51170ee3e..91ee78646 100644
--- a/app/test-pmd/ieee1588fwd.c
+++ b/app/test-pmd/ieee1588fwd.c
@@ -86,12 +86,11 @@ port_ieee1588_rx_timestamp_check(portid_t pi, uint32_t index)
 	struct timespec timestamp = {0, 0};
 
 	if (rte_eth_timesync_read_rx_timestamp(pi, &timestamp, index) < 0) {
-		printf("Port %u RX timestamp registers not valid\n",
-		       (unsigned) pi);
+		printf("Port %u RX timestamp registers not valid\n", pi);
 		return;
 	}
 	printf("Port %u RX timestamp value %lu s %lu ns\n",
-	       (unsigned) pi, timestamp.tv_sec, timestamp.tv_nsec);
+		pi, timestamp.tv_sec, timestamp.tv_nsec);
 }
 
 #define MAX_TX_TMST_WAIT_MICROSECS 1000 /**< 1 milli-second */
@@ -110,12 +109,12 @@ port_ieee1588_tx_timestamp_check(portid_t pi)
 	if (wait_us >= MAX_TX_TMST_WAIT_MICROSECS) {
 		printf("Port %u TX timestamp registers not valid after "
 		       "%u micro-seconds\n",
-		       (unsigned) pi, (unsigned) MAX_TX_TMST_WAIT_MICROSECS);
+		       pi, MAX_TX_TMST_WAIT_MICROSECS);
 		return;
 	}
 	printf("Port %u TX timestamp value %lu s %lu ns validated after "
 	       "%u micro-second%s\n",
-	       (unsigned) pi, timestamp.tv_sec, timestamp.tv_nsec, wait_us,
+	       pi, timestamp.tv_sec, timestamp.tv_nsec, wait_us,
 	       (wait_us == 1) ? "" : "s");
 }
 
@@ -148,11 +147,11 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 		if (eth_type == ETHER_TYPE_1588) {
 			printf("Port %u Received PTP packet not filtered"
 			       " by hardware\n",
-			       (unsigned) fs->rx_port);
+			       fs->rx_port);
 		} else {
 			printf("Port %u Received non PTP packet type=0x%4x "
 			       "len=%u\n",
-			       (unsigned) fs->rx_port, eth_type,
+			       fs->rx_port, eth_type,
 			       (unsigned) mb->pkt_len);
 		}
 		rte_pktmbuf_free(mb);
@@ -161,7 +160,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (eth_type != ETHER_TYPE_1588) {
 		printf("Port %u Received NON PTP packet incorrectly"
 		       " detected by hardware\n",
-		       (unsigned) fs->rx_port);
+		       fs->rx_port);
 		rte_pktmbuf_free(mb);
 		return;
 	}
@@ -175,19 +174,19 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (ptp_hdr->version != 0x02) {
 		printf("Port %u Received PTP V2 Ethernet frame with wrong PTP"
 		       " protocol version 0x%x (should be 0x02)\n",
-		       (unsigned) fs->rx_port, ptp_hdr->version);
+		       fs->rx_port, ptp_hdr->version);
 		rte_pktmbuf_free(mb);
 		return;
 	}
 	if (ptp_hdr->msg_id != PTP_SYNC_MESSAGE) {
 		printf("Port %u Received PTP V2 Ethernet frame with unexpected"
 		       " message ID 0x%x (expected 0x0 - PTP_SYNC_MESSAGE)\n",
-		       (unsigned) fs->rx_port, ptp_hdr->msg_id);
+		       fs->rx_port, ptp_hdr->msg_id);
 		rte_pktmbuf_free(mb);
 		return;
 	}
 	printf("Port %u IEEE1588 PTP V2 SYNC Message filtered by hardware\n",
-	       (unsigned) fs->rx_port);
+	       fs->rx_port);
 
 	/*
 	 * Check that the received PTP packet has been timestamped by the
@@ -196,7 +195,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (! (mb->ol_flags & PKT_RX_IEEE1588_TMST)) {
 		printf("Port %u Received PTP packet not timestamped"
 		       " by hardware\n",
-		       (unsigned) fs->rx_port);
+		       fs->rx_port);
 		rte_pktmbuf_free(mb);
 		return;
 	}
@@ -216,8 +215,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	mb->ol_flags |= PKT_TX_IEEE1588_TMST;
 	fs->tx_packets += 1;
 	if (rte_eth_tx_burst(fs->rx_port, fs->tx_queue, &mb, 1) == 0) {
-		printf("Port %u sent PTP packet dropped\n",
-		       (unsigned) fs->rx_port);
+		printf("Port %u sent PTP packet dropped\n", fs->rx_port);
 		fs->fwd_dropped += 1;
 		rte_pktmbuf_free(mb);
 		return;
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 2f7f70fd6..31287d71d 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -734,7 +734,7 @@ launch_args_parse(int argc, char** argv)
 			if (!strcmp(lgopts[opt_idx].name, "nb-ports")) {
 				n = atoi(optarg);
 				if (n > 0 && n <= nb_ports)
-					nb_fwd_ports = (uint8_t) n;
+					nb_fwd_ports = n;
 				else
 					rte_exit(EXIT_FAILURE,
 						 "Invalid port %d\n", n);
diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c
index 5ef021905..57df01468 100644
--- a/app/test-pmd/rxonly.c
+++ b/app/test-pmd/rxonly.c
@@ -122,7 +122,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 	 */
 	if (verbose_level > 0)
 		printf("port %u/queue %u: received %u packets\n",
-		       (unsigned) fs->rx_port,
+		       fs->rx_port,
 		       (unsigned) fs->rx_queue,
 		       (unsigned) nb_rx);
 	for (i = 0; i < nb_rx; i++) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index e097ee04e..477e2e7ad 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -390,7 +390,7 @@ struct gro_status gro_ports[RTE_MAX_ETHPORTS];
 /* Forward function declarations */
 static void map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port);
 static void check_all_ports_link_status(uint32_t port_mask);
-static int eth_event_callback(uint8_t port_id,
+static int eth_event_callback(portid_t port_id,
 			      enum rte_eth_event_type type,
 			      void *param, void *ret_param);
 
@@ -1816,7 +1816,8 @@ check_all_ports_link_status(uint32_t port_mask)
 {
 #define CHECK_INTERVAL 100 /* 100ms */
 #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */
-	uint8_t portid, count, all_ports_up, print_flag = 0;
+	portid_t portid;
+	uint8_t count, all_ports_up, print_flag = 0;
 	struct rte_eth_link link;
 
 	printf("Checking link statuses...\n");
@@ -1831,14 +1832,13 @@ check_all_ports_link_status(uint32_t port_mask)
 			/* print link status if flag set */
 			if (print_flag == 1) {
 				if (link.link_status)
-					printf("Port %d Link Up - speed %u "
-						"Mbps - %s\n", (uint8_t)portid,
-						(unsigned)link.link_speed,
+					printf(
+					"Port%d Link Up. speed %u Mbps- %s\n",
+					portid, link.link_speed,
 				(link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
 					("full-duplex") : ("half-duplex\n"));
 				else
-					printf("Port %d Link Down\n",
-						(uint8_t)portid);
+					printf("Port %d Link Down\n", portid);
 				continue;
 			}
 			/* clear all_ports_up flag if any link down */
@@ -1885,7 +1885,7 @@ rmv_event_callback(void *arg)
 
 /* This function is used by the interrupt thread */
 static int
-eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param,
+eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
 		  void *ret_param)
 {
 	static const char * const event_desc[] = {
@@ -2328,7 +2328,7 @@ int
 main(int argc, char** argv)
 {
 	int  diag;
-	uint8_t port_id;
+	portid_t port_id;
 
 	signal(SIGINT, signal_handler);
 	signal(SIGTERM, signal_handler);
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 1d1ee7587..657c1235c 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -78,7 +78,7 @@
 #define UMA_NO_CONFIG  0xFF
 
 typedef uint8_t  lcoreid_t;
-typedef uint8_t  portid_t;
+typedef uint16_t portid_t;
 typedef uint16_t queueid_t;
 typedef uint16_t streamid_t;
 
@@ -283,7 +283,7 @@ enum dcb_mode_enable
 #define MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128 rx_queues/port */
 
 struct queue_stats_mappings {
-	uint8_t port_id;
+	portid_t port_id;
 	uint16_t queue_id;
 	uint8_t stats_counter_id;
 } __rte_cache_aligned;
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 3362f3350..45eb5c4a9 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -76,12 +76,6 @@ Deprecation Notices
   done by the EAL and not by the ``ethdev`` layer anymore. Users relying on this
   flag being present only have to remove their checks to follow the change.
 
-* ABI/API changes are planned for 17.11 in all structures which include port_id
-  definition such as "rte_eth_dev_data", "rte_port_ethdev_reader_params",
-  "rte_port_ethdev_writer_params", and so on. The definition of port_id will be
-  changed from 8 bits to 16 bits in order to support more than 256 ports in
-  DPDK. All APIs which have port_id parameter will be changed at the same time.
-
 * ethdev: An ABI change is planned for 17.11 for the structure rte_eth_dev_data.
   The size of the unique name will increase RTE_ETH_NAME_MAX_LEN from 32 to
   64 characters to allow using a globally unique identifier (GUID) in this field.
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8bf91bd40..39f75aced 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -41,6 +41,11 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Extended port_id range from uint8_t to uint16_t.**
+
+  Increased port_id range from 8 bits to 16 bits in order to support more than
+  256 ports in dpdk. All ethdev APIs which have port_id as parameter are changed
+  in the meantime.
 
 Resolved Issues
 ---------------
@@ -144,7 +149,10 @@ ABI Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* **Extended port_id range.**
 
+  The size of the field ``port_id`` in the ``rte_eth_dev_data`` structure
+  changed, as described in the `New Features` section.
 
 Shared Library Versions
 -----------------------
@@ -165,19 +173,19 @@ The libraries prepended with a plus sign were incremented in this version.
 .. code-block:: diff
 
      librte_acl.so.2
-     librte_bitratestats.so.1
+     librte_bitratestats.so.2
      librte_cfgfile.so.2
      librte_cmdline.so.2
      librte_cryptodev.so.3
      librte_distributor.so.1
      librte_eal.so.5
-     librte_ethdev.so.7
+     librte_ethdev.so.8
      librte_eventdev.so.2
      librte_gro.so.1
      librte_hash.so.2
      librte_ip_frag.so.1
      librte_jobstats.so.1
-     librte_kni.so.2
+     librte_kni.so.3
      librte_kvargs.so.1
      librte_latencystats.so.1
      librte_lpm.so.2
@@ -186,11 +194,11 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_meter.so.1
      librte_metrics.so.1
      librte_net.so.1
-     librte_pdump.so.1
+     librte_pdump.so.2
      librte_pipeline.so.3
      librte_pmd_bond.so.1
      librte_pmd_ring.so.2
-     librte_port.so.3
+     librte_port.so.4
      librte_power.so.1
      librte_reorder.so.1
      librte_ring.so.1
diff --git a/drivers/net/af_packet/Makefile b/drivers/net/af_packet/Makefile
index 70d517c16..4d62b7dbd 100644
--- a/drivers/net/af_packet/Makefile
+++ b/drivers/net/af_packet/Makefile
@@ -40,7 +40,7 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index 9a47852ca..483b0c107 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -75,7 +75,7 @@ struct pkt_rx_queue {
 	unsigned int framenum;
 
 	struct rte_mempool *mb_pool;
-	uint8_t in_port;
+	uint16_t in_port;
 
 	volatile unsigned long rx_pkts;
 	volatile unsigned long err_pkts;
diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c
index 6db362b04..893284733 100644
--- a/drivers/net/ark/ark_ethdev.c
+++ b/drivers/net/ark/ark_ethdev.c
@@ -641,7 +641,7 @@ eth_ark_dev_stop(struct rte_eth_dev *dev)
 	for (i = 0; i < dev->data->nb_tx_queues; i++) {
 		status = eth_ark_tx_queue_stop(dev, i);
 		if (status != 0) {
-			uint8_t port = dev->data->port_id;
+			uint16_t port = dev->data->port_id;
 			PMD_DRV_LOG(ERR,
 				    "tx_queue stop anomaly"
 				    " port %u, queue %u\n",
diff --git a/drivers/net/avp/Makefile b/drivers/net/avp/Makefile
index cd465aac9..7ffb4d172 100644
--- a/drivers/net/avp/Makefile
+++ b/drivers/net/avp/Makefile
@@ -42,7 +42,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_pmd_avp_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # install public header files to enable compilation of the hypervisor level
 # dpdk application
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index c746a0e2c..b5cc955f2 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -190,7 +190,7 @@ struct avp_dev {
 	struct rte_eth_dev_data *dev_data;
 	/**< Back pointer to ethernet device data */
 	volatile uint32_t flags; /**< Device operational flags */
-	uint8_t port_id; /**< Ethernet port identifier */
+	uint16_t port_id; /**< Ethernet port identifier */
 	struct rte_mempool *pool; /**< pkt mbuf mempool */
 	unsigned int guest_mbuf_size; /**< local pool mbuf size */
 	unsigned int host_mbuf_size; /**< host mbuf size */
diff --git a/drivers/net/bnx2x/Makefile b/drivers/net/bnx2x/Makefile
index e12310691..7a1c77523 100644
--- a/drivers/net/bnx2x/Makefile
+++ b/drivers/net/bnx2x/Makefile
@@ -12,7 +12,7 @@ LDLIBS += -lz
 
 EXPORT_MAP := rte_pmd_bnx2x_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 CFLAGS += -wd188 #188: enumerated type mixed with another type
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.h b/drivers/net/bnx2x/bnx2x_rxtx.h
index 2e38ec26a..9600e0f1c 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.h
+++ b/drivers/net/bnx2x/bnx2x_rxtx.h
@@ -41,7 +41,7 @@ struct bnx2x_rx_queue {
 	uint16_t                   rx_cq_head;           /**< Index of current rcq bd. */
 	uint16_t                   rx_cq_tail;           /**< Index of last rcq bd. */
 	uint16_t                   queue_id;             /**< RX queue index. */
-	uint8_t                    port_id;              /**< Device port identifier. */
+	uint16_t                   port_id;              /**< Device port identifier. */
 	struct bnx2x_softc           *sc;                  /**< Ptr to dev_private data. */
 };
 
@@ -62,7 +62,7 @@ struct bnx2x_tx_queue {
 	uint16_t                   nb_tx_avail;          /**< Number of TX descriptors available. */
 	uint16_t                   nb_tx_pages;          /**< number of TX pages */
 	uint16_t                   queue_id;             /**< TX queue index. */
-	uint8_t                    port_id;              /**< Device port identifier. */
+	uint16_t                   port_id;              /**< Device port identifier. */
 	struct bnx2x_softc           *sc;                  /**< Ptr to dev_private data */
 };
 
diff --git a/drivers/net/bnxt/Makefile b/drivers/net/bnxt/Makefile
index b03f65dc9..55b49b538 100644
--- a/drivers/net/bnxt/Makefile
+++ b/drivers/net/bnxt/Makefile
@@ -40,7 +40,7 @@ LIB = librte_pmd_bnxt.a
 
 EXPORT_MAP := rte_pmd_bnxt_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 405d94deb..26a9018b5 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -126,7 +126,7 @@ struct bnxt_pf_info {
 #define BNXT_FIRST_VF_FID	128
 #define BNXT_PF_RINGS_USED(bp)	bnxt_get_num_queues(bp)
 #define BNXT_PF_RINGS_AVAIL(bp)	(bp->pf.max_cp_rings - BNXT_PF_RINGS_USED(bp))
-	uint8_t			port_id;
+	uint16_t		port_id;
 	uint16_t		first_vf_id;
 	uint16_t		active_vfs;
 	uint16_t		max_vfs;
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index c9d11228b..2e817535e 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -489,13 +489,13 @@ static void bnxt_print_link_info(struct rte_eth_dev *eth_dev)
 
 	if (link->link_status)
 		RTE_LOG(INFO, PMD, "Port %d Link Up - speed %u Mbps - %s\n",
-			(uint8_t)(eth_dev->data->port_id),
+			eth_dev->data->port_id,
 			(uint32_t)link->link_speed,
 			(link->link_duplex == ETH_LINK_FULL_DUPLEX) ?
 			("full-duplex") : ("half-duplex\n"));
 	else
 		RTE_LOG(INFO, PMD, "Port %d Link Down\n",
-			(uint8_t)(eth_dev->data->port_id));
+			eth_dev->data->port_id);
 }
 
 static int bnxt_dev_lsc_intr_setup(struct rte_eth_dev *eth_dev)
diff --git a/drivers/net/bnxt/bnxt_rxq.h b/drivers/net/bnxt/bnxt_rxq.h
index 01aaa007f..cea0785d1 100644
--- a/drivers/net/bnxt/bnxt_rxq.h
+++ b/drivers/net/bnxt/bnxt_rxq.h
@@ -48,7 +48,7 @@ struct bnxt_rx_queue {
 	uint16_t		rx_free_thresh; /* max free RX desc to hold */
 	uint16_t		queue_id; /* RX queue index */
 	uint16_t		reg_idx; /* RX queue register index */
-	uint8_t			port_id; /* Device port identifier */
+	uint16_t		port_id; /* Device port identifier */
 	uint8_t			crc_len; /* 0 if CRC stripped, 4 otherwise */
 
 	struct bnxt		*bp;
diff --git a/drivers/net/bnxt/bnxt_txq.h b/drivers/net/bnxt/bnxt_txq.h
index 16f3a0bdd..f753c10f2 100644
--- a/drivers/net/bnxt/bnxt_txq.h
+++ b/drivers/net/bnxt/bnxt_txq.h
@@ -46,7 +46,7 @@ struct bnxt_tx_queue {
 	uint16_t		tx_next_rs; /* next desc to set RS bit */
 	uint16_t		queue_id; /* TX queue index */
 	uint16_t		reg_idx; /* TX queue register index */
-	uint8_t			port_id; /* Device port identifier */
+	uint16_t		port_id; /* Device port identifier */
 	uint8_t			pthresh; /* Prefetch threshold register */
 	uint8_t			hthresh; /* Host threshold register */
 	uint8_t			wthresh; /* Write-back threshold reg */
diff --git a/drivers/net/bnxt/rte_pmd_bnxt.c b/drivers/net/bnxt/rte_pmd_bnxt.c
index c343d9033..63fc27911 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt.c
+++ b/drivers/net/bnxt/rte_pmd_bnxt.c
@@ -67,7 +67,7 @@ int bnxt_rcv_msg_from_vf(struct bnxt *bp, uint16_t vf_id, void *msg)
 		true : false;
 }
 
-int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on)
+int rte_pmd_bnxt_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *eth_dev;
 	struct bnxt *bp;
@@ -108,7 +108,7 @@ rte_pmd_bnxt_set_all_queues_drop_en_cb(struct bnxt_vnic_info *vnic, void *onptr)
 	vnic->bd_stall = !(*on);
 }
 
-int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on)
+int rte_pmd_bnxt_set_all_queues_drop_en(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *eth_dev;
 	struct bnxt *bp;
@@ -159,7 +159,7 @@ int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_mac_addr(uint16_t port, uint16_t vf,
 				struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *dev;
@@ -191,7 +191,7 @@ int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk)
 {
 	struct rte_eth_dev *eth_dev;
@@ -241,7 +241,7 @@ int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
@@ -294,7 +294,7 @@ int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
@@ -350,7 +350,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq_cb(struct bnxt_vnic_info *vnic, void *onptr)
 }
 
 int
-rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_bnxt_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -385,7 +385,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rxmode(uint16_t port, uint16_t vf,
 				uint16_t rx_mask, uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -477,7 +477,7 @@ static int bnxt_set_vf_table(struct bnxt *bp, uint16_t vf)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+int rte_pmd_bnxt_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				    uint64_t vf_mask, uint8_t vlan_on)
 {
 	struct bnxt_vlan_table_entry *ve;
@@ -570,7 +570,7 @@ int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
 	return rc;
 }
 
-int rte_pmd_bnxt_get_vf_stats(uint8_t port,
+int rte_pmd_bnxt_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats)
 {
@@ -598,7 +598,7 @@ int rte_pmd_bnxt_get_vf_stats(uint8_t port,
 	return bnxt_hwrm_func_qstats(bp, bp->pf.first_vf_id + vf_id, stats);
 }
 
-int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
+int rte_pmd_bnxt_reset_vf_stats(uint16_t port,
 				uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -625,7 +625,7 @@ int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
 	return bnxt_hwrm_func_clr_stats(bp, bp->pf.first_vf_id + vf_id);
 }
 
-int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id)
+int rte_pmd_bnxt_get_vf_rx_status(uint16_t port, uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -651,7 +651,7 @@ int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id)
 	return bnxt_vf_vnic_count(bp, vf_id);
 }
 
-int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
+int rte_pmd_bnxt_get_vf_tx_drop_count(uint16_t port, uint16_t vf_id,
 				      uint64_t *count)
 {
 	struct rte_eth_dev *dev;
@@ -679,7 +679,7 @@ int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
 					     count);
 }
 
-int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *addr,
+int rte_pmd_bnxt_mac_addr_add(uint16_t port, struct ether_addr *addr,
 				uint32_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -756,7 +756,7 @@ int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *addr,
 }
 
 int
-rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+rte_pmd_bnxt_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id)
 {
 	struct rte_eth_dev *dev;
@@ -793,7 +793,7 @@ rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_persist_stats(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_persist_stats(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
diff --git a/drivers/net/bnxt/rte_pmd_bnxt.h b/drivers/net/bnxt/rte_pmd_bnxt.h
index c4c4770e3..f881d30d6 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt.h
+++ b/drivers/net/bnxt/rte_pmd_bnxt.h
@@ -78,7 +78,7 @@ struct rte_pmd_bnxt_mb_event_param {
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Set the VF MAC address.
@@ -94,7 +94,7 @@ int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_mac_addr(uint16_t port, uint16_t vf,
 		struct ether_addr *mac_addr);
 
 /**
@@ -115,7 +115,7 @@ int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_bnxt_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -134,7 +134,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+rte_pmd_bnxt_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id);
 
 /**
@@ -156,7 +156,7 @@ rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+int rte_pmd_bnxt_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				    uint64_t vf_mask, uint8_t vlan_on);
 
 /**
@@ -173,7 +173,7 @@ int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on);
+int rte_pmd_bnxt_set_tx_loopback(uint16_t port, uint8_t on);
 
 /**
  * set all queues drop enable bit
@@ -189,7 +189,7 @@ int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on);
+int rte_pmd_bnxt_set_all_queues_drop_en(uint16_t port, uint8_t on);
 
 /**
  * Set the VF rate limit.
@@ -207,7 +207,7 @@ int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk);
 
 /**
@@ -226,7 +226,7 @@ int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_bnxt_get_vf_stats(uint8_t port,
+int rte_pmd_bnxt_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats);
 
@@ -242,7 +242,7 @@ int rte_pmd_bnxt_get_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
+int rte_pmd_bnxt_reset_vf_stats(uint16_t port,
 				uint16_t vf_id);
 
 /**
@@ -261,7 +261,7 @@ int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Set RX L2 Filtering mode of a VF of an Ethernet device.
@@ -280,7 +280,7 @@ int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rxmode(uint16_t port, uint16_t vf,
 				uint16_t rx_mask, uint8_t on);
 
 /**
@@ -297,7 +297,7 @@ int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
  *   - (-ENOMEM) on an allocation failure
  *   - (-1) firmware interface error
  */
-int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id);
+int rte_pmd_bnxt_get_vf_rx_status(uint16_t port, uint16_t vf_id);
 
 /**
  * Queries the TX drop counter for the function
@@ -313,7 +313,7 @@ int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id);
  *   - (-EINVAL) invalid vf_id specified.
  *   - (-ENOTSUP) Ethernet device is not a PF
  */
-int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
+int rte_pmd_bnxt_get_vf_tx_drop_count(uint16_t port, uint16_t vf_id,
 				      uint64_t *count);
 
 /**
@@ -331,7 +331,7 @@ int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
  *   - (-ENOTSUP) Ethernet device is not a PF
  *   - (-ENOMEM) on an allocation failure
  */
-int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
+int rte_pmd_bnxt_mac_addr_add(uint16_t port, struct ether_addr *mac_addr,
 				uint32_t vf_id);
 
 /**
@@ -350,5 +350,5 @@ int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_persist_stats(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_persist_stats(uint16_t port, uint16_t vf, uint8_t on);
 #endif /* _PMD_BNXT_H_ */
diff --git a/drivers/net/bonding/Makefile b/drivers/net/bonding/Makefile
index 910c932da..ffc0c3cf7 100644
--- a/drivers/net/bonding/Makefile
+++ b/drivers/net/bonding/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/bonding/rte_eth_bond.h b/drivers/net/bonding/rte_eth_bond.h
index 8efbf0713..87ff29173 100644
--- a/drivers/net/bonding/rte_eth_bond.h
+++ b/drivers/net/bonding/rte_eth_bond.h
@@ -151,7 +151,7 @@ rte_eth_bond_free(const char *name);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Remove a slave rte_eth_dev device from the bonded device
@@ -163,7 +163,7 @@ rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_slave_remove(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Set link bonding mode of bonded device
@@ -175,7 +175,7 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode);
+rte_eth_bond_mode_set(uint16_t bonded_port_id, uint8_t mode);
 
 /**
  * Get link bonding mode of bonded device
@@ -186,7 +186,7 @@ rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode);
  *	link bonding mode on success, negative value otherwise
  */
 int
-rte_eth_bond_mode_get(uint8_t bonded_port_id);
+rte_eth_bond_mode_get(uint16_t bonded_port_id);
 
 /**
  * Set slave rte_eth_dev as primary slave of bonded device
@@ -198,7 +198,7 @@ rte_eth_bond_mode_get(uint8_t bonded_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_primary_set(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Get primary slave of bonded device
@@ -209,7 +209,7 @@ rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	Port Id of primary slave on success, -1 on failure
  */
 int
-rte_eth_bond_primary_get(uint8_t bonded_port_id);
+rte_eth_bond_primary_get(uint16_t bonded_port_id);
 
 /**
  * Populate an array with list of the slaves port id's of the bonded device
@@ -223,7 +223,8 @@ rte_eth_bond_primary_get(uint8_t bonded_port_id);
  *	negative value otherwise
  */
 int
-rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len);
+rte_eth_bond_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+			uint16_t len);
 
 /**
  * Populate an array with list of the active slaves port id's of the bonded
@@ -238,8 +239,8 @@ rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len);
  *	negative value otherwise
  */
 int
-rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
-		uint8_t len);
+rte_eth_bond_active_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+				uint16_t len);
 
 /**
  * Set explicit MAC address to use on bonded device and it's slaves.
@@ -252,7 +253,7 @@ rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
+rte_eth_bond_mac_address_set(uint16_t bonded_port_id,
 		struct ether_addr *mac_addr);
 
 /**
@@ -265,7 +266,7 @@ rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mac_address_reset(uint8_t bonded_port_id);
+rte_eth_bond_mac_address_reset(uint16_t bonded_port_id);
 
 /**
  * Set the transmit policy for bonded device to use when it is operating in
@@ -279,7 +280,7 @@ rte_eth_bond_mac_address_reset(uint8_t bonded_port_id);
  *	0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy);
+rte_eth_bond_xmit_policy_set(uint16_t bonded_port_id, uint8_t policy);
 
 /**
  * Get the transmit policy set on bonded device for balance mode operation
@@ -290,7 +291,7 @@ rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy);
  *	Balance transmit policy on success, negative value otherwise.
  */
 int
-rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id);
+rte_eth_bond_xmit_policy_get(uint16_t bonded_port_id);
 
 /**
  * Set the link monitoring frequency (in ms) for monitoring the link status of
@@ -304,7 +305,7 @@ rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id);
  */
 
 int
-rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms);
+rte_eth_bond_link_monitoring_set(uint16_t bonded_port_id, uint32_t internal_ms);
 
 /**
  * Get the current link monitoring frequency (in ms) for monitoring of the link
@@ -316,7 +317,7 @@ rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms);
  *	Monitoring interval on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id);
+rte_eth_bond_link_monitoring_get(uint16_t bonded_port_id);
 
 
 /**
@@ -330,7 +331,8 @@ rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id);
  *  0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
+rte_eth_bond_link_down_prop_delay_set(uint16_t bonded_port_id,
+				       uint32_t delay_ms);
 
 /**
  * Get the period in milliseconds set for delaying the disabling of a bonded
@@ -342,7 +344,7 @@ rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
  *  Delay period on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id);
+rte_eth_bond_link_down_prop_delay_get(uint16_t bonded_port_id);
 
 /**
  * Set the period in milliseconds for delaying the enabling of a bonded link
@@ -355,7 +357,8 @@ rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id);
  *  0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
+rte_eth_bond_link_up_prop_delay_set(uint16_t bonded_port_id,
+				    uint32_t delay_ms);
 
 /**
  * Get the period in milliseconds set for delaying the enabling of a bonded
@@ -367,7 +370,7 @@ rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
  *  Delay period on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_up_prop_delay_get(uint8_t bonded_port_id);
+rte_eth_bond_link_up_prop_delay_get(uint16_t bonded_port_id);
 
 
 #ifdef __cplusplus
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index c2b9e053c..c1873aa13 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -209,7 +209,7 @@ set_warning_flags(struct port *port, uint16_t flags)
 }
 
 static void
-show_warnings(uint8_t slave_id)
+show_warnings(uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 	uint8_t warnings;
@@ -278,7 +278,7 @@ record_default(struct port *port)
  * @param port			Port on which LACPDU was received.
  */
 static void
-rx_machine(struct bond_dev_private *internals, uint8_t slave_id,
+rx_machine(struct bond_dev_private *internals, uint16_t slave_id,
 		struct lacpdu *lacp)
 {
 	struct port *agg, *port = &mode_8023ad_ports[slave_id];
@@ -399,7 +399,7 @@ rx_machine(struct bond_dev_private *internals, uint8_t slave_id,
  * @param port			Port to handle state machine.
  */
 static void
-periodic_machine(struct bond_dev_private *internals, uint8_t slave_id)
+periodic_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 	/* Calculate if either site is LACP enabled */
@@ -461,7 +461,7 @@ periodic_machine(struct bond_dev_private *internals, uint8_t slave_id)
  * @param port			Port to handle state machine.
  */
 static void
-mux_machine(struct bond_dev_private *internals, uint8_t slave_id)
+mux_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 
@@ -564,7 +564,7 @@ mux_machine(struct bond_dev_private *internals, uint8_t slave_id)
  * @param port
  */
 static void
-tx_machine(struct bond_dev_private *internals, uint8_t slave_id)
+tx_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *agg, *port = &mode_8023ad_ports[slave_id];
 
@@ -688,11 +688,11 @@ static void
 selection_logic(struct bond_dev_private *internals, uint8_t slave_id)
 {
 	struct port *agg, *port;
-	uint8_t slaves_count, new_agg_id, i, j = 0;
-	uint8_t *slaves;
+	uint16_t slaves_count, new_agg_id, i, j = 0;
+	uint16_t *slaves;
 	uint64_t agg_bandwidth[8] = {0};
 	uint64_t agg_count[8] = {0};
-	uint8_t default_slave = 0;
+	uint16_t default_slave = 0;
 	uint8_t mode_count_id, mode_band_id;
 	struct rte_eth_link link_info;
 
@@ -923,7 +923,8 @@ bond_mode_8023ad_periodic_cb(void *arg)
 }
 
 void
-bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
+bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev,
+				uint16_t slave_id)
 {
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 
@@ -951,7 +952,7 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
 	memcpy(&port->actor, &initial, sizeof(struct port_params));
 	/* Standard requires that port ID must be grater than 0.
 	 * Add 1 do get corresponding port_number */
-	port->actor.port_number = rte_cpu_to_be_16((uint16_t)slave_id + 1);
+	port->actor.port_number = rte_cpu_to_be_16(slave_id + 1);
 
 	memcpy(&port->partner, &initial, sizeof(struct port_params));
 
@@ -1022,12 +1023,12 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
 
 int
 bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *bond_dev,
-		uint8_t slave_id)
+		uint16_t slave_id)
 {
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 	void *pkt = NULL;
 	struct port *port;
-	uint8_t i;
+	uint16_t i;
 
 	/* Given slave must be in active list */
 	RTE_ASSERT(find_slave_by_id(internals->active_slaves,
@@ -1066,7 +1067,7 @@ bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev)
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 	struct ether_addr slave_addr;
 	struct port *slave, *agg_slave;
-	uint8_t slave_id, i, j;
+	uint16_t slave_id, i, j;
 
 	bond_mode_8023ad_stop(bond_dev);
 
@@ -1214,7 +1215,7 @@ bond_mode_8023ad_stop(struct rte_eth_dev *bond_dev)
 
 void
 bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
-	uint8_t slave_id, struct rte_mbuf *pkt)
+				  uint16_t slave_id, struct rte_mbuf *pkt)
 {
 	struct mode8023ad_private *mode4 = &internals->mode4;
 	struct port *port = &mode_8023ad_ports[slave_id];
@@ -1295,7 +1296,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
 }
 
 int
-rte_eth_bond_8023ad_conf_get(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1312,7 +1313,7 @@ rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 }
 
 int
-rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
+rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id,
 		enum rte_bond_8023ad_agg_selection agg_selection)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1334,7 +1335,7 @@ rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
 	return 0;
 }
 
-int rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id)
+int rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id)
 {
 	struct rte_eth_dev *bond_dev;
 	struct bond_dev_private *internals;
@@ -1355,7 +1356,7 @@ int rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id)
 
 
 static int
-bond_8023ad_setup_validate(uint8_t port_id,
+bond_8023ad_setup_validate(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	if (valid_bonded_port_id(port_id) != 0)
@@ -1379,8 +1380,9 @@ bond_8023ad_setup_validate(uint8_t port_id,
 	return 0;
 }
 
+
 int
-rte_eth_bond_8023ad_setup(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1401,7 +1403,7 @@ rte_eth_bond_8023ad_setup(uint8_t port_id,
 
 
 int
-rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_slave_info(uint16_t port_id, uint16_t slave_id,
 		struct rte_eth_bond_8023ad_slave_info *info)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1434,7 +1436,7 @@ rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
 }
 
 static int
-bond_8023ad_ext_validate(uint8_t port_id, uint8_t slave_id)
+bond_8023ad_ext_validate(uint16_t port_id, uint16_t slave_id)
 {
 	struct rte_eth_dev *bond_dev;
 	struct bond_dev_private *internals;
@@ -1462,7 +1464,8 @@ bond_8023ad_ext_validate(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled)
+rte_eth_bond_8023ad_ext_collect(uint16_t port_id, uint16_t slave_id,
+				int enabled)
 {
 	struct port *port;
 	int res;
@@ -1482,7 +1485,8 @@ rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled)
 }
 
 int
-rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled)
+rte_eth_bond_8023ad_ext_distrib(uint16_t port_id, uint16_t slave_id,
+				int enabled)
 {
 	struct port *port;
 	int res;
@@ -1502,7 +1506,7 @@ rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled)
 }
 
 int
-rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id)
+rte_eth_bond_8023ad_ext_distrib_get(uint16_t port_id, uint16_t slave_id)
 {
 	struct port *port;
 	int err;
@@ -1516,7 +1520,7 @@ rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id)
+rte_eth_bond_8023ad_ext_collect_get(uint16_t port_id, uint16_t slave_id)
 {
 	struct port *port;
 	int err;
@@ -1530,7 +1534,7 @@ rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_ext_slowtx(uint16_t port_id, uint16_t slave_id,
 		struct rte_mbuf *lacp_pkt)
 {
 	struct port *port;
@@ -1591,7 +1595,7 @@ bond_mode_8023ad_ext_periodic_cb(void *arg)
 }
 
 int
-rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port)
+rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port)
 {
 	int retval = 0;
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
@@ -1615,7 +1619,7 @@ rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port)
 }
 
 int
-rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port)
+rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port)
 {
 	int retval = 0;
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h
index d609745e0..2874336d3 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.h
@@ -64,7 +64,7 @@ extern "C" {
 #define MARKER_TLV_TYPE_INFO                0x01
 #define MARKER_TLV_TYPE_RESP                0x02
 
-typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint8_t slave_id,
+typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint16_t slave_id,
 						  struct rte_mbuf *lacp_pkt);
 
 enum rte_bond_8023ad_selection {
@@ -176,7 +176,7 @@ struct rte_eth_bond_8023ad_slave_info {
 	struct port_params actor;
 	uint8_t partner_state;
 	struct port_params partner;
-	uint8_t agg_port_id;
+	uint16_t agg_port_id;
 };
 
 /**
@@ -192,7 +192,7 @@ struct rte_eth_bond_8023ad_slave_info {
  *   -EINVAL if conf is NULL
  */
 int
-rte_eth_bond_8023ad_conf_get(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
@@ -207,7 +207,7 @@ rte_eth_bond_8023ad_conf_get(uint8_t port_id,
  *   -EINVAL if configuration is invalid.
  */
 int
-rte_eth_bond_8023ad_setup(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
@@ -223,7 +223,7 @@ rte_eth_bond_8023ad_setup(uint8_t port_id,
  *       bonded device or is not inactive).
  */
 int
-rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_slave_info(uint16_t port_id, uint16_t slave_id,
 		struct rte_eth_bond_8023ad_slave_info *conf);
 
 #ifdef __cplusplus
@@ -241,7 +241,8 @@ rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled);
+rte_eth_bond_8023ad_ext_collect(uint16_t port_id, uint16_t slave_id,
+				int enabled);
 
 /**
  * Get COLLECTING flag from slave port actor state.
@@ -254,7 +255,7 @@ rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id);
+rte_eth_bond_8023ad_ext_collect_get(uint16_t port_id, uint16_t slave_id);
 
 /**
  * Configure a slave port to start distributing.
@@ -267,7 +268,8 @@ rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled);
+rte_eth_bond_8023ad_ext_distrib(uint16_t port_id, uint16_t slave_id,
+				int enabled);
 
 /**
  * Get DISTRIBUTING flag from slave port actor state.
@@ -280,7 +282,7 @@ rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id);
+rte_eth_bond_8023ad_ext_distrib_get(uint16_t port_id, uint16_t slave_id);
 
 /**
  * LACPDU transmit path for external 802.3ad state machine.  Caller retains
@@ -294,7 +296,7 @@ rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id);
  *   0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_ext_slowtx(uint16_t port_id, uint16_t slave_id,
 		struct rte_mbuf *lacp_pkt);
 
 /**
@@ -320,7 +322,7 @@ rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
  *   0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port_id);
+rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port_id);
 
 /**
  * Disable slow queue on slaves
@@ -337,7 +339,7 @@ rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port_id);
  *
  */
 int
-rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port_id);
+rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port_id);
 
 /*
  * Get aggregator mode for 8023ad
@@ -347,7 +349,7 @@ rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port_id);
  *   agregator mode on success, negative value otherwise
  */
 int
-rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id);
+rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id);
 
 /**
  * Set aggregator mode for 8023ad
@@ -356,6 +358,6 @@ rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id);
  *   0 on success, negative value otherwise
  */
 int
-rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
+rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id,
 		enum rte_bond_8023ad_agg_selection agg_selection);
 #endif /* RTE_ETH_BOND_8023AD_H_ */
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad_private.h b/drivers/net/bonding/rte_eth_bond_8023ad_private.h
index d46e44a84..433c7000d 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad_private.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad_private.h
@@ -279,7 +279,7 @@ bond_mode_8023ad_stop(struct rte_eth_dev *dev);
  */
 void
 bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
-	uint8_t slave_id, struct rte_mbuf *pkt);
+				 uint16_t slave_id, struct rte_mbuf *pkt);
 
 /**
  * @internal
@@ -293,7 +293,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
  *  0 on success, negative value otherwise.
  */
 void
-bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint8_t port_id);
+bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint16_t port_id);
 
 /**
  * @internal
@@ -307,7 +307,7 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint8_t port_id);
  *  0 on success, negative value otherwise.
  */
 int
-bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *dev, uint8_t slave_pos);
+bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *dev, uint16_t slave_pos);
 
 /**
  * Updates state when MAC was changed on bonded device or one of its slaves.
@@ -318,12 +318,12 @@ bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev);
 
 int
 bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
-		uint8_t slave_port);
+		uint16_t slave_port);
 
 int
-bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint8_t slave_port);
+bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port);
 
 int
-bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id);
+bond_8023ad_slow_pkt_hw_filter_supported(uint16_t port_id);
 
 #endif /* RTE_ETH_BOND_8023AD_H_ */
diff --git a/drivers/net/bonding/rte_eth_bond_alb.c b/drivers/net/bonding/rte_eth_bond_alb.c
index d9d37495d..f7efbb78e 100644
--- a/drivers/net/bonding/rte_eth_bond_alb.c
+++ b/drivers/net/bonding/rte_eth_bond_alb.c
@@ -148,7 +148,7 @@ void bond_mode_alb_arp_recv(struct ether_hdr *eth_h, uint16_t offset,
 	rte_spinlock_unlock(&internals->mode6.lock);
 }
 
-uint8_t
+uint16_t
 bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 		struct bond_dev_private *internals)
 {
@@ -220,13 +220,13 @@ bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 	return internals->current_primary_port;
 }
 
-uint8_t
+uint16_t
 bond_mode_alb_arp_upd(struct client_data *client_info,
 		struct rte_mbuf *pkt, struct bond_dev_private *internals)
 {
 	struct ether_hdr *eth_h;
 	struct arp_hdr *arp_h;
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 
 	rte_spinlock_lock(&internals->mode6.lock);
 	eth_h = rte_pktmbuf_mtod(pkt, struct ether_hdr *);
diff --git a/drivers/net/bonding/rte_eth_bond_alb.h b/drivers/net/bonding/rte_eth_bond_alb.h
index fd7c3aeb4..9f17f7c85 100644
--- a/drivers/net/bonding/rte_eth_bond_alb.h
+++ b/drivers/net/bonding/rte_eth_bond_alb.h
@@ -51,7 +51,7 @@ struct client_data {
 	uint32_t cli_ip;
 	/**< Client IP address */
 
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 	/**< Index of slave on which we connect with that client */
 	uint8_t in_use;
 	/**< Flag indicating if entry in client table is currently used */
@@ -113,7 +113,7 @@ bond_mode_alb_arp_recv(struct ether_hdr *eth_h, uint16_t offset,
  * @return
  * Index of slave on which packet should be sent.
  */
-uint8_t
+uint16_t
 bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 		struct bond_dev_private *internals);
 
@@ -127,7 +127,7 @@ bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
  * @return
  * Index of slawe on which packet should be sent.
  */
-uint8_t
+uint16_t
 bond_mode_alb_arp_upd(struct client_data *client_info,
 		struct rte_mbuf *pkt, struct bond_dev_private *internals);
 
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index de1d9e0db..529aae34e 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -56,14 +56,14 @@ check_for_bonded_ethdev(const struct rte_eth_dev *eth_dev)
 }
 
 int
-valid_bonded_port_id(uint8_t port_id)
+valid_bonded_port_id(uint16_t port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 	return check_for_bonded_ethdev(&rte_eth_devices[port_id]);
 }
 
 int
-valid_slave_port_id(uint8_t port_id, uint8_t mode)
+valid_slave_port_id(uint16_t port_id, uint8_t mode)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 
@@ -80,7 +80,7 @@ valid_slave_port_id(uint8_t port_id, uint8_t mode)
 }
 
 void
-activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
+activate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id)
 {
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
 	uint8_t active_count = internals->active_slave_count;
@@ -107,11 +107,11 @@ activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
 }
 
 void
-deactivate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
+deactivate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id)
 {
-	uint8_t slave_pos;
+	uint16_t slave_pos;
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
-	uint8_t active_count = internals->active_slave_count;
+	uint16_t active_count = internals->active_slave_count;
 
 	if (internals->mode == BONDING_MODE_8023AD) {
 		bond_mode_8023ad_stop(eth_dev);
@@ -153,7 +153,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
 {
 	struct bond_dev_private *internals;
 	char devargs[52];
-	uint8_t port_id;
+	uint16_t port_id;
 	int ret;
 
 	if (name == NULL) {
@@ -193,7 +193,7 @@ rte_eth_bond_free(const char *name)
 }
 
 static int
-slave_vlan_filter_set(uint8_t bonded_port_id, uint8_t slave_port_id)
+slave_vlan_filter_set(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -233,7 +233,7 @@ slave_vlan_filter_set(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 static int
-__eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
+__eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev, *slave_eth_dev;
 	struct bond_dev_private *internals;
@@ -363,7 +363,7 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -387,7 +387,8 @@ rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 static int
-__eth_bond_slave_remove_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
+__eth_bond_slave_remove_lock_free(uint16_t bonded_port_id,
+				   uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -466,7 +467,7 @@ __eth_bond_slave_remove_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_slave_remove(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -488,7 +489,7 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode)
+rte_eth_bond_mode_set(uint16_t bonded_port_id, uint8_t mode)
 {
 	if (valid_bonded_port_id(bonded_port_id) != 0)
 		return -1;
@@ -497,7 +498,7 @@ rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode)
 }
 
 int
-rte_eth_bond_mode_get(uint8_t bonded_port_id)
+rte_eth_bond_mode_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -510,7 +511,7 @@ rte_eth_bond_mode_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_primary_set(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -531,7 +532,7 @@ rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_primary_get(uint8_t bonded_port_id)
+rte_eth_bond_primary_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -547,7 +548,8 @@ rte_eth_bond_primary_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len)
+rte_eth_bond_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+			uint16_t len)
 {
 	struct bond_dev_private *internals;
 	uint8_t i;
@@ -570,8 +572,8 @@ rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len)
 }
 
 int
-rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
-		uint8_t len)
+rte_eth_bond_active_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+		uint16_t len)
 {
 	struct bond_dev_private *internals;
 
@@ -586,13 +588,14 @@ rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
 	if (internals->active_slave_count > len)
 		return -1;
 
-	memcpy(slaves, internals->active_slaves, internals->active_slave_count);
+	memcpy(slaves, internals->active_slaves,
+	internals->active_slave_count * sizeof(internals->active_slaves[0]));
 
 	return internals->active_slave_count;
 }
 
 int
-rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
+rte_eth_bond_mac_address_set(uint16_t bonded_port_id,
 		struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *bonded_eth_dev;
@@ -618,7 +621,7 @@ rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
 }
 
 int
-rte_eth_bond_mac_address_reset(uint8_t bonded_port_id)
+rte_eth_bond_mac_address_reset(uint16_t bonded_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -647,7 +650,7 @@ rte_eth_bond_mac_address_reset(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy)
+rte_eth_bond_xmit_policy_set(uint16_t bonded_port_id, uint8_t policy)
 {
 	struct bond_dev_private *internals;
 
@@ -677,7 +680,7 @@ rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy)
 }
 
 int
-rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id)
+rte_eth_bond_xmit_policy_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -690,7 +693,7 @@ rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms)
+rte_eth_bond_link_monitoring_set(uint16_t bonded_port_id, uint32_t internal_ms)
 {
 	struct bond_dev_private *internals;
 
@@ -704,7 +707,7 @@ rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms)
 }
 
 int
-rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id)
+rte_eth_bond_link_monitoring_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -717,7 +720,8 @@ rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
+rte_eth_bond_link_down_prop_delay_set(uint16_t bonded_port_id,
+				       uint32_t delay_ms)
 
 {
 	struct bond_dev_private *internals;
@@ -732,7 +736,7 @@ rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
 }
 
 int
-rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id)
+rte_eth_bond_link_down_prop_delay_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -745,7 +749,7 @@ rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
+rte_eth_bond_link_up_prop_delay_set(uint16_t bonded_port_id, uint32_t delay_ms)
 
 {
 	struct bond_dev_private *internals;
@@ -760,7 +764,7 @@ rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
 }
 
 int
-rte_eth_bond_link_up_prop_delay_get(uint8_t bonded_port_id)
+rte_eth_bond_link_up_prop_delay_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c
index bb634c62e..04d1f4e8f 100644
--- a/drivers/net/bonding/rte_eth_bond_args.c
+++ b/drivers/net/bonding/rte_eth_bond_args.c
@@ -153,7 +153,7 @@ bond_ethdev_parse_slave_port_kvarg(const char *key,
 			return -1;
 		} else
 			slave_ports->slaves[slave_ports->slave_count++] =
-					(uint8_t)port_id;
+					port_id;
 	}
 	return 0;
 }
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 3ee70baa0..2d680e3fb 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -174,7 +174,7 @@ const struct rte_flow_attr flow_attr_8023ad = {
 
 int
 bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
-		uint8_t slave_port) {
+		uint16_t slave_port) {
 	struct rte_flow_error error;
 	struct bond_dev_private *internals = (struct bond_dev_private *)
 			(bond_dev->data->dev_private);
@@ -202,12 +202,12 @@ bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
 }
 
 int
-bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id) {
+bond_8023ad_slow_pkt_hw_filter_supported(uint16_t port_id) {
 	struct rte_eth_dev *bond_dev = &rte_eth_devices[port_id];
 	struct bond_dev_private *internals = (struct bond_dev_private *)
 			(bond_dev->data->dev_private);
 	struct rte_eth_dev_info bond_info, slave_info;
-	uint8_t idx;
+	uint16_t idx;
 
 	/* Verify if all slaves in bonding supports flow director and */
 	if (internals->slave_count > 0) {
@@ -230,7 +230,7 @@ bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id) {
 }
 
 int
-bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint8_t slave_port) {
+bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port) {
 
 	struct rte_flow_error error;
 	struct bond_dev_private *internals = (struct bond_dev_private *)
@@ -270,10 +270,10 @@ bond_ethdev_rx_burst_8023ad_fast_queue(void *queue, struct rte_mbuf **bufs,
 	struct bond_rx_queue *bd_rx_q = (struct bond_rx_queue *)queue;
 	struct bond_dev_private *internals = bd_rx_q->dev_private;
 	uint16_t num_rx_total = 0;	/* Total number of received packets */
-	uint8_t slaves[RTE_MAX_ETHPORTS];
-	uint8_t slave_count;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slave_count;
 
-	uint8_t i, idx;
+	uint16_t i, idx;
 
 	/* Copy slave list to protect against slave up/down changes during tx
 	 * bursting */
@@ -302,8 +302,8 @@ bond_ethdev_tx_burst_8023ad_fast_queue(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 	 /* positions in slaves, not ID */
 	uint8_t distributing_offsets[RTE_MAX_ETHPORTS];
 	uint8_t distributing_count;
@@ -394,8 +394,8 @@ bond_ethdev_rx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
 
 	const uint16_t ether_type_slow_be = rte_be_to_cpu_16(ETHER_TYPE_SLOW);
 	uint16_t num_rx_total = 0;	/* Total number of received packets */
-	uint8_t slaves[RTE_MAX_ETHPORTS];
-	uint8_t slave_count, idx;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slave_count, idx;
 
 	uint8_t collecting;  /* current slave collecting status */
 	const uint8_t promisc = internals->promiscuous_en;
@@ -673,8 +673,8 @@ bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs,
 	struct rte_mbuf *slave_bufs[RTE_MAX_ETHPORTS][nb_pkts];
 	uint16_t slave_nb_pkts[RTE_MAX_ETHPORTS] = { 0 };
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t num_tx_total = 0, num_tx_slave;
 
@@ -904,7 +904,7 @@ bandwidth_cmp(const void *a, const void *b)
 }
 
 static void
-bandwidth_left(uint8_t port_id, uint64_t load, uint8_t update_idx,
+bandwidth_left(uint16_t port_id, uint64_t load, uint8_t update_idx,
 		struct bwg_slave *bwg_slave)
 {
 	struct rte_eth_link link_status;
@@ -970,10 +970,10 @@ bond_ethdev_tx_burst_tlb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 	struct rte_eth_dev *primary_port =
 			&rte_eth_devices[internals->primary_port];
 	uint16_t num_tx_total = 0;
-	uint8_t i, j;
+	uint16_t i, j;
 
-	uint8_t num_of_slaves = internals->active_slave_count;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves = internals->active_slave_count;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	struct ether_hdr *ether_hdr;
 	struct ether_addr primary_slave_addr;
@@ -1059,7 +1059,7 @@ bond_ethdev_tx_burst_alb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 
 	uint16_t num_send, num_not_send = 0;
 	uint16_t num_tx_total = 0;
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 
 	int i, j;
 
@@ -1178,8 +1178,8 @@ bond_ethdev_tx_burst_balance(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t num_tx_total = 0, num_tx_slave = 0, tx_fail_total = 0;
 
@@ -1239,8 +1239,8 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 	 /* positions in slaves, not ID */
 	uint8_t distributing_offsets[RTE_MAX_ETHPORTS];
 	uint8_t distributing_count;
@@ -1333,7 +1333,7 @@ bond_ethdev_tx_burst_broadcast(void *queue, struct rte_mbuf **bufs,
 	struct bond_tx_queue *bd_tx_q;
 
 	uint8_t tx_failed_flag = 0, num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t max_nb_of_tx_pkts = 0;
 
@@ -1861,7 +1861,7 @@ slave_add(struct bond_dev_private *internals,
 
 void
 bond_ethdev_primary_set(struct bond_dev_private *internals,
-		uint8_t slave_port_id)
+		uint16_t slave_port_id)
 {
 	int i;
 
@@ -2125,7 +2125,7 @@ static int
 bond_ethdev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 {
 	int res;
-	uint8_t i;
+	uint16_t i;
 	struct bond_dev_private *internals = dev->data->dev_private;
 
 	/* don't do this while a slave is being added */
@@ -2137,7 +2137,7 @@ bond_ethdev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 		rte_bitmap_clear(internals->vlan_filter_bmp, vlan_id);
 
 	for (i = 0; i < internals->slave_count; i++) {
-		uint8_t port_id = internals->slaves[i].port_id;
+		uint16_t port_id = internals->slaves[i].port_id;
 
 		res = rte_eth_dev_vlan_filter(port_id, vlan_id, on);
 		if (res == ENOTSUP)
@@ -2277,7 +2277,7 @@ bond_ethdev_slave_link_status_change_monitor(void *cb_arg)
 static int
 bond_ethdev_link_update(struct rte_eth_dev *ethdev, int wait_to_complete)
 {
-	void (*link_update)(uint8_t port_id, struct rte_eth_link *eth_link);
+	void (*link_update)(uint16_t port_id, struct rte_eth_link *eth_link);
 
 	struct bond_dev_private *bond_ctx;
 	struct rte_eth_link slave_link;
@@ -2466,7 +2466,7 @@ bond_ethdev_delayed_lsc_propagation(void *arg)
 }
 
 int
-bond_ethdev_lsc_event_callback(uint8_t port_id, enum rte_eth_event_type type,
+bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type,
 		void *param, void *ret_param __rte_unused)
 {
 	struct rte_eth_dev *bonded_eth_dev;
@@ -2951,7 +2951,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 	struct bond_dev_private *internals = dev->data->dev_private;
 	struct rte_kvargs *kvlist = internals->kvlist;
 	int arg_count;
-	uint8_t port_id = dev - rte_eth_devices;
+	uint16_t port_id = dev - rte_eth_devices;
 	uint8_t agg_mode;
 
 	static const uint8_t default_rss_key[40] = {
@@ -3086,7 +3086,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 	/* Parse/set primary slave port id*/
 	arg_count = rte_kvargs_count(kvlist, PMD_BOND_PRIMARY_SLAVE_KVARG);
 	if (arg_count == 1) {
-		uint8_t primary_slave_port_id;
+		uint16_t primary_slave_port_id;
 
 		if (rte_kvargs_process(kvlist,
 				PMD_BOND_PRIMARY_SLAVE_KVARG,
@@ -3099,7 +3099,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 		}
 
 		/* Set balance mode transmit policy*/
-		if (rte_eth_bond_primary_set(port_id, (uint8_t)primary_slave_port_id)
+		if (rte_eth_bond_primary_set(port_id, primary_slave_port_id)
 				!= 0) {
 			RTE_LOG(ERR, EAL,
 					"Failed to set primary slave port %d on bonded device %s\n",
diff --git a/drivers/net/bonding/rte_eth_bond_private.h b/drivers/net/bonding/rte_eth_bond_private.h
index 1fe6ff880..1392da98d 100644
--- a/drivers/net/bonding/rte_eth_bond_private.h
+++ b/drivers/net/bonding/rte_eth_bond_private.h
@@ -93,12 +93,12 @@ struct bond_tx_queue {
 
 /** Bonded slave devices structure */
 struct bond_ethdev_slave_ports {
-	uint8_t slaves[RTE_MAX_ETHPORTS];	/**< Slave port id array */
-	uint8_t slave_count;				/**< Number of slaves */
+	uint16_t slaves[RTE_MAX_ETHPORTS];	/**< Slave port id array */
+	uint16_t slave_count;				/**< Number of slaves */
 };
 
 struct bond_slave_details {
-	uint8_t port_id;
+	uint16_t port_id;
 
 	uint8_t link_status_poll_enabled;
 	uint8_t link_status_wait_to_complete;
@@ -114,14 +114,14 @@ typedef uint16_t (*xmit_hash_t)(const struct rte_mbuf *buf, uint8_t slave_count)
 
 /** Link Bonding PMD device private configuration Structure */
 struct bond_dev_private {
-	uint8_t port_id;					/**< Port Id of Bonded Port */
+	uint16_t port_id;			/**< Port Id of Bonded Port */
 	uint8_t mode;						/**< Link Bonding Mode */
 
 	rte_spinlock_t lock;
 
-	uint8_t primary_port;				/**< Primary Slave Port */
-	uint8_t current_primary_port;		/**< Primary Slave Port */
-	uint8_t user_defined_primary_port;
+	uint16_t primary_port;			/**< Primary Slave Port */
+	uint16_t current_primary_port;		/**< Primary Slave Port */
+	uint16_t user_defined_primary_port;
 	/**< Flag for whether primary port is user defined or not */
 
 	uint8_t balance_xmit_policy;
@@ -144,16 +144,17 @@ struct bond_dev_private {
 	uint16_t nb_rx_queues;			/**< Total number of rx queues */
 	uint16_t nb_tx_queues;			/**< Total number of tx queues*/
 
-	uint8_t active_slave;		/**< Next active_slave to poll */
-	uint8_t active_slave_count;		/**< Number of active slaves */
-	uint8_t active_slaves[RTE_MAX_ETHPORTS];	/**< Active slave list */
+	uint16_t active_slave;		/**< Next active_slave to poll */
+	uint16_t active_slave_count;		/**< Number of active slaves */
+	uint16_t active_slaves[RTE_MAX_ETHPORTS];    /**< Active slave list */
 
-	uint8_t slave_count;			/**< Number of bonded slaves */
+	uint16_t slave_count;			/**< Number of bonded slaves */
 	struct bond_slave_details slaves[RTE_MAX_ETHPORTS];
 	/**< Arary of bonded slaves details */
 
 	struct mode8023ad_private mode4;
-	uint8_t tlb_slaves_order[RTE_MAX_ETHPORTS]; /* TLB active slaves send order */
+	uint16_t tlb_slaves_order[RTE_MAX_ETHPORTS];
+	/**< TLB active slaves send order */
 	struct mode_alb_private mode6;
 
 	uint32_t rx_offload_capa;            /** Rx offload capability */
@@ -186,10 +187,10 @@ check_for_bonded_ethdev(const struct rte_eth_dev *eth_dev);
 
 /* Search given slave array to find position of given id.
  * Return slave pos or slaves_count if not found. */
-static inline uint8_t
-find_slave_by_id(uint8_t *slaves, uint8_t slaves_count, uint8_t slave_id) {
+static inline uint16_t
+find_slave_by_id(uint16_t *slaves, uint16_t slaves_count, uint16_t slave_id) {
 
-	uint8_t pos;
+	uint16_t pos;
 	for (pos = 0; pos < slaves_count; pos++) {
 		if (slave_id == slaves[pos])
 			break;
@@ -199,19 +200,19 @@ find_slave_by_id(uint8_t *slaves, uint8_t slaves_count, uint8_t slave_id) {
 }
 
 int
-valid_port_id(uint8_t port_id);
+valid_port_id(uint16_t port_id);
 
 int
-valid_bonded_port_id(uint8_t port_id);
+valid_bonded_port_id(uint16_t port_id);
 
 int
-valid_slave_port_id(uint8_t port_id, uint8_t mode);
+valid_slave_port_id(uint16_t port_id, uint8_t mode);
 
 void
-deactivate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id);
+deactivate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id);
 
 void
-activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id);
+activate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id);
 
 void
 link_properties_set(struct rte_eth_dev *bonded_eth_dev,
@@ -255,10 +256,10 @@ xmit_l34_hash(const struct rte_mbuf *buf, uint8_t slave_count);
 
 void
 bond_ethdev_primary_set(struct bond_dev_private *internals,
-		uint8_t slave_port_id);
+		uint16_t slave_port_id);
 
 int
-bond_ethdev_lsc_event_callback(uint8_t port_id, enum rte_eth_event_type type,
+bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type,
 		void *param, void *ret_param);
 
 int
diff --git a/drivers/net/e1000/Makefile b/drivers/net/e1000/Makefile
index ffdf36d37..a94ac7605 100644
--- a/drivers/net/e1000/Makefile
+++ b/drivers/net/e1000/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index 3d4ab9368..a59947d78 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -1624,7 +1624,7 @@ eth_em_interrupt_action(struct rte_eth_dev *dev,
 	rte_em_dev_atomic_read_link_status(dev, &link);
 	if (link.link_status) {
 		PMD_INIT_LOG(INFO, " Port %d: Link Up - speed %u Mbps - %s",
-			     dev->data->port_id, (unsigned)link.link_speed,
+			     dev->data->port_id, link.link_speed,
 			     link.link_duplex == ETH_LINK_FULL_DUPLEX ?
 			     "full-duplex" : "half-duplex");
 	} else {
diff --git a/drivers/net/e1000/em_rxtx.c b/drivers/net/e1000/em_rxtx.c
index 31819c5bd..06ba68e39 100644
--- a/drivers/net/e1000/em_rxtx.c
+++ b/drivers/net/e1000/em_rxtx.c
@@ -119,7 +119,7 @@ struct em_rx_queue {
 	uint16_t            nb_rx_hold; /**< number of held free RX desc. */
 	uint16_t            rx_free_thresh; /**< max free RX desc to hold. */
 	uint16_t            queue_id;   /**< RX queue index. */
-	uint8_t             port_id;    /**< Device port identifier. */
+	uint16_t            port_id;    /**< Device port identifier. */
 	uint8_t             pthresh;    /**< Prefetch threshold register. */
 	uint8_t             hthresh;    /**< Host threshold register. */
 	uint8_t             wthresh;    /**< Write-back threshold register. */
@@ -186,7 +186,7 @@ struct em_tx_queue {
 	/** Total number of TX descriptors ready to be allocated. */
 	uint16_t               nb_tx_free;
 	uint16_t               queue_id; /**< TX queue index. */
-	uint8_t                port_id;  /**< Device port identifier. */
+	uint16_t               port_id;  /**< Device port identifier. */
 	uint8_t                pthresh;  /**< Prefetch threshold register. */
 	uint8_t                hthresh;  /**< Host threshold register. */
 	uint8_t                wthresh;  /**< Write-back threshold register. */
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index 1c80a2a1b..a800d9c2b 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -122,7 +122,7 @@ struct igb_rx_queue {
 	uint16_t            rx_free_thresh; /**< max free RX desc to hold. */
 	uint16_t            queue_id;   /**< RX queue index. */
 	uint16_t            reg_idx;    /**< RX queue register index. */
-	uint8_t             port_id;    /**< Device port identifier. */
+	uint16_t            port_id;    /**< Device port identifier. */
 	uint8_t             pthresh;    /**< Prefetch threshold register. */
 	uint8_t             hthresh;    /**< Host threshold register. */
 	uint8_t             wthresh;    /**< Write-back threshold register. */
@@ -191,7 +191,7 @@ struct igb_tx_queue {
 	/**< Index of first used TX descriptor. */
 	uint16_t               queue_id; /**< TX queue index. */
 	uint16_t               reg_idx;  /**< TX queue register index. */
-	uint8_t                port_id;  /**< Device port identifier. */
+	uint16_t               port_id;  /**< Device port identifier. */
 	uint8_t                pthresh;  /**< Prefetch threshold register. */
 	uint8_t                hthresh;  /**< Host threshold register. */
 	uint8_t                wthresh;  /**< Write-back threshold register. */
diff --git a/drivers/net/failsafe/Makefile b/drivers/net/failsafe/Makefile
index d516d3621..e6bfad728 100644
--- a/drivers/net/failsafe/Makefile
+++ b/drivers/net/failsafe/Makefile
@@ -36,7 +36,7 @@ LIB = librte_pmd_failsafe.a
 
 EXPORT_MAP := rte_pmd_failsafe_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # Sources are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_FAILSAFE) += failsafe.c
diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c
index a3a8cce95..1c8a9337e 100644
--- a/drivers/net/failsafe/failsafe_ether.c
+++ b/drivers/net/failsafe/failsafe_ether.c
@@ -400,7 +400,7 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)
 }
 
 int
-failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused,
+failsafe_eth_rmv_event_callback(uint16_t port_id __rte_unused,
 				enum rte_eth_event_type event __rte_unused,
 				void *cb_arg, void *out __rte_unused)
 {
@@ -419,7 +419,7 @@ failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused,
 }
 
 int
-failsafe_eth_lsc_event_callback(uint8_t port_id __rte_unused,
+failsafe_eth_lsc_event_callback(uint16_t port_id __rte_unused,
 				enum rte_eth_event_type event __rte_unused,
 				void *cb_arg, void *out __rte_unused)
 {
diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h
index 0361cf434..4ae6e6c5f 100644
--- a/drivers/net/failsafe/failsafe_private.h
+++ b/drivers/net/failsafe/failsafe_private.h
@@ -180,10 +180,10 @@ int failsafe_eal_uninit(struct rte_eth_dev *dev);
 
 int failsafe_eth_dev_state_sync(struct rte_eth_dev *dev);
 void failsafe_dev_remove(struct rte_eth_dev *dev);
-int failsafe_eth_rmv_event_callback(uint8_t port_id,
+int failsafe_eth_rmv_event_callback(uint16_t port_id,
 				    enum rte_eth_event_type type,
 				    void *arg, void *out);
-int failsafe_eth_lsc_event_callback(uint8_t port_id,
+int failsafe_eth_lsc_event_callback(uint16_t port_id,
 				    enum rte_eth_event_type event,
 				    void *cb_arg, void *out);
 
diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile
index e0024f052..5034064e4 100644
--- a/drivers/net/fm10k/Makefile
+++ b/drivers/net/fm10k/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_fm10k_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
diff --git a/drivers/net/fm10k/fm10k.h b/drivers/net/fm10k/fm10k.h
index 8e1a95062..060982b10 100644
--- a/drivers/net/fm10k/fm10k.h
+++ b/drivers/net/fm10k/fm10k.h
@@ -204,7 +204,7 @@ struct fm10k_rx_queue {
 	uint16_t rxrearm_nb;     /* number of remaining to be re-armed */
 	uint16_t rxrearm_start;  /* the idx we start the re-arming from */
 	uint16_t rx_using_sse; /* indicates that vector RX is in use */
-	uint8_t port_id;
+	uint16_t port_id;
 	uint8_t drop_en;
 	uint8_t rx_deferred_start; /* don't start this queue in dev start. */
 	uint16_t rx_ftag_en; /* indicates FTAG RX supported */
@@ -241,7 +241,7 @@ struct fm10k_tx_queue {
 	volatile uint32_t *tail_ptr;
 	uint32_t txq_flags; /* Holds flags for this TXq */
 	uint16_t nb_desc;
-	uint8_t port_id;
+	uint16_t port_id;
 	uint8_t tx_deferred_start; /** don't start this queue in dev start. */
 	uint16_t queue_id;
 	uint16_t tx_ftag_en; /* indicates FTAG TX supported */
@@ -289,7 +289,7 @@ static inline uint16_t fifo_remove(struct fifo *fifo)
 }
 
 static inline void
-fm10k_pktmbuf_reset(struct rte_mbuf *mb, uint8_t in_port)
+fm10k_pktmbuf_reset(struct rte_mbuf *mb, uint16_t in_port)
 {
 	rte_mbuf_refcnt_set(mb, 1);
 	mb->next = NULL;
diff --git a/drivers/net/i40e/Makefile b/drivers/net/i40e/Makefile
index 55c79a60a..1290d7f32 100644
--- a/drivers/net/i40e/Makefile
+++ b/drivers/net/i40e/Makefile
@@ -42,7 +42,7 @@ CFLAGS += -DX722_A0_SUPPORT
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # Add extra flags for base driver files (also known as shared code)
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index f12aefa5d..c4c6aec1d 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -1920,8 +1920,9 @@ i40e_dev_start(struct rte_eth_dev *dev)
 	hw->adapter_stopped = 0;
 
 	if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
-		PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; autonegotiation disabled",
-			     dev->data->port_id);
+		PMD_INIT_LOG(ERR,
+		"Invalid link_speeds for port %u, autonegotiation disabled",
+			      dev->data->port_id);
 		return -EINVAL;
 	}
 
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index 20084d649..ff2ab8575 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -121,7 +121,7 @@ struct i40e_rx_queue {
 	uint16_t rxrearm_start;	/**< the idx we start the re-arming from */
 	uint64_t mbuf_initializer; /**< value to init mbufs */
 
-	uint8_t port_id; /**< device port ID */
+	uint16_t port_id; /**< device port ID */
 	uint8_t crc_len; /**< 0 if CRC stripped, 4 otherwise */
 	uint16_t queue_id; /**< RX queue index */
 	uint16_t reg_idx; /**< RX queue register index */
@@ -167,7 +167,7 @@ struct i40e_tx_queue {
 	uint8_t pthresh; /**< Prefetch threshold register. */
 	uint8_t hthresh; /**< Host threshold register. */
 	uint8_t wthresh; /**< Write-back threshold reg. */
-	uint8_t port_id; /**< Device port identifier. */
+	uint16_t port_id; /**< Device port identifier. */
 	uint16_t queue_id; /**< TX queue index. */
 	uint16_t reg_idx;
 	uint32_t txq_flags;
diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index f12b7f4a1..3728d39b9 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -41,7 +41,7 @@
 #include "rte_pmd_i40e.h"
 
 int
-rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf)
+rte_pmd_i40e_ping_vfs(uint16_t port, uint16_t vf)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -66,7 +66,7 @@ rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf)
 }
 
 int
-rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -170,7 +170,7 @@ i40e_add_rm_all_vlan_filter(struct i40e_vsi *vsi, uint8_t add)
 }
 
 int
-rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -430,7 +430,7 @@ i40e_vsi_set_tx_loopback(struct i40e_vsi *vsi, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_tx_loopback(uint8_t port, uint8_t on)
+rte_pmd_i40e_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -473,7 +473,7 @@ rte_pmd_i40e_set_tx_loopback(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_unicast_promisc(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -514,7 +514,7 @@ rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_multicast_promisc(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -555,7 +555,7 @@ rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_mac_addr(uint16_t port, uint16_t vf_id,
 			     struct ether_addr *mac_addr)
 {
 	struct i40e_mac_filter *f;
@@ -598,7 +598,7 @@ rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
 
 /* Set vlan strip on/off for specific VF from host */
 int
-rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_vlan_stripq(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -633,7 +633,7 @@ rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf_id, uint8_t on)
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_vlan_insert(uint16_t port, uint16_t vf_id,
 				    uint16_t vlan_id)
 {
 	struct rte_eth_dev *dev;
@@ -698,7 +698,7 @@ int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_broadcast(uint16_t port, uint16_t vf_id,
 				  uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -764,7 +764,7 @@ int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on)
+int rte_pmd_i40e_set_vf_vlan_tag(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -858,7 +858,7 @@ i40e_vlan_filter_count(struct i40e_vsi *vsi)
 	return count;
 }
 
-int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
+int rte_pmd_i40e_set_vf_vlan_filter(uint16_t port, uint16_t vlan_id,
 				    uint64_t vf_mask, uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -941,7 +941,7 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
 }
 
 int
-rte_pmd_i40e_get_vf_stats(uint8_t port,
+rte_pmd_i40e_get_vf_stats(uint16_t port,
 			  uint16_t vf_id,
 			  struct rte_eth_stats *stats)
 {
@@ -986,7 +986,7 @@ rte_pmd_i40e_get_vf_stats(uint8_t port,
 }
 
 int
-rte_pmd_i40e_reset_vf_stats(uint8_t port,
+rte_pmd_i40e_reset_vf_stats(uint16_t port,
 			    uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -1020,7 +1020,7 @@ rte_pmd_i40e_reset_vf_stats(uint8_t port,
 }
 
 int
-rte_pmd_i40e_set_vf_max_bw(uint8_t port, uint16_t vf_id, uint32_t bw)
+rte_pmd_i40e_set_vf_max_bw(uint16_t port, uint16_t vf_id, uint32_t bw)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -1109,7 +1109,7 @@ rte_pmd_i40e_set_vf_max_bw(uint8_t port, uint16_t vf_id, uint32_t bw)
 }
 
 int
-rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_tc_bw_alloc(uint16_t port, uint16_t vf_id,
 				uint8_t tc_num, uint8_t *bw_weight)
 {
 	struct rte_eth_dev *dev;
@@ -1223,7 +1223,7 @@ rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port, uint16_t vf_id,
 }
 
 int
-rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_tc_max_bw(uint16_t port, uint16_t vf_id,
 			      uint8_t tc_no, uint32_t bw)
 {
 	struct rte_eth_dev *dev;
@@ -1341,7 +1341,7 @@ rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port, uint16_t vf_id,
 }
 
 int
-rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map)
+rte_pmd_i40e_set_tc_strict_prio(uint16_t port, uint8_t tc_map)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -1513,7 +1513,7 @@ i40e_add_rm_profile_info(struct i40e_hw *hw, uint8_t *profile_info_sec)
 
 /* Check if the profile info exists */
 static int
-i40e_check_profile_info(uint8_t port, uint8_t *profile_info_sec)
+i40e_check_profile_info(uint16_t port, uint8_t *profile_info_sec)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1557,7 +1557,7 @@ i40e_check_profile_info(uint8_t port, uint8_t *profile_info_sec)
 }
 
 int
-rte_pmd_i40e_process_ddp_package(uint8_t port, uint8_t *buff,
+rte_pmd_i40e_process_ddp_package(uint16_t port, uint8_t *buff,
 				 uint32_t size,
 				 enum rte_pmd_i40e_package_op op)
 {
@@ -1863,7 +1863,7 @@ int rte_pmd_i40e_get_ddp_info(uint8_t *pkg_buff, uint32_t pkg_size,
 }
 
 int
-rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size)
+rte_pmd_i40e_get_ddp_list(uint16_t port, uint8_t *buff, uint32_t size)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_hw *hw;
@@ -1991,7 +1991,7 @@ static int check_invalid_ptype_mapping(
 
 int
 rte_pmd_i40e_ptype_mapping_update(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t count,
 			uint8_t exclusive)
@@ -2027,7 +2027,7 @@ rte_pmd_i40e_ptype_mapping_update(
 	return 0;
 }
 
-int rte_pmd_i40e_ptype_mapping_reset(uint8_t port)
+int rte_pmd_i40e_ptype_mapping_reset(uint16_t port)
 {
 	struct rte_eth_dev *dev;
 
@@ -2044,7 +2044,7 @@ int rte_pmd_i40e_ptype_mapping_reset(uint8_t port)
 }
 
 int rte_pmd_i40e_ptype_mapping_get(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t size,
 			uint16_t *count,
@@ -2078,7 +2078,7 @@ int rte_pmd_i40e_ptype_mapping_get(
 	return 0;
 }
 
-int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
+int rte_pmd_i40e_ptype_mapping_replace(uint16_t port,
 				       uint32_t target,
 				       uint8_t mask,
 				       uint32_t pkt_type)
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 356fa89d7..7f32a59b1 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -157,7 +157,7 @@ struct rte_pmd_i40e_ptype_mapping {
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* invalid.
  */
-int rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf);
+int rte_pmd_i40e_ping_vfs(uint16_t port, uint16_t vf);
 
 /**
  * Enable/Disable VF MAC anti spoofing.
@@ -174,7 +174,7 @@ int rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port,
+int rte_pmd_i40e_set_vf_mac_anti_spoof(uint16_t port,
 				       uint16_t vf_id,
 				       uint8_t on);
 
@@ -193,7 +193,7 @@ int rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port,
+int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port,
 					uint16_t vf_id,
 					uint8_t on);
 
@@ -210,7 +210,7 @@ int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_tx_loopback(uint8_t port,
+int rte_pmd_i40e_set_tx_loopback(uint16_t port,
 				 uint8_t on);
 
 /**
@@ -228,7 +228,7 @@ int rte_pmd_i40e_set_tx_loopback(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port,
+int rte_pmd_i40e_set_vf_unicast_promisc(uint16_t port,
 					uint16_t vf_id,
 					uint8_t on);
 
@@ -247,7 +247,7 @@ int rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port,
+int rte_pmd_i40e_set_vf_multicast_promisc(uint16_t port,
 					  uint16_t vf_id,
 					  uint8_t on);
 
@@ -271,7 +271,7 @@ int rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_mac_addr(uint16_t port, uint16_t vf_id,
 				 struct ether_addr *mac_addr);
 
 /**
@@ -291,7 +291,7 @@ int rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_i40e_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -309,7 +309,7 @@ rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_vlan_insert(uint16_t port, uint16_t vf_id,
 				    uint16_t vlan_id);
 
 /**
@@ -328,7 +328,7 @@ int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_broadcast(uint16_t port, uint16_t vf_id,
 				  uint8_t on);
 
 /**
@@ -347,7 +347,7 @@ int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on);
+int rte_pmd_i40e_set_vf_vlan_tag(uint16_t port, uint16_t vf_id, uint8_t on);
 
 /**
  * Enable/Disable VF VLAN filter
@@ -368,7 +368,7 @@ int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
+int rte_pmd_i40e_set_vf_vlan_filter(uint16_t port, uint16_t vlan_id,
 				    uint64_t vf_mask, uint8_t on);
 
 /**
@@ -393,7 +393,7 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_i40e_get_vf_stats(uint8_t port,
+int rte_pmd_i40e_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats);
 
@@ -409,7 +409,7 @@ int rte_pmd_i40e_get_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_reset_vf_stats(uint8_t port,
+int rte_pmd_i40e_reset_vf_stats(uint16_t port,
 				uint16_t vf_id);
 
 /**
@@ -434,7 +434,7 @@ int rte_pmd_i40e_reset_vf_stats(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_max_bw(uint8_t port,
+int rte_pmd_i40e_set_vf_max_bw(uint16_t port,
 			       uint16_t vf_id,
 			       uint32_t bw);
 
@@ -459,7 +459,7 @@ int rte_pmd_i40e_set_vf_max_bw(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port,
+int rte_pmd_i40e_set_vf_tc_bw_alloc(uint16_t port,
 				    uint16_t vf_id,
 				    uint8_t tc_num,
 				    uint8_t *bw_weight);
@@ -484,7 +484,7 @@ int rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port,
+int rte_pmd_i40e_set_vf_tc_max_bw(uint16_t port,
 				  uint16_t vf_id,
 				  uint8_t tc_no,
 				  uint32_t bw);
@@ -502,7 +502,7 @@ int rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map);
+int rte_pmd_i40e_set_tc_strict_prio(uint16_t port, uint8_t tc_map);
 
 /**
  * Load/Unload a ddp package
@@ -523,7 +523,7 @@ int rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map);
  *   - (-EACCES) if profile does not exist.
  *   - (-ENOTSUP) if operation not supported.
  */
-int rte_pmd_i40e_process_ddp_package(uint8_t port, uint8_t *buff,
+int rte_pmd_i40e_process_ddp_package(uint16_t port, uint8_t *buff,
 				     uint32_t size,
 				     enum rte_pmd_i40e_package_op op);
 
@@ -561,7 +561,7 @@ int rte_pmd_i40e_get_ddp_info(uint8_t *pkg, uint32_t pkg_size,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size);
+int rte_pmd_i40e_get_ddp_list(uint16_t port, uint8_t *buff, uint32_t size);
 
 /**
  * Update hardware defined ptype to software defined packet type
@@ -581,7 +581,7 @@ int rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size);
  *	set other PTYPEs maps to PTYPE_UNKNOWN.
  */
 int rte_pmd_i40e_ptype_mapping_update(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t count,
 			uint8_t exclusive);
@@ -593,7 +593,7 @@ int rte_pmd_i40e_ptype_mapping_update(
  * @param port
  *    pointer to port identifier of the device
  */
-int rte_pmd_i40e_ptype_mapping_reset(uint8_t port);
+int rte_pmd_i40e_ptype_mapping_reset(uint16_t port);
 
 /**
  * Get hardware defined ptype to software defined ptype
@@ -612,7 +612,7 @@ int rte_pmd_i40e_ptype_mapping_reset(uint8_t port);
  *    -(!0) only return mapping items which packet_type != RTE_PTYPE_UNKNOWN.
  */
 int rte_pmd_i40e_ptype_mapping_get(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t size,
 			uint16_t *count,
@@ -632,7 +632,7 @@ int rte_pmd_i40e_ptype_mapping_get(
  * @param pkt_type
  *    the new packet type to overwrite
  */
-int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
+int rte_pmd_i40e_ptype_mapping_replace(uint16_t port,
 				       uint32_t target,
 				       uint8_t mask,
 				       uint32_t pkt_type);
diff --git a/drivers/net/ixgbe/Makefile b/drivers/net/ixgbe/Makefile
index 5e57cb353..18ad4feca 100644
--- a/drivers/net/ixgbe/Makefile
+++ b/drivers/net/ixgbe/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 9ca5cbcd3..d873c409f 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2508,8 +2508,9 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	*    - fixed speed: TODO implement
 	*/
 	if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
-		PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; fix speed not supported",
-			     dev->data->port_id);
+		PMD_INIT_LOG(ERR,
+		"Invalid link_speeds for port %u, fix speed not supported",
+				dev->data->port_id);
 		return -EINVAL;
 	}
 
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.h b/drivers/net/ixgbe/ixgbe_rxtx.h
index 85feb0bdc..81c527fad 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.h
+++ b/drivers/net/ixgbe/ixgbe_rxtx.h
@@ -148,7 +148,7 @@ struct ixgbe_rx_queue {
 	uint16_t            queue_id; /**< RX queue index. */
 	uint16_t            reg_idx;  /**< RX queue register index. */
 	uint16_t            pkt_type_mask;  /**< Packet type mask for different NICs. */
-	uint8_t             port_id;  /**< Device port identifier. */
+	uint16_t            port_id;  /**< Device port identifier. */
 	uint8_t             crc_len;  /**< 0 if CRC stripped, 4 otherwise. */
 	uint8_t             drop_en;  /**< If not 0, set SRRCTL.Drop_En. */
 	uint8_t             rx_deferred_start; /**< not in global dev start. */
@@ -237,7 +237,7 @@ struct ixgbe_tx_queue {
 	uint16_t tx_next_rs; /**< next desc to set RS bit */
 	uint16_t            queue_id;      /**< TX queue index. */
 	uint16_t            reg_idx;       /**< TX queue register index. */
-	uint8_t             port_id;       /**< Device port identifier. */
+	uint16_t            port_id;       /**< Device port identifier. */
 	uint8_t             pthresh;       /**< Prefetch threshold register. */
 	uint8_t             hthresh;       /**< Host threshold register. */
 	uint8_t             wthresh;       /**< Write-back threshold reg. */
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
index 79897ff64..f12737857 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
@@ -38,7 +38,7 @@
 #include "rte_pmd_ixgbe.h"
 
 int
-rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_mac_addr(uint16_t port, uint16_t vf,
 			      struct ether_addr *mac_addr)
 {
 	struct ixgbe_hw *hw;
@@ -73,7 +73,7 @@ rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf)
+rte_pmd_ixgbe_ping_vf(uint16_t port, uint16_t vf)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_vf_info *vfinfo;
@@ -105,7 +105,7 @@ rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_mac_info *mac;
@@ -135,7 +135,7 @@ rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_mac_info *mac;
@@ -164,7 +164,7 @@ rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint16_t vlan_id)
+rte_pmd_ixgbe_set_vf_vlan_insert(uint16_t port, uint16_t vf, uint16_t vlan_id)
 {
 	struct ixgbe_hw *hw;
 	uint32_t ctrl;
@@ -200,7 +200,7 @@ rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint16_t vlan_id)
 }
 
 int
-rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on)
+rte_pmd_ixgbe_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t ctrl;
@@ -230,7 +230,7 @@ rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on)
+rte_pmd_ixgbe_set_all_queues_drop_en(uint16_t port, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t reg_value;
@@ -260,7 +260,7 @@ rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_split_drop_en(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t reg_value;
@@ -295,7 +295,7 @@ rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -342,7 +342,7 @@ rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_rxmode(uint16_t port, uint16_t vf,
 			    uint16_t rx_mask, uint8_t on)
 {
 	int val = 0;
@@ -389,7 +389,7 @@ rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_rx(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -439,7 +439,7 @@ rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_tx(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -489,7 +489,7 @@ rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+rte_pmd_ixgbe_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				 uint64_t vf_mask, uint8_t vlan_on)
 {
 	struct rte_eth_dev *dev;
@@ -524,7 +524,7 @@ rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
 }
 
 int
-rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk)
 {
 	struct rte_eth_dev *dev;
@@ -540,7 +540,7 @@ rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp)
+rte_pmd_ixgbe_macsec_enable(uint16_t port, uint8_t en, uint8_t rp)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -623,7 +623,7 @@ rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp)
 }
 
 int
-rte_pmd_ixgbe_macsec_disable(uint8_t port)
+rte_pmd_ixgbe_macsec_disable(uint16_t port)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -687,7 +687,7 @@ rte_pmd_ixgbe_macsec_disable(uint8_t port)
 }
 
 int
-rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac)
+rte_pmd_ixgbe_macsec_config_txsc(uint16_t port, uint8_t *mac)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -712,7 +712,7 @@ rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac)
 }
 
 int
-rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi)
+rte_pmd_ixgbe_macsec_config_rxsc(uint16_t port, uint8_t *mac, uint16_t pi)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -738,7 +738,7 @@ rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi)
 }
 
 int
-rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
+rte_pmd_ixgbe_macsec_select_txsa(uint16_t port, uint8_t idx, uint8_t an,
 				 uint32_t pn, uint8_t *key)
 {
 	struct ixgbe_hw *hw;
@@ -794,7 +794,7 @@ rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
 }
 
 int
-rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
+rte_pmd_ixgbe_macsec_select_rxsa(uint16_t port, uint8_t idx, uint8_t an,
 				 uint32_t pn, uint8_t *key)
 {
 	struct ixgbe_hw *hw;
@@ -837,7 +837,7 @@ rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
 }
 
 int
-rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
+rte_pmd_ixgbe_set_tc_bw_alloc(uint16_t port,
 			      uint8_t tc_num,
 			      uint8_t *bw_weight)
 {
@@ -911,7 +911,7 @@ rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
 
 #ifdef RTE_LIBRTE_IXGBE_BYPASS
 int
-rte_pmd_ixgbe_bypass_init(uint8_t port_id)
+rte_pmd_ixgbe_bypass_init(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -926,7 +926,7 @@ rte_pmd_ixgbe_bypass_init(uint8_t port_id)
 }
 
 int
-rte_pmd_ixgbe_bypass_state_show(uint8_t port_id, uint32_t *state)
+rte_pmd_ixgbe_bypass_state_show(uint16_t port_id, uint32_t *state)
 {
 	struct rte_eth_dev *dev;
 
@@ -940,7 +940,7 @@ rte_pmd_ixgbe_bypass_state_show(uint8_t port_id, uint32_t *state)
 }
 
 int
-rte_pmd_ixgbe_bypass_state_set(uint8_t port_id, uint32_t *new_state)
+rte_pmd_ixgbe_bypass_state_set(uint16_t port_id, uint32_t *new_state)
 {
 	struct rte_eth_dev *dev;
 
@@ -954,7 +954,7 @@ rte_pmd_ixgbe_bypass_state_set(uint8_t port_id, uint32_t *new_state)
 }
 
 int
-rte_pmd_ixgbe_bypass_event_show(uint8_t port_id,
+rte_pmd_ixgbe_bypass_event_show(uint16_t port_id,
 				uint32_t event,
 				uint32_t *state)
 {
@@ -970,7 +970,7 @@ rte_pmd_ixgbe_bypass_event_show(uint8_t port_id,
 }
 
 int
-rte_pmd_ixgbe_bypass_event_store(uint8_t port_id,
+rte_pmd_ixgbe_bypass_event_store(uint16_t port_id,
 				 uint32_t event,
 				 uint32_t state)
 {
@@ -986,7 +986,7 @@ rte_pmd_ixgbe_bypass_event_store(uint8_t port_id,
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port_id, uint32_t timeout)
+rte_pmd_ixgbe_bypass_wd_timeout_store(uint16_t port_id, uint32_t timeout)
 {
 	struct rte_eth_dev *dev;
 
@@ -1000,7 +1000,7 @@ rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port_id, uint32_t timeout)
 }
 
 int
-rte_pmd_ixgbe_bypass_ver_show(uint8_t port_id, uint32_t *ver)
+rte_pmd_ixgbe_bypass_ver_show(uint16_t port_id, uint32_t *ver)
 {
 	struct rte_eth_dev *dev;
 
@@ -1014,7 +1014,7 @@ rte_pmd_ixgbe_bypass_ver_show(uint8_t port_id, uint32_t *ver)
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port_id, uint32_t *wd_timeout)
+rte_pmd_ixgbe_bypass_wd_timeout_show(uint16_t port_id, uint32_t *wd_timeout)
 {
 	struct rte_eth_dev *dev;
 
@@ -1028,7 +1028,7 @@ rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port_id, uint32_t *wd_timeout)
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_reset(uint8_t port_id)
+rte_pmd_ixgbe_bypass_wd_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
index d33c285db..81b18f876 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
@@ -53,7 +53,7 @@
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* invalid.
  */
-int rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf);
+int rte_pmd_ixgbe_ping_vf(uint16_t port, uint16_t vf);
 
 /**
  * Set the VF MAC address.
@@ -69,7 +69,7 @@ int rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_ixgbe_set_vf_mac_addr(uint16_t port, uint16_t vf,
 		struct ether_addr *mac_addr);
 
 /**
@@ -87,7 +87,8 @@ int rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf,
+					 uint8_t on);
 
 /**
  * Enable/Disable VF MAC anti spoofing.
@@ -104,7 +105,7 @@ int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -122,7 +123,7 @@ int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+int rte_pmd_ixgbe_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id);
 
 /**
@@ -139,7 +140,7 @@ int rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on);
+int rte_pmd_ixgbe_set_tx_loopback(uint16_t port, uint8_t on);
 
 /**
  * set all queues drop enable bit
@@ -155,7 +156,7 @@ int rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on);
+int rte_pmd_ixgbe_set_all_queues_drop_en(uint16_t port, uint8_t on);
 
 /**
  * set drop enable bit in the VF split rx control register
@@ -174,7 +175,7 @@ int rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_split_drop_en(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan strip for all queues in a pool
@@ -194,7 +195,7 @@ int rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable MACsec offload.
@@ -212,7 +213,7 @@ rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp);
+int rte_pmd_ixgbe_macsec_enable(uint16_t port, uint8_t en, uint8_t rp);
 
 /**
  * Disable MACsec offload.
@@ -224,7 +225,7 @@ int rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_disable(uint8_t port);
+int rte_pmd_ixgbe_macsec_disable(uint16_t port);
 
 /**
  * Configure Tx SC (Secure Connection).
@@ -238,7 +239,7 @@ int rte_pmd_ixgbe_macsec_disable(uint8_t port);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac);
+int rte_pmd_ixgbe_macsec_config_txsc(uint16_t port, uint8_t *mac);
 
 /**
  * Configure Rx SC (Secure Connection).
@@ -254,7 +255,7 @@ int rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi);
+int rte_pmd_ixgbe_macsec_config_rxsc(uint16_t port, uint8_t *mac, uint16_t pi);
 
 /**
  * Enable Tx SA (Secure Association).
@@ -275,7 +276,7 @@ int rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi);
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
+int rte_pmd_ixgbe_macsec_select_txsa(uint16_t port, uint8_t idx, uint8_t an,
 		uint32_t pn, uint8_t *key);
 
 /**
@@ -297,7 +298,7 @@ int rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
+int rte_pmd_ixgbe_macsec_select_rxsa(uint16_t port, uint8_t idx, uint8_t an,
 		uint32_t pn, uint8_t *key);
 
 /**
@@ -323,7 +324,8 @@ int rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf, uint16_t rx_mask, uint8_t on);
+rte_pmd_ixgbe_set_vf_rxmode(uint16_t port, uint16_t vf, uint16_t rx_mask,
+			     uint8_t on);
 
 /**
 * Enable or disable a VF traffic receive of an Ethernet device.
@@ -342,7 +344,7 @@ rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf, uint16_t rx_mask, uint8_t
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_rx(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
 * Enable or disable a VF traffic transmit of the Ethernet device.
@@ -361,7 +363,7 @@ rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on);
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_tx(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
 * Enable/Disable hardware VF VLAN filtering by an Ethernet device of
@@ -383,7 +385,8 @@ rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on);
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan, uint64_t vf_mask, uint8_t vlan_on);
+rte_pmd_ixgbe_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
+				 uint64_t vf_mask, uint8_t vlan_on);
 
 /**
  * Set the rate limitation for a vf on an Ethernet device.
@@ -402,7 +405,8 @@ rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan, uint64_t vf_mask,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf, uint16_t tx_rate, uint64_t q_msk);
+int rte_pmd_ixgbe_set_vf_rate_limit(uint16_t port, uint16_t vf,
+				     uint16_t tx_rate, uint64_t q_msk);
 
 /**
  * Set all the TCs' bandwidth weight.
@@ -423,7 +427,7 @@ int rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf, uint16_t tx_rate,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
+int rte_pmd_ixgbe_set_tc_bw_alloc(uint16_t port,
 				  uint8_t tc_num,
 				  uint8_t *bw_weight);
 
@@ -439,7 +443,7 @@ int rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_init(uint8_t port);
+int rte_pmd_ixgbe_bypass_init(uint16_t port);
 
 /**
  * Return bypass state.
@@ -456,7 +460,7 @@ int rte_pmd_ixgbe_bypass_init(uint8_t port);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_state_show(uint8_t port, uint32_t *state);
+int rte_pmd_ixgbe_bypass_state_show(uint16_t port, uint32_t *state);
 
 /**
  * Set bypass state
@@ -473,7 +477,7 @@ int rte_pmd_ixgbe_bypass_state_show(uint8_t port, uint32_t *state);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_state_set(uint8_t port, uint32_t *new_state);
+int rte_pmd_ixgbe_bypass_state_set(uint16_t port, uint32_t *new_state);
 
 /**
  * Return bypass state when given event occurs.
@@ -497,7 +501,7 @@ int rte_pmd_ixgbe_bypass_state_set(uint8_t port, uint32_t *new_state);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_event_show(uint8_t port,
+int rte_pmd_ixgbe_bypass_event_show(uint16_t port,
 				    uint32_t event,
 				    uint32_t *state);
 
@@ -523,7 +527,7 @@ int rte_pmd_ixgbe_bypass_event_show(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_event_store(uint8_t port,
+int rte_pmd_ixgbe_bypass_event_store(uint16_t port,
 				     uint32_t event,
 				     uint32_t state);
 
@@ -547,7 +551,7 @@ int rte_pmd_ixgbe_bypass_event_store(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port, uint32_t timeout);
+int rte_pmd_ixgbe_bypass_wd_timeout_store(uint16_t port, uint32_t timeout);
 
 /**
  * Get bypass firmware version.
@@ -561,7 +565,7 @@ int rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port, uint32_t timeout);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_ver_show(uint8_t port, uint32_t *ver);
+int rte_pmd_ixgbe_bypass_ver_show(uint16_t port, uint32_t *ver);
 
 /**
  * Return bypass watchdog timeout in seconds
@@ -583,7 +587,7 @@ int rte_pmd_ixgbe_bypass_ver_show(uint8_t port, uint32_t *ver);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port, uint32_t *wd_timeout);
+int rte_pmd_ixgbe_bypass_wd_timeout_show(uint16_t port, uint32_t *wd_timeout);
 
 /**
  * Reset bypass watchdog timer
@@ -595,7 +599,7 @@ int rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port, uint32_t *wd_timeout);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_reset(uint8_t port);
+int rte_pmd_ixgbe_bypass_wd_reset(uint16_t port);
 
 
 /**
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 7de1d1086..238a64f43 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -112,14 +112,14 @@ struct rxq {
 	unsigned int sges_n:2; /* Log 2 of SGEs (max buffers per packet). */
 	unsigned int cqe_n:4; /* Log 2 of CQ elements. */
 	unsigned int elts_n:4; /* Log 2 of Mbufs. */
-	unsigned int port_id:8;
 	unsigned int rss_hash:1; /* RSS hash result is enabled. */
 	unsigned int mark:1; /* Marked flow available on the queue. */
 	unsigned int pending_err:1; /* CQE error needs to be handled. */
 	unsigned int trim_elts:1; /* Whether elts needs clean-up. */
-	unsigned int :6; /* Remaining bits. */
+	unsigned int :14; /* Remaining bits. */
 	volatile uint32_t *rq_db;
 	volatile uint32_t *cq_db;
+	uint16_t port_id;
 	uint16_t rq_ci;
 	uint16_t rq_pi;
 	uint16_t cq_ci;
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 92b03c4cb..f1b968fc2 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -1240,12 +1240,12 @@ nfp_net_dev_link_status_print(struct rte_eth_dev *dev)
 	nfp_net_dev_atomic_read_link_status(dev, &link);
 	if (link.link_status)
 		RTE_LOG(INFO, PMD, "Port %d: Link Up - speed %u Mbps - %s\n",
-			(int)(dev->data->port_id), (unsigned)link.link_speed,
+			dev->data->port_id, link.link_speed,
 			link.link_duplex == ETH_LINK_FULL_DUPLEX
 			? "full-duplex" : "half-duplex");
 	else
 		RTE_LOG(INFO, PMD, " Port %d: Link Down\n",
-			(int)(dev->data->port_id));
+			dev->data->port_id);
 
 	RTE_LOG(INFO, PMD, "PCI Address: %04d:%02d:%02d:%d\n",
 		pci_dev->addr.domain, pci_dev->addr.bus,
@@ -1549,7 +1549,7 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 			"tx_free_thresh must be less than the number of TX "
 			"descriptors. (tx_free_thresh=%u port=%d "
 			"queue=%d)\n", (unsigned int)tx_free_thresh,
-			(int)dev->data->port_id, (int)queue_idx);
+			dev->data->port_id, (int)queue_idx);
 		return -(EINVAL);
 	}
 
@@ -1847,9 +1847,9 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		 */
 		new_mb = rte_pktmbuf_alloc(rxq->mem_pool);
 		if (unlikely(new_mb == NULL)) {
-			RTE_LOG_DP(DEBUG, PMD, "RX mbuf alloc failed port_id=%u "
-				"queue_id=%u\n", (unsigned)rxq->port_id,
-				(unsigned)rxq->qidx);
+			RTE_LOG_DP(DEBUG, PMD,
+			"RX mbuf alloc failed port_id=%u queue_id=%u\n",
+				rxq->port_id, (unsigned int)rxq->qidx);
 			nfp_net_mbuf_alloc_failed(rxq);
 			break;
 		}
@@ -1933,7 +1933,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		return nb_hold;
 
 	PMD_RX_LOG(DEBUG, "RX  port_id=%u queue_id=%u, %d packets received\n",
-		   (unsigned)rxq->port_id, (unsigned)rxq->qidx, nb_hold);
+		   rxq->port_id, (unsigned int)rxq->qidx, nb_hold);
 
 	nb_hold += rxq->nb_rx_hold;
 
@@ -1944,7 +1944,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 	rte_wmb();
 	if (nb_hold > rxq->rx_free_thresh) {
 		PMD_RX_LOG(DEBUG, "port=%u queue=%u nb_hold=%u avail=%u\n",
-			   (unsigned)rxq->port_id, (unsigned)rxq->qidx,
+			   rxq->port_id, (unsigned int)rxq->qidx,
 			   (unsigned)nb_hold, (unsigned)avail);
 		nfp_qcp_ptr_add(rxq->qcp_fl, NFP_QCP_WRITE_PTR, nb_hold);
 		nb_hold = 0;
diff --git a/drivers/net/nfp/nfp_net_pmd.h b/drivers/net/nfp/nfp_net_pmd.h
index eec56bc1c..828d0d35b 100644
--- a/drivers/net/nfp/nfp_net_pmd.h
+++ b/drivers/net/nfp/nfp_net_pmd.h
@@ -250,7 +250,7 @@ struct nfp_net_txq {
 	uint32_t tx_hthresh;   /* not used by now. Future? */
 	uint32_t tx_wthresh;   /* not used by now. Future? */
 	uint32_t txq_flags;    /* not used by now. Future? */
-	uint8_t  port_id;
+	uint16_t port_id;
 	int qidx;
 	int tx_qcidx;
 	__le64 dma;
diff --git a/drivers/net/null/Makefile b/drivers/net/null/Makefile
index 77810bced..fdd7c5813 100644
--- a/drivers/net/null/Makefile
+++ b/drivers/net/null/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_null_version.map
 
-LIBABIVER := 2
+LIBABIVER := 3
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c
index 5aef0591e..fa9313dec 100644
--- a/drivers/net/null/rte_eth_null.c
+++ b/drivers/net/null/rte_eth_null.c
@@ -68,7 +68,7 @@ struct null_queue {
 struct pmd_internals {
 	unsigned packet_size;
 	unsigned packet_copy;
-	uint8_t port_id;
+	uint16_t port_id;
 
 	struct null_queue rx_null_queues[RTE_MAX_QUEUES_PER_PORT];
 	struct null_queue tx_null_queues[RTE_MAX_QUEUES_PER_PORT];
diff --git a/drivers/net/pcap/Makefile b/drivers/net/pcap/Makefile
index 7ebd0bef2..f731b126e 100644
--- a/drivers/net/pcap/Makefile
+++ b/drivers/net/pcap/Makefile
@@ -43,7 +43,7 @@ LDLIBS += -lpcap
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index defb3b419..b51f16cbd 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -75,7 +75,7 @@ struct queue_stat {
 
 struct pcap_rx_queue {
 	pcap_t *pcap;
-	uint8_t in_port;
+	uint16_t in_port;
 	struct rte_mempool *mb_pool;
 	struct queue_stat rx_stat;
 	char name[PATH_MAX];
diff --git a/drivers/net/qede/qede_if.h b/drivers/net/qede/qede_if.h
index 9864bb448..96f0d351d 100644
--- a/drivers/net/qede/qede_if.h
+++ b/drivers/net/qede/qede_if.h
@@ -97,7 +97,7 @@ struct qed_link_output {
 	uint32_t speed;		/* In Mb/s */
 	uint32_t adv_speed;	/* Speed mask */
 	uint8_t duplex;		/* In DUPLEX defs */
-	uint8_t port;		/* In PORT defs */
+	uint16_t port;		/* In PORT defs */
 	bool autoneg;
 	uint32_t pause_config;
 };
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index 464d3d384..e3fa7b0e2 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -394,7 +394,7 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[],
 	};
 	char args_str[32] = { 0 };
 	char ring_name[32] = { 0 };
-	uint8_t port_id = RTE_MAX_ETHPORTS;
+	uint16_t port_id = RTE_MAX_ETHPORTS;
 	int ret;
 
 	/* do some parameter checking */
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 9c0d57cc1..d141acf0e 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -71,7 +71,7 @@
 struct szedata2_rx_queue {
 	struct szedata *sze;
 	uint8_t rx_channel;
-	uint8_t in_port;
+	uint16_t in_port;
 	struct rte_mempool *mb_pool;
 	volatile uint64_t rx_pkts;
 	volatile uint64_t rx_bytes;
diff --git a/drivers/net/thunderx/nicvf_struct.h b/drivers/net/thunderx/nicvf_struct.h
index 4ee6c3bb0..e54a96f8e 100644
--- a/drivers/net/thunderx/nicvf_struct.h
+++ b/drivers/net/thunderx/nicvf_struct.h
@@ -100,7 +100,7 @@ struct nicvf_rxq {
 	uint16_t queue_id;
 	uint16_t precharge_cnt;
 	uint8_t rx_drop_en;
-	uint8_t  port_id;
+	uint16_t port_id;
 	uint8_t  rbptr_offset;
 } __rte_cache_aligned;
 
diff --git a/drivers/net/vhost/Makefile b/drivers/net/vhost/Makefile
index 3ba8ad64f..258a917c7 100644
--- a/drivers/net/vhost/Makefile
+++ b/drivers/net/vhost/Makefile
@@ -43,7 +43,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_vhost_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 0dac5e60e..04179b4db 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -105,7 +105,7 @@ struct vhost_queue {
 	rte_atomic32_t while_queuing;
 	struct pmd_internal *internal;
 	struct rte_mempool *mb_pool;
-	uint8_t port;
+	uint16_t port;
 	uint16_t virtqueue_id;
 	struct vhost_stats stats;
 };
@@ -705,7 +705,7 @@ static struct vhost_device_ops vhost_ops = {
 };
 
 int
-rte_eth_vhost_get_queue_event(uint8_t port_id,
+rte_eth_vhost_get_queue_event(uint16_t port_id,
 		struct rte_eth_vhost_queue_event *event)
 {
 	struct rte_vhost_vring_state *state;
@@ -742,7 +742,7 @@ rte_eth_vhost_get_queue_event(uint8_t port_id,
 }
 
 int
-rte_eth_vhost_get_vid_from_port_id(uint8_t port_id)
+rte_eth_vhost_get_vid_from_port_id(uint16_t port_id)
 {
 	struct internal_list *list;
 	struct rte_eth_dev *eth_dev;
diff --git a/drivers/net/vhost/rte_eth_vhost.h b/drivers/net/vhost/rte_eth_vhost.h
index 39ca77197..948f3c810 100644
--- a/drivers/net/vhost/rte_eth_vhost.h
+++ b/drivers/net/vhost/rte_eth_vhost.h
@@ -69,7 +69,7 @@ struct rte_eth_vhost_queue_event {
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_vhost_get_queue_event(uint8_t port_id,
+int rte_eth_vhost_get_queue_event(uint16_t port_id,
 		struct rte_eth_vhost_queue_event *event);
 
 /**
@@ -79,7 +79,7 @@ int rte_eth_vhost_get_queue_event(uint8_t port_id,
  *  - On success, the 'vid' associated with 'port_id'.
  *  - On failure, a negative value.
  */
-int rte_eth_vhost_get_vid_from_port_id(uint8_t port_id);
+int rte_eth_vhost_get_vid_from_port_id(uint16_t port_id);
 
 #ifdef __cplusplus
 }
diff --git a/drivers/net/virtio/Makefile b/drivers/net/virtio/Makefile
index b21b87814..ad4b695a3 100644
--- a/drivers/net/virtio/Makefile
+++ b/drivers/net/virtio/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h
index 18caebdd7..330ee94be 100644
--- a/drivers/net/virtio/virtio_pci.h
+++ b/drivers/net/virtio/virtio_pci.h
@@ -260,7 +260,7 @@ struct virtio_hw {
 	uint8_t	    use_msix;
 	uint8_t     modern;
 	uint8_t     use_simple_rxtx;
-	uint8_t     port_id;
+	uint16_t    port_id;
 	uint8_t     mac_addr[ETHER_ADDR_LEN];
 	uint32_t    notify_off_multiplier;
 	uint8_t     *isr;
diff --git a/drivers/net/virtio/virtio_rxtx.h b/drivers/net/virtio/virtio_rxtx.h
index 28f82d6a8..198b2d8fb 100644
--- a/drivers/net/virtio/virtio_rxtx.h
+++ b/drivers/net/virtio/virtio_rxtx.h
@@ -54,7 +54,7 @@ struct virtnet_rx {
 	struct rte_mempool *mpool; /**< mempool for mbuf allocation */
 
 	uint16_t queue_id;   /**< DPDK queue index. */
-	uint8_t port_id;     /**< Device port identifier. */
+	uint16_t port_id;     /**< Device port identifier. */
 
 	/* Statistics */
 	struct virtnet_stats stats;
@@ -69,7 +69,7 @@ struct virtnet_tx {
 	phys_addr_t virtio_net_hdr_mem;  /**< hdr for each xmit packet */
 
 	uint16_t    queue_id;            /**< DPDK queue index. */
-	uint8_t     port_id;             /**< Device port identifier. */
+	uint16_t    port_id;             /**< Device port identifier. */
 
 	/* Statistics */
 	struct virtnet_stats stats;
@@ -82,7 +82,7 @@ struct virtnet_ctl {
 	/**< memzone to populate hdr. */
 	const struct rte_memzone *virtio_net_hdr_mz;
 	phys_addr_t virtio_net_hdr_mem; /**< hdr for each xmit packet */
-	uint8_t port_id;                /**< Device port identifier. */
+	uint16_t port_id;               /**< Device port identifier. */
 	const struct rte_memzone *mz;   /**< mem zone to populate RX ring. */
 };
 
diff --git a/drivers/net/vmxnet3/vmxnet3_ring.h b/drivers/net/vmxnet3/vmxnet3_ring.h
index d2e8323ba..a6fa93ac7 100644
--- a/drivers/net/vmxnet3/vmxnet3_ring.h
+++ b/drivers/net/vmxnet3/vmxnet3_ring.h
@@ -144,7 +144,7 @@ typedef struct vmxnet3_tx_queue {
 	const struct rte_memzone     *mz;
 	bool                         stopped;
 	uint16_t                     queue_id;      /**< Device TX queue index. */
-	uint8_t                      port_id;       /**< Device port identifier. */
+	uint16_t                     port_id;       /**< Device port identifier. */
 	uint16_t		     txdata_desc_size;
 } vmxnet3_tx_queue_t;
 
@@ -179,7 +179,7 @@ typedef struct vmxnet3_rx_queue {
 	const struct rte_memzone    *mz;
 	bool                        stopped;
 	uint16_t                    queue_id;      /**< Device RX queue index. */
-	uint8_t                     port_id;       /**< Device port identifier. */
+	uint16_t                    port_id;       /**< Device port identifier. */
 } vmxnet3_rx_queue_t;
 
 #endif /* _VMXNET3_RING_H_ */
diff --git a/lib/librte_bitratestats/Makefile b/lib/librte_bitratestats/Makefile
index 58a20ea09..a079cced7 100644
--- a/lib/librte_bitratestats/Makefile
+++ b/lib/librte_bitratestats/Makefile
@@ -38,7 +38,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_bitratestats_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_BITRATE) := rte_bitrate.c
diff --git a/lib/librte_bitratestats/rte_bitrate.c b/lib/librte_bitratestats/rte_bitrate.c
index 3ceb35166..f373697a7 100644
--- a/lib/librte_bitratestats/rte_bitrate.c
+++ b/lib/librte_bitratestats/rte_bitrate.c
@@ -84,7 +84,7 @@ rte_stats_bitrate_reg(struct rte_stats_bitrates *bitrate_data)
 
 int
 rte_stats_bitrate_calc(struct rte_stats_bitrates *bitrate_data,
-	uint8_t port_id)
+			uint16_t port_id)
 {
 	struct rte_stats_bitrate *port_data;
 	struct rte_eth_stats eth_stats;
diff --git a/lib/librte_bitratestats/rte_bitrate.h b/lib/librte_bitratestats/rte_bitrate.h
index 15fc270a3..16467221b 100644
--- a/lib/librte_bitratestats/rte_bitrate.h
+++ b/lib/librte_bitratestats/rte_bitrate.h
@@ -85,7 +85,7 @@ int rte_stats_bitrate_reg(struct rte_stats_bitrates *bitrate_data);
  *  - Negative value on error
  */
 int rte_stats_bitrate_calc(struct rte_stats_bitrates *bitrate_data,
-	uint8_t port_id);
+			   uint16_t port_id);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 27d9766a8..0bacc8b3f 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ethdev_version.map
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 SRCS-y += rte_ethdev.c
 SRCS-y += rte_flow.c
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index a88916f2a..e756dbc46 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -138,8 +138,8 @@ enum {
 	STAT_QMAP_RX
 };
 
-uint8_t
-rte_eth_find_next(uint8_t port_id)
+uint16_t
+rte_eth_find_next(uint16_t port_id)
 {
 	while (port_id < RTE_MAX_ETHPORTS &&
 	       rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED)
@@ -187,7 +187,7 @@ rte_eth_dev_allocated(const char *name)
 	return NULL;
 }
 
-static uint8_t
+static uint16_t
 rte_eth_dev_find_free_port(void)
 {
 	unsigned i;
@@ -200,7 +200,7 @@ rte_eth_dev_find_free_port(void)
 }
 
 static struct rte_eth_dev *
-eth_dev_get(uint8_t port_id)
+eth_dev_get(uint16_t port_id)
 {
 	struct rte_eth_dev *eth_dev = &rte_eth_devices[port_id];
 
@@ -216,7 +216,7 @@ eth_dev_get(uint8_t port_id)
 struct rte_eth_dev *
 rte_eth_dev_allocate(const char *name)
 {
-	uint8_t port_id;
+	uint16_t port_id;
 	struct rte_eth_dev *eth_dev;
 
 	port_id = rte_eth_dev_find_free_port();
@@ -251,7 +251,7 @@ rte_eth_dev_allocate(const char *name)
 struct rte_eth_dev *
 rte_eth_dev_attach_secondary(const char *name)
 {
-	uint8_t i;
+	uint16_t i;
 	struct rte_eth_dev *eth_dev;
 
 	if (rte_eth_dev_data == NULL)
@@ -285,7 +285,7 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
 }
 
 int
-rte_eth_dev_is_valid_port(uint8_t port_id)
+rte_eth_dev_is_valid_port(uint16_t port_id)
 {
 	if (port_id >= RTE_MAX_ETHPORTS ||
 	    (rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED &&
@@ -296,17 +296,17 @@ rte_eth_dev_is_valid_port(uint8_t port_id)
 }
 
 int
-rte_eth_dev_socket_id(uint8_t port_id)
+rte_eth_dev_socket_id(uint16_t port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 	return rte_eth_devices[port_id].data->numa_node;
 }
 
-uint8_t
+uint16_t
 rte_eth_dev_count(void)
 {
-	uint8_t p;
-	uint8_t count;
+	uint16_t p;
+	uint16_t count;
 
 	count = 0;
 
@@ -317,7 +317,7 @@ rte_eth_dev_count(void)
 }
 
 int
-rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
+rte_eth_dev_get_name_by_port(uint16_t port_id, char *name)
 {
 	const char *tmp;
 
@@ -336,7 +336,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
 }
 
 int
-rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
+rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)
 {
 	int ret;
 	int i;
@@ -361,7 +361,7 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
 }
 
 static int
-rte_eth_dev_is_detachable(uint8_t port_id)
+rte_eth_dev_is_detachable(uint16_t port_id)
 {
 	uint32_t dev_flags;
 
@@ -377,7 +377,7 @@ rte_eth_dev_is_detachable(uint8_t port_id)
 
 /* attach the new device, then store port_id of the device */
 int
-rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
+rte_eth_dev_attach(const char *devargs, uint16_t *port_id)
 {
 	int ret = -1;
 	int current = rte_eth_dev_count();
@@ -423,7 +423,7 @@ rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
 
 /* detach the device, then store the name of the device */
 int
-rte_eth_dev_detach(uint8_t port_id, char *name)
+rte_eth_dev_detach(uint16_t port_id, char *name)
 {
 	int ret = -1;
 
@@ -501,7 +501,7 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
 }
 
 int
-rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -527,7 +527,7 @@ rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -553,7 +553,7 @@ rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -579,7 +579,7 @@ rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -688,7 +688,7 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
 }
 
 int
-rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
+rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
 {
 	struct rte_eth_dev *dev;
@@ -839,7 +839,7 @@ _rte_eth_dev_reset(struct rte_eth_dev *dev)
 }
 
 static void
-rte_eth_dev_config_restore(uint8_t port_id)
+rte_eth_dev_config_restore(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -894,7 +894,7 @@ rte_eth_dev_config_restore(uint8_t port_id)
 }
 
 int
-rte_eth_dev_start(uint8_t port_id)
+rte_eth_dev_start(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int diag;
@@ -906,7 +906,7 @@ rte_eth_dev_start(uint8_t port_id)
 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_start, -ENOTSUP);
 
 	if (dev->data->dev_started != 0) {
-		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu8
+		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
 			" already started\n",
 			port_id);
 		return 0;
@@ -928,7 +928,7 @@ rte_eth_dev_start(uint8_t port_id)
 }
 
 void
-rte_eth_dev_stop(uint8_t port_id)
+rte_eth_dev_stop(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -938,7 +938,7 @@ rte_eth_dev_stop(uint8_t port_id)
 	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_stop);
 
 	if (dev->data->dev_started == 0) {
-		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu8
+		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
 			" already stopped\n",
 			port_id);
 		return;
@@ -949,7 +949,7 @@ rte_eth_dev_stop(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_up(uint8_t port_id)
+rte_eth_dev_set_link_up(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -962,7 +962,7 @@ rte_eth_dev_set_link_up(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_down(uint8_t port_id)
+rte_eth_dev_set_link_down(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -975,7 +975,7 @@ rte_eth_dev_set_link_down(uint8_t port_id)
 }
 
 void
-rte_eth_dev_close(uint8_t port_id)
+rte_eth_dev_close(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -995,7 +995,7 @@ rte_eth_dev_close(uint8_t port_id)
 }
 
 int
-rte_eth_dev_reset(uint8_t port_id)
+rte_eth_dev_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int ret;
@@ -1012,7 +1012,7 @@ rte_eth_dev_reset(uint8_t port_id)
 }
 
 int
-rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 		       uint16_t nb_rx_desc, unsigned int socket_id,
 		       const struct rte_eth_rxconf *rx_conf,
 		       struct rte_mempool *mp)
@@ -1103,7 +1103,7 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
 }
 
 int
-rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 		       uint16_t nb_tx_desc, unsigned int socket_id,
 		       const struct rte_eth_txconf *tx_conf)
 {
@@ -1207,7 +1207,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size)
 }
 
 int
-rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt)
+rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 
@@ -1221,7 +1221,7 @@ rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt)
 }
 
 void
-rte_eth_promiscuous_enable(uint8_t port_id)
+rte_eth_promiscuous_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1234,7 +1234,7 @@ rte_eth_promiscuous_enable(uint8_t port_id)
 }
 
 void
-rte_eth_promiscuous_disable(uint8_t port_id)
+rte_eth_promiscuous_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1247,7 +1247,7 @@ rte_eth_promiscuous_disable(uint8_t port_id)
 }
 
 int
-rte_eth_promiscuous_get(uint8_t port_id)
+rte_eth_promiscuous_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1258,7 +1258,7 @@ rte_eth_promiscuous_get(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_enable(uint8_t port_id)
+rte_eth_allmulticast_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1271,7 +1271,7 @@ rte_eth_allmulticast_enable(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_disable(uint8_t port_id)
+rte_eth_allmulticast_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1284,7 +1284,7 @@ rte_eth_allmulticast_disable(uint8_t port_id)
 }
 
 int
-rte_eth_allmulticast_get(uint8_t port_id)
+rte_eth_allmulticast_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1309,7 +1309,7 @@ rte_eth_dev_atomic_read_link_status(struct rte_eth_dev *dev,
 }
 
 void
-rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get(uint16_t port_id, struct rte_eth_link *eth_link)
 {
 	struct rte_eth_dev *dev;
 
@@ -1326,7 +1326,7 @@ rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 void
-rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *eth_link)
 {
 	struct rte_eth_dev *dev;
 
@@ -1343,7 +1343,7 @@ rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 int
-rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
+rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
 {
 	struct rte_eth_dev *dev;
 
@@ -1359,7 +1359,7 @@ rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
 }
 
 void
-rte_eth_stats_reset(uint8_t port_id)
+rte_eth_stats_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1372,7 +1372,7 @@ rte_eth_stats_reset(uint8_t port_id)
 }
 
 static int
-get_xstats_count(uint8_t port_id)
+get_xstats_count(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int count;
@@ -1401,7 +1401,7 @@ get_xstats_count(uint8_t port_id)
 }
 
 int
-rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
+rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
 		uint64_t *id)
 {
 	int cnt_xstats, idx_xstat;
@@ -1445,7 +1445,7 @@ rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
 }
 
 int
-rte_eth_xstats_get_names_by_id(uint8_t port_id,
+rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names, unsigned int size,
 	uint64_t *ids)
 {
@@ -1562,7 +1562,7 @@ rte_eth_xstats_get_names_by_id(uint8_t port_id,
 }
 
 int
-rte_eth_xstats_get_names(uint8_t port_id,
+rte_eth_xstats_get_names(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names,
 	unsigned int size)
 {
@@ -1628,8 +1628,8 @@ rte_eth_xstats_get_names(uint8_t port_id,
 
 /* retrieve ethdev extended statistics */
 int
-rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids, uint64_t *values,
-	unsigned int n)
+rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
+			 uint64_t *values, unsigned int n)
 {
 	/* If need all xstats */
 	if (!ids) {
@@ -1754,7 +1754,7 @@ rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids, uint64_t *values,
 }
 
 int
-rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
+rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
 	unsigned int n)
 {
 	struct rte_eth_stats eth_stats;
@@ -1836,7 +1836,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
 
 /* reset ethdev extended statistics */
 void
-rte_eth_xstats_reset(uint8_t port_id)
+rte_eth_xstats_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1854,7 +1854,7 @@ rte_eth_xstats_reset(uint8_t port_id)
 }
 
 static int
-set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
+set_queue_stats_mapping(uint16_t port_id, uint16_t queue_id, uint8_t stat_idx,
 		uint8_t is_rx)
 {
 	struct rte_eth_dev *dev;
@@ -1870,7 +1870,7 @@ set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
 
 
 int
-rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t tx_queue_id,
 		uint8_t stat_idx)
 {
 	return set_queue_stats_mapping(port_id, tx_queue_id, stat_idx,
@@ -1879,7 +1879,7 @@ rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
 
 
 int
-rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t rx_queue_id,
 		uint8_t stat_idx)
 {
 	return set_queue_stats_mapping(port_id, rx_queue_id, stat_idx,
@@ -1887,7 +1887,7 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
 }
 
 int
-rte_eth_dev_fw_version_get(uint8_t port_id, char *fw_version, size_t fw_size)
+rte_eth_dev_fw_version_get(uint16_t port_id, char *fw_version, size_t fw_size)
 {
 	struct rte_eth_dev *dev;
 
@@ -1899,7 +1899,7 @@ rte_eth_dev_fw_version_get(uint8_t port_id, char *fw_version, size_t fw_size)
 }
 
 void
-rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
+rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)
 {
 	struct rte_eth_dev *dev;
 	const struct rte_eth_desc_lim lim = {
@@ -1923,7 +1923,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
 }
 
 int
-rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
+rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
 				 uint32_t *ptypes, int num)
 {
 	int i, j;
@@ -1949,7 +1949,7 @@ rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
 }
 
 void
-rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
+rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *dev;
 
@@ -1960,7 +1960,7 @@ rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
 
 
 int
-rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
+rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu)
 {
 	struct rte_eth_dev *dev;
 
@@ -1972,7 +1972,7 @@ rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
 }
 
 int
-rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
+rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
 {
 	int ret;
 	struct rte_eth_dev *dev;
@@ -1989,7 +1989,7 @@ rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
 }
 
 int
-rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
+rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on)
 {
 	struct rte_eth_dev *dev;
 	int ret;
@@ -2028,7 +2028,8 @@ rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
 }
 
 int
-rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int on)
+rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
+				    int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2046,7 +2047,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int o
 }
 
 int
-rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 				enum rte_vlan_type vlan_type,
 				uint16_t tpid)
 {
@@ -2060,7 +2061,7 @@ rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
 }
 
 int
-rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
+rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 {
 	struct rte_eth_dev *dev;
 	int ret = 0;
@@ -2103,7 +2104,7 @@ rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
 }
 
 int
-rte_eth_dev_get_vlan_offload(uint8_t port_id)
+rte_eth_dev_get_vlan_offload(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int ret = 0;
@@ -2124,7 +2125,7 @@ rte_eth_dev_get_vlan_offload(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
+rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2137,7 +2138,7 @@ rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
 }
 
 int
-rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2149,7 +2150,7 @@ rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2165,7 +2166,8 @@ rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id, struct rte_eth_pfc_conf *pfc_conf)
+rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
+				   struct rte_eth_pfc_conf *pfc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2231,7 +2233,7 @@ rte_eth_check_reta_entry(struct rte_eth_rss_reta_entry64 *reta_conf,
 }
 
 int
-rte_eth_dev_rss_reta_update(uint8_t port_id,
+rte_eth_dev_rss_reta_update(uint16_t port_id,
 			    struct rte_eth_rss_reta_entry64 *reta_conf,
 			    uint16_t reta_size)
 {
@@ -2257,7 +2259,7 @@ rte_eth_dev_rss_reta_update(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_reta_query(uint8_t port_id,
+rte_eth_dev_rss_reta_query(uint16_t port_id,
 			   struct rte_eth_rss_reta_entry64 *reta_conf,
 			   uint16_t reta_size)
 {
@@ -2277,7 +2279,8 @@ rte_eth_dev_rss_reta_query(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
+rte_eth_dev_rss_hash_update(uint16_t port_id,
+			    struct rte_eth_rss_conf *rss_conf)
 {
 	struct rte_eth_dev *dev;
 	uint16_t rss_hash_protos;
@@ -2296,7 +2299,7 @@ rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
 }
 
 int
-rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 			      struct rte_eth_rss_conf *rss_conf)
 {
 	struct rte_eth_dev *dev;
@@ -2308,7 +2311,7 @@ rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
 				struct rte_eth_udp_tunnel *udp_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -2330,7 +2333,7 @@ rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
 				   struct rte_eth_udp_tunnel *udp_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -2353,7 +2356,7 @@ rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
 }
 
 int
-rte_eth_led_on(uint8_t port_id)
+rte_eth_led_on(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2364,7 +2367,7 @@ rte_eth_led_on(uint8_t port_id)
 }
 
 int
-rte_eth_led_off(uint8_t port_id)
+rte_eth_led_off(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2379,7 +2382,7 @@ rte_eth_led_off(uint8_t port_id)
  * an empty spot.
  */
 static int
-get_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
+get_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2398,7 +2401,7 @@ get_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
 static const struct ether_addr null_mac_addr;
 
 int
-rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_mac_addr_add(uint16_t port_id, struct ether_addr *addr,
 			uint32_t pool)
 {
 	struct rte_eth_dev *dev;
@@ -2451,7 +2454,7 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_mac_addr_remove(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev *dev;
 	int index;
@@ -2480,7 +2483,7 @@ rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev *dev;
 
@@ -2506,7 +2509,7 @@ rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr *addr)
  * an empty spot.
  */
 static int
-get_hash_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
+get_hash_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2525,7 +2528,7 @@ get_hash_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct ether_addr *addr,
 				uint8_t on)
 {
 	int index;
@@ -2577,7 +2580,7 @@ rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
+rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2589,7 +2592,7 @@ rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
 	return (*dev->dev_ops->uc_all_hash_table_set)(dev, on);
 }
 
-int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 					uint16_t tx_rate)
 {
 	struct rte_eth_dev *dev;
@@ -2620,7 +2623,7 @@ int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
 }
 
 int
-rte_eth_mirror_rule_set(uint8_t port_id,
+rte_eth_mirror_rule_set(uint16_t port_id,
 			struct rte_eth_mirror_conf *mirror_conf,
 			uint8_t rule_id, uint8_t on)
 {
@@ -2658,7 +2661,7 @@ rte_eth_mirror_rule_set(uint8_t port_id,
 }
 
 int
-rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
+rte_eth_mirror_rule_reset(uint16_t port_id, uint8_t rule_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2671,7 +2674,7 @@ rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
 }
 
 int
-rte_eth_dev_callback_register(uint8_t port_id,
+rte_eth_dev_callback_register(uint16_t port_id,
 			enum rte_eth_event_type event,
 			rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2711,7 +2714,7 @@ rte_eth_dev_callback_register(uint8_t port_id,
 }
 
 int
-rte_eth_dev_callback_unregister(uint8_t port_id,
+rte_eth_dev_callback_unregister(uint16_t port_id,
 			enum rte_eth_event_type event,
 			rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2783,7 +2786,7 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 }
 
 int
-rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 {
 	uint32_t vec;
 	struct rte_eth_dev *dev;
@@ -2844,7 +2847,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
 }
 
 int
-rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			  int epfd, int op, void *data)
 {
 	uint32_t vec;
@@ -2884,7 +2887,7 @@ rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_dev_rx_intr_enable(uint8_t port_id,
+rte_eth_dev_rx_intr_enable(uint16_t port_id,
 			   uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
@@ -2898,7 +2901,7 @@ rte_eth_dev_rx_intr_enable(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rx_intr_disable(uint8_t port_id,
+rte_eth_dev_rx_intr_disable(uint16_t port_id,
 			    uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
@@ -2913,7 +2916,8 @@ rte_eth_dev_rx_intr_disable(uint8_t port_id,
 
 
 int
-rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
+rte_eth_dev_filter_supported(uint16_t port_id,
+			     enum rte_filter_type filter_type)
 {
 	struct rte_eth_dev *dev;
 
@@ -2926,7 +2930,7 @@ rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
 }
 
 int
-rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
+rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
 		       enum rte_filter_op filter_op, void *arg)
 {
 	struct rte_eth_dev *dev;
@@ -2939,7 +2943,7 @@ rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
 }
 
 void *
-rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -2981,7 +2985,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 void *
-rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3016,7 +3020,7 @@ rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 void *
-rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_tx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3059,7 +3063,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3093,7 +3097,7 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3127,7 +3131,7 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_rxq_info *qinfo)
 {
 	struct rte_eth_dev *dev;
@@ -3151,7 +3155,7 @@ rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_txq_info *qinfo)
 {
 	struct rte_eth_dev *dev;
@@ -3175,7 +3179,7 @@ rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_dev_set_mc_addr_list(uint8_t port_id,
+rte_eth_dev_set_mc_addr_list(uint16_t port_id,
 			     struct ether_addr *mc_addr_set,
 			     uint32_t nb_mc_addr)
 {
@@ -3189,7 +3193,7 @@ rte_eth_dev_set_mc_addr_list(uint8_t port_id,
 }
 
 int
-rte_eth_timesync_enable(uint8_t port_id)
+rte_eth_timesync_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3201,7 +3205,7 @@ rte_eth_timesync_enable(uint8_t port_id)
 }
 
 int
-rte_eth_timesync_disable(uint8_t port_id)
+rte_eth_timesync_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3213,7 +3217,7 @@ rte_eth_timesync_disable(uint8_t port_id)
 }
 
 int
-rte_eth_timesync_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp,
+rte_eth_timesync_read_rx_timestamp(uint16_t port_id, struct timespec *timestamp,
 				   uint32_t flags)
 {
 	struct rte_eth_dev *dev;
@@ -3226,7 +3230,8 @@ rte_eth_timesync_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp,
 }
 
 int
-rte_eth_timesync_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp)
+rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
+				   struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3238,7 +3243,7 @@ rte_eth_timesync_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp)
 }
 
 int
-rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta)
+rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta)
 {
 	struct rte_eth_dev *dev;
 
@@ -3250,7 +3255,7 @@ rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta)
 }
 
 int
-rte_eth_timesync_read_time(uint8_t port_id, struct timespec *timestamp)
+rte_eth_timesync_read_time(uint16_t port_id, struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3262,7 +3267,7 @@ rte_eth_timesync_read_time(uint8_t port_id, struct timespec *timestamp)
 }
 
 int
-rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
+rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3274,7 +3279,7 @@ rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
 }
 
 int
-rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
+rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3286,7 +3291,7 @@ rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
 }
 
 int
-rte_eth_dev_get_eeprom_length(uint8_t port_id)
+rte_eth_dev_get_eeprom_length(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3298,7 +3303,7 @@ rte_eth_dev_get_eeprom_length(uint8_t port_id)
 }
 
 int
-rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
+rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3310,7 +3315,7 @@ rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
 }
 
 int
-rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
+rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3322,7 +3327,7 @@ rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
 }
 
 int
-rte_eth_dev_get_dcb_info(uint8_t port_id,
+rte_eth_dev_get_dcb_info(uint16_t port_id,
 			     struct rte_eth_dcb_info *dcb_info)
 {
 	struct rte_eth_dev *dev;
@@ -3337,7 +3342,7 @@ rte_eth_dev_get_dcb_info(uint8_t port_id,
 }
 
 int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
 				    struct rte_eth_l2_tunnel_conf *l2_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -3360,7 +3365,7 @@ rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
 }
 
 int
-rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
 				  struct rte_eth_l2_tunnel_conf *l2_tunnel,
 				  uint32_t mask,
 				  uint8_t en)
@@ -3404,7 +3409,7 @@ rte_eth_dev_adjust_nb_desc(uint16_t *nb_desc,
 }
 
 int
-rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
 				 uint16_t *nb_rx_desc,
 				 uint16_t *nb_tx_desc)
 {
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 99cdd54d4..34f729ab8 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1572,7 +1572,7 @@ struct eth_dev_ops {
  * @return
  *   The number of packets returned to the user.
  */
-typedef uint16_t (*rte_rx_callback_fn)(uint8_t port, uint16_t queue,
+typedef uint16_t (*rte_rx_callback_fn)(uint16_t port, uint16_t queue,
 	struct rte_mbuf *pkts[], uint16_t nb_pkts, uint16_t max_pkts,
 	void *user_param);
 
@@ -1596,7 +1596,7 @@ typedef uint16_t (*rte_rx_callback_fn)(uint8_t port, uint16_t queue,
  * @return
  *   The number of packets to be written to the NIC.
  */
-typedef uint16_t (*rte_tx_callback_fn)(uint8_t port, uint16_t queue,
+typedef uint16_t (*rte_tx_callback_fn)(uint16_t port, uint16_t queue,
 	struct rte_mbuf *pkts[], uint16_t nb_pkts, void *user_param);
 
 /**
@@ -1699,7 +1699,7 @@ struct rte_eth_dev_data {
 	/** bitmap array of associating Ethernet MAC addresses to pools */
 	struct ether_addr* hash_mac_addrs;
 	/** Device Ethernet MAC addresses of hash filtering. */
-	uint8_t port_id;           /**< Device [external] port identifier. */
+	uint16_t port_id;           /**< Device [external] port identifier. */
 	__extension__
 	uint8_t promiscuous   : 1, /**< RX promiscuous mode ON(1) / OFF(0). */
 		scattered_rx : 1,  /**< RX of scattered packets is ON(1) / OFF(0) */
@@ -1741,7 +1741,7 @@ extern struct rte_eth_dev rte_eth_devices[];
  * @return
  *   Next valid port id, RTE_MAX_ETHPORTS if there is none.
  */
-uint8_t rte_eth_find_next(uint8_t port_id);
+uint16_t rte_eth_find_next(uint16_t port_id);
 
 /**
  * Macro to iterate over all enabled ethdev ports.
@@ -1764,7 +1764,7 @@ uint8_t rte_eth_find_next(uint8_t port_id);
  * @return
  *   - The total number of usable Ethernet devices.
  */
-uint8_t rte_eth_dev_count(void);
+uint16_t rte_eth_dev_count(void);
 
 /**
  * @internal
@@ -1825,7 +1825,7 @@ int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev);
  * @return
  *  0 on success and port_id is filled, negative on error
  */
-int rte_eth_dev_attach(const char *devargs, uint8_t *port_id);
+int rte_eth_dev_attach(const char *devargs, uint16_t *port_id);
 
 /**
  * Detach a Ethernet device specified by port identifier.
@@ -1840,7 +1840,7 @@ int rte_eth_dev_attach(const char *devargs, uint8_t *port_id);
  * @return
  *  0 on success and devname is filled, negative on error
  */
-int rte_eth_dev_detach(uint8_t port_id, char *devname);
+int rte_eth_dev_detach(uint16_t port_id, char *devname);
 
 /**
  * Convert a numerical speed in Mbps to a bitmap flag that can be used in
@@ -1884,7 +1884,7 @@ uint32_t rte_eth_speed_bitflag(uint32_t speed, int duplex);
  *   - 0: Success, device configured.
  *   - <0: Error code returned by the driver configuration function.
  */
-int rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_queue,
+int rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_queue,
 		uint16_t nb_tx_queue, const struct rte_eth_conf *eth_conf);
 
 /**
@@ -1939,7 +1939,7 @@ void _rte_eth_dev_reset(struct rte_eth_dev *dev);
  *      allocate network memory buffers from the memory pool when
  *      initializing receive descriptors.
  */
-int rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
+int rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 		uint16_t nb_rx_desc, unsigned int socket_id,
 		const struct rte_eth_rxconf *rx_conf,
 		struct rte_mempool *mb_pool);
@@ -1987,7 +1987,7 @@ int rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
  *   - 0: Success, the transmit queue is correctly set up.
  *   - -ENOMEM: Unable to allocate the transmit ring descriptors.
  */
-int rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
+int rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 		uint16_t nb_tx_desc, unsigned int socket_id,
 		const struct rte_eth_txconf *tx_conf);
 
@@ -2001,7 +2001,7 @@ int rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
  *   a default of zero if the socket could not be determined.
  *   -1 is returned is the port_id value is out of range.
  */
-int rte_eth_dev_socket_id(uint8_t port_id);
+int rte_eth_dev_socket_id(uint16_t port_id);
 
 /**
  * Check if port_id of device is attached
@@ -2012,7 +2012,7 @@ int rte_eth_dev_socket_id(uint8_t port_id);
  *   - 0 if port is out of range or not attached
  *   - 1 if device is attached
  */
-int rte_eth_dev_is_valid_port(uint8_t port_id);
+int rte_eth_dev_is_valid_port(uint16_t port_id);
 
 /**
  * Start specified RX queue of a port. It is used when rx_deferred_start
@@ -2029,7 +2029,7 @@ int rte_eth_dev_is_valid_port(uint8_t port_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id);
+int rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id);
 
 /**
  * Stop specified RX queue of a port
@@ -2045,7 +2045,7 @@ int rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id);
+int rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id);
 
 /**
  * Start TX for specified queue of a port. It is used when tx_deferred_start
@@ -2062,7 +2062,7 @@ int rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id);
+int rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id);
 
 /**
  * Stop specified TX queue of a port
@@ -2078,7 +2078,7 @@ int rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id);
+int rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id);
 
 
 
@@ -2097,7 +2097,7 @@ int rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id);
  *   - 0: Success, Ethernet device started.
  *   - <0: Error code of the driver device start function.
  */
-int rte_eth_dev_start(uint8_t port_id);
+int rte_eth_dev_start(uint16_t port_id);
 
 /**
  * Stop an Ethernet device. The device can be restarted with a call to
@@ -2106,7 +2106,7 @@ int rte_eth_dev_start(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_dev_stop(uint8_t port_id);
+void rte_eth_dev_stop(uint16_t port_id);
 
 
 /**
@@ -2121,7 +2121,7 @@ void rte_eth_dev_stop(uint8_t port_id);
  *   - 0: Success, Ethernet device linked up.
  *   - <0: Error code of the driver device link up function.
  */
-int rte_eth_dev_set_link_up(uint8_t port_id);
+int rte_eth_dev_set_link_up(uint16_t port_id);
 
 /**
  * Link down an Ethernet device.
@@ -2132,7 +2132,7 @@ int rte_eth_dev_set_link_up(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-int rte_eth_dev_set_link_down(uint8_t port_id);
+int rte_eth_dev_set_link_down(uint16_t port_id);
 
 /**
  * Close a stopped Ethernet device. The device cannot be restarted!
@@ -2142,7 +2142,7 @@ int rte_eth_dev_set_link_down(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_dev_close(uint8_t port_id);
+void rte_eth_dev_close(uint16_t port_id);
 
 /**
  * Reset a Ethernet device and keep its port id.
@@ -2172,7 +2172,7 @@ void rte_eth_dev_close(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-int rte_eth_dev_reset(uint8_t port_id);
+int rte_eth_dev_reset(uint16_t port_id);
 
 /**
  * Enable receipt in promiscuous mode for an Ethernet device.
@@ -2180,7 +2180,7 @@ int rte_eth_dev_reset(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_promiscuous_enable(uint8_t port_id);
+void rte_eth_promiscuous_enable(uint16_t port_id);
 
 /**
  * Disable receipt in promiscuous mode for an Ethernet device.
@@ -2188,7 +2188,7 @@ void rte_eth_promiscuous_enable(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_promiscuous_disable(uint8_t port_id);
+void rte_eth_promiscuous_disable(uint16_t port_id);
 
 /**
  * Return the value of promiscuous mode for an Ethernet device.
@@ -2200,7 +2200,7 @@ void rte_eth_promiscuous_disable(uint8_t port_id);
  *   - (0) if promiscuous is disabled.
  *   - (-1) on error
  */
-int rte_eth_promiscuous_get(uint8_t port_id);
+int rte_eth_promiscuous_get(uint16_t port_id);
 
 /**
  * Enable the receipt of any multicast frame by an Ethernet device.
@@ -2208,7 +2208,7 @@ int rte_eth_promiscuous_get(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_allmulticast_enable(uint8_t port_id);
+void rte_eth_allmulticast_enable(uint16_t port_id);
 
 /**
  * Disable the receipt of all multicast frames by an Ethernet device.
@@ -2216,7 +2216,7 @@ void rte_eth_allmulticast_enable(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_allmulticast_disable(uint8_t port_id);
+void rte_eth_allmulticast_disable(uint16_t port_id);
 
 /**
  * Return the value of allmulticast mode for an Ethernet device.
@@ -2228,7 +2228,7 @@ void rte_eth_allmulticast_disable(uint8_t port_id);
  *   - (0) if allmulticast is disabled.
  *   - (-1) on error
  */
-int rte_eth_allmulticast_get(uint8_t port_id);
+int rte_eth_allmulticast_get(uint16_t port_id);
 
 /**
  * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
@@ -2241,7 +2241,7 @@ int rte_eth_allmulticast_get(uint8_t port_id);
  *   A pointer to an *rte_eth_link* structure to be filled with
  *   the status, the speed and the mode of the Ethernet device link.
  */
-void rte_eth_link_get(uint8_t port_id, struct rte_eth_link *link);
+void rte_eth_link_get(uint16_t port_id, struct rte_eth_link *link);
 
 /**
  * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
@@ -2254,7 +2254,7 @@ void rte_eth_link_get(uint8_t port_id, struct rte_eth_link *link);
  *   A pointer to an *rte_eth_link* structure to be filled with
  *   the status, the speed and the mode of the Ethernet device link.
  */
-void rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *link);
+void rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *link);
 
 /**
  * Retrieve the general I/O statistics of an Ethernet device.
@@ -2273,7 +2273,7 @@ void rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *link);
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats);
+int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats);
 
 /**
  * Reset the general I/O statistics of an Ethernet device.
@@ -2281,7 +2281,7 @@ int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_stats_reset(uint8_t port_id);
+void rte_eth_stats_reset(uint16_t port_id);
 
 /**
  * Retrieve names of extended statistics of an Ethernet device.
@@ -2303,7 +2303,7 @@ void rte_eth_stats_reset(uint8_t port_id);
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get_names(uint8_t port_id,
+int rte_eth_xstats_get_names(uint16_t port_id,
 		struct rte_eth_xstat_name *xstats_names,
 		unsigned int size);
 
@@ -2329,7 +2329,7 @@ int rte_eth_xstats_get_names(uint8_t port_id,
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
+int rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
 		unsigned int n);
 
 /**
@@ -2355,7 +2355,7 @@ int rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
  *   - A negative value on error (invalid port id).
  */
 int
-rte_eth_xstats_get_names_by_id(uint8_t port_id,
+rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names, unsigned int size,
 	uint64_t *ids);
 
@@ -2382,7 +2382,7 @@ rte_eth_xstats_get_names_by_id(uint8_t port_id,
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids,
+int rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 			     uint64_t *values, unsigned int n);
 
 /**
@@ -2402,7 +2402,7 @@ int rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids,
  *    -ENODEV for invalid port_id,
  *    -EINVAL if the xstat_name doesn't exist in port_id
  */
-int rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
+int rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
 		uint64_t *id);
 
 /**
@@ -2411,7 +2411,7 @@ int rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_xstats_reset(uint8_t port_id);
+void rte_eth_xstats_reset(uint16_t port_id);
 
 /**
  *  Set a mapping for the specified transmit queue to the specified per-queue
@@ -2430,7 +2430,7 @@ void rte_eth_xstats_reset(uint8_t port_id);
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id,
+int rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id,
 		uint16_t tx_queue_id, uint8_t stat_idx);
 
 /**
@@ -2450,7 +2450,7 @@ int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id,
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id,
+int rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id,
 					   uint16_t rx_queue_id,
 					   uint8_t stat_idx);
 
@@ -2463,7 +2463,7 @@ int rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id,
  *   A pointer to a structure of type *ether_addr* to be filled with
  *   the Ethernet address of the Ethernet device.
  */
-void rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr);
+void rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr);
 
 /**
  * Retrieve the contextual information of an Ethernet device.
@@ -2474,7 +2474,7 @@ void rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr);
  *   A pointer to a structure of type *rte_eth_dev_info* to be filled with
  *   the contextual information of the Ethernet device.
  */
-void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info);
+void rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info);
 
 /**
  * Retrieve the firmware version of a device.
@@ -2494,7 +2494,7 @@ void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info);
  *   - (>0) if *fw_size* is not enough to store firmware version, return
  *          the size of the non truncated string.
  */
-int rte_eth_dev_fw_version_get(uint8_t port_id,
+int rte_eth_dev_fw_version_get(uint16_t port_id,
 			       char *fw_version, size_t fw_size);
 
 /**
@@ -2535,7 +2535,7 @@ int rte_eth_dev_fw_version_get(uint8_t port_id,
  *           count of supported ptypes will be returned.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
+int rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
 				     uint32_t *ptypes, int num);
 
 /**
@@ -2549,7 +2549,7 @@ int rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
  *   - (0) if successful.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu);
+int rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu);
 
 /**
  * Change the MTU of an Ethernet device.
@@ -2565,7 +2565,7 @@ int rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu);
  *   - (-EINVAL) if *mtu* invalid.
  *   - (-EBUSY) if operation is not allowed when the port is running
  */
-int rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu);
+int rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu);
 
 /**
  * Enable/Disable hardware filtering by an Ethernet device of received
@@ -2585,7 +2585,7 @@ int rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu);
  *   - (-ENOSYS) if VLAN filtering on *port_id* disabled.
  *   - (-EINVAL) if *vlan_id* > 4095.
  */
-int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on);
+int rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on);
 
 /**
  * Enable/Disable hardware VLAN Strip by a rx queue of an Ethernet device.
@@ -2606,7 +2606,7 @@ int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if *rx_queue_id* invalid.
  */
-int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id,
+int rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
 		int on);
 
 /**
@@ -2625,7 +2625,7 @@ int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id,
  *   - (-ENOSUP) if hardware-assisted VLAN TPID setup is not supported.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+int rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 				    enum rte_vlan_type vlan_type,
 				    uint16_t tag_type);
 
@@ -2649,7 +2649,7 @@ int rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
  *   - (-ENOSUP) if hardware-assisted VLAN filtering not configured.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask);
+int rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask);
 
 /**
  * Read VLAN Offload configuration from an Ethernet device
@@ -2663,7 +2663,7 @@ int rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask);
  *       ETH_VLAN_EXTEND_OFFLOAD
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_vlan_offload(uint8_t port_id);
+int rte_eth_dev_get_vlan_offload(uint16_t port_id);
 
 /**
  * Set port based TX VLAN insertion on or off.
@@ -2679,7 +2679,7 @@ int rte_eth_dev_get_vlan_offload(uint8_t port_id);
  *   - (0) if successful.
  *   - negative if failed.
  */
-int rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on);
+int rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on);
 
 /**
  *
@@ -2764,7 +2764,7 @@ int rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on);
  *   *rx_pkts* array.
  */
 static inline uint16_t
-rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_burst(uint16_t port_id, uint16_t queue_id,
 		 struct rte_mbuf **rx_pkts, const uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2809,7 +2809,7 @@ rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
  *     (-ENOTSUP) if the device does not support this function
  */
 static inline int
-rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id)
+rte_eth_rx_queue_count(uint16_t port_id, uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2838,7 +2838,7 @@ rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id)
  *  - (-ENOTSUP) if the device does not support this function
  */
 static inline int
-rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset)
+rte_eth_rx_descriptor_done(uint16_t port_id, uint16_t queue_id, uint16_t offset)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
@@ -2885,7 +2885,7 @@ rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset)
  *  - (-ENODEV) bad port or queue (only if compiled with debug).
  */
 static inline int
-rte_eth_rx_descriptor_status(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_descriptor_status(uint16_t port_id, uint16_t queue_id,
 	uint16_t offset)
 {
 	struct rte_eth_dev *dev;
@@ -2942,7 +2942,7 @@ rte_eth_rx_descriptor_status(uint8_t port_id, uint16_t queue_id,
  *  - (-ENOTSUP) if the device does not support this function.
  *  - (-ENODEV) bad port or queue (only if compiled with debug).
  */
-static inline int rte_eth_tx_descriptor_status(uint8_t port_id,
+static inline int rte_eth_tx_descriptor_status(uint16_t port_id,
 	uint16_t queue_id, uint16_t offset)
 {
 	struct rte_eth_dev *dev;
@@ -3026,7 +3026,7 @@ static inline int rte_eth_tx_descriptor_status(uint8_t port_id,
  *   *tx_pkts* parameter when the transmit ring is full or has been filled up.
  */
 static inline uint16_t
-rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id,
 		 struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -3115,7 +3115,7 @@ rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
 #ifndef RTE_ETHDEV_TX_PREPARE_NOOP
 
 static inline uint16_t
-rte_eth_tx_prepare(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_prepare(uint16_t port_id, uint16_t queue_id,
 		struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev;
@@ -3157,7 +3157,8 @@ rte_eth_tx_prepare(uint8_t port_id, uint16_t queue_id,
  */
 
 static inline uint16_t
-rte_eth_tx_prepare(__rte_unused uint8_t port_id, __rte_unused uint16_t queue_id,
+rte_eth_tx_prepare(__rte_unused uint16_t port_id,
+		__rte_unused uint16_t queue_id,
 		__rte_unused struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	return nb_pkts;
@@ -3226,7 +3227,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size);
  *   callback is called for any packets which could not be sent.
  */
 static inline uint16_t
-rte_eth_tx_buffer_flush(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_buffer_flush(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_dev_tx_buffer *buffer)
 {
 	uint16_t sent;
@@ -3278,7 +3279,7 @@ rte_eth_tx_buffer_flush(uint8_t port_id, uint16_t queue_id,
  *     the rest.
  */
 static __rte_always_inline uint16_t
-rte_eth_tx_buffer(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_buffer(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_dev_tx_buffer *buffer, struct rte_mbuf *tx_pkt)
 {
 	buffer->pkts[buffer->length++] = tx_pkt;
@@ -3394,7 +3395,7 @@ rte_eth_tx_buffer_count_callback(struct rte_mbuf **pkts, uint16_t unsent,
  *     are in use.
  */
 int
-rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt);
+rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt);
 
 /**
  * The eth device event type for interrupt, and maybe others in the future.
@@ -3412,7 +3413,7 @@ enum rte_eth_event_type {
 	RTE_ETH_EVENT_MAX       /**< max value of this enum */
 };
 
-typedef int (*rte_eth_dev_cb_fn)(uint8_t port_id,
+typedef int (*rte_eth_dev_cb_fn)(uint16_t port_id,
 		enum rte_eth_event_type event, void *cb_arg, void *ret_param);
 /**< user application callback to be registered for interrupts */
 
@@ -3434,7 +3435,7 @@ typedef int (*rte_eth_dev_cb_fn)(uint8_t port_id,
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_dev_callback_register(uint8_t port_id,
+int rte_eth_dev_callback_register(uint16_t port_id,
 			enum rte_eth_event_type event,
 		rte_eth_dev_cb_fn cb_fn, void *cb_arg);
 
@@ -3455,7 +3456,7 @@ int rte_eth_dev_callback_register(uint8_t port_id,
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_dev_callback_unregister(uint8_t port_id,
+int rte_eth_dev_callback_unregister(uint16_t port_id,
 			enum rte_eth_event_type event,
 		rte_eth_dev_cb_fn cb_fn, void *cb_arg);
 
@@ -3501,7 +3502,7 @@ int _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id);
+int rte_eth_dev_rx_intr_enable(uint16_t port_id, uint16_t queue_id);
 
 /**
  * When lcore wakes up from rx interrupt indicating packet coming, disable rx
@@ -3522,7 +3523,7 @@ int rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id);
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id);
+int rte_eth_dev_rx_intr_disable(uint16_t port_id, uint16_t queue_id);
 
 /**
  * RX Interrupt control per port.
@@ -3541,7 +3542,7 @@ int rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id);
  *   - On success, zero.
  *   - On failure, a negative value.
  */
-int rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data);
+int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
 
 /**
  * RX Interrupt control per queue.
@@ -3564,7 +3565,7 @@ int rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data);
  *   - On success, zero.
  *   - On failure, a negative value.
  */
-int rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			      int epfd, int op, void *data);
 
 /**
@@ -3579,7 +3580,7 @@ int rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int  rte_eth_led_on(uint8_t port_id);
+int  rte_eth_led_on(uint16_t port_id);
 
 /**
  * Turn off the LED on the Ethernet device.
@@ -3593,7 +3594,7 @@ int  rte_eth_led_on(uint8_t port_id);
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int  rte_eth_led_off(uint8_t port_id);
+int  rte_eth_led_off(uint16_t port_id);
 
 /**
  * Get current status of the Ethernet link flow control for Ethernet device
@@ -3607,7 +3608,7 @@ int  rte_eth_led_off(uint8_t port_id);
  *   - (-ENOTSUP) if hardware doesn't support flow control.
  *   - (-ENODEV)  if *port_id* invalid.
  */
-int rte_eth_dev_flow_ctrl_get(uint8_t port_id,
+int rte_eth_dev_flow_ctrl_get(uint16_t port_id,
 			      struct rte_eth_fc_conf *fc_conf);
 
 /**
@@ -3624,7 +3625,7 @@ int rte_eth_dev_flow_ctrl_get(uint8_t port_id,
  *   - (-EINVAL)  if bad parameter
  *   - (-EIO)     if flow control setup failure
  */
-int rte_eth_dev_flow_ctrl_set(uint8_t port_id,
+int rte_eth_dev_flow_ctrl_set(uint16_t port_id,
 			      struct rte_eth_fc_conf *fc_conf);
 
 /**
@@ -3642,7 +3643,7 @@ int rte_eth_dev_flow_ctrl_set(uint8_t port_id,
  *   - (-EINVAL)  if bad parameter
  *   - (-EIO)     if flow control setup failure
  */
-int rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id,
+int rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
 				struct rte_eth_pfc_conf *pfc_conf);
 
 /**
@@ -3663,7 +3664,7 @@ int rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id,
  *   - (-ENOSPC) if no more MAC addresses can be added.
  *   - (-EINVAL) if MAC address is invalid.
  */
-int rte_eth_dev_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
+int rte_eth_dev_mac_addr_add(uint16_t port, struct ether_addr *mac_addr,
 				uint32_t pool);
 
 /**
@@ -3679,7 +3680,7 @@ int rte_eth_dev_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EADDRINUSE) if attempting to remove the default MAC address
  */
-int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr);
+int rte_eth_dev_mac_addr_remove(uint16_t port, struct ether_addr *mac_addr);
 
 /**
  * Set the default MAC address.
@@ -3694,8 +3695,8 @@ int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if MAC address is invalid.
  */
-int rte_eth_dev_default_mac_addr_set(uint8_t port, struct ether_addr *mac_addr);
-
+int rte_eth_dev_default_mac_addr_set(uint16_t port,
+		struct ether_addr *mac_addr);
 
 /**
  * Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
@@ -3712,7 +3713,7 @@ int rte_eth_dev_default_mac_addr_set(uint8_t port, struct ether_addr *mac_addr);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_reta_update(uint8_t port,
+int rte_eth_dev_rss_reta_update(uint16_t port,
 				struct rte_eth_rss_reta_entry64 *reta_conf,
 				uint16_t reta_size);
 
@@ -3731,7 +3732,7 @@ int rte_eth_dev_rss_reta_update(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_reta_query(uint8_t port,
+int rte_eth_dev_rss_reta_query(uint16_t port,
 			       struct rte_eth_rss_reta_entry64 *reta_conf,
 			       uint16_t reta_size);
 
@@ -3753,8 +3754,8 @@ int rte_eth_dev_rss_reta_query(uint8_t port,
   *  - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_uc_hash_table_set(uint8_t port,struct ether_addr *addr,
-					uint8_t on);
+int rte_eth_dev_uc_hash_table_set(uint16_t port, struct ether_addr *addr,
+				  uint8_t on);
 
  /**
  * Updates all unicast hash bitmaps for receiving packet with any Unicast
@@ -3773,7 +3774,7 @@ int rte_eth_dev_uc_hash_table_set(uint8_t port,struct ether_addr *addr,
   *  - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_uc_all_hash_table_set(uint8_t port,uint8_t on);
+int rte_eth_dev_uc_all_hash_table_set(uint16_t port, uint8_t on);
 
 /**
  * Set a traffic mirroring rule on an Ethernet device
@@ -3796,7 +3797,7 @@ int rte_eth_dev_uc_all_hash_table_set(uint8_t port,uint8_t on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if the mr_conf information is not correct.
  */
-int rte_eth_mirror_rule_set(uint8_t port_id,
+int rte_eth_mirror_rule_set(uint16_t port_id,
 			struct rte_eth_mirror_conf *mirror_conf,
 			uint8_t rule_id,
 			uint8_t on);
@@ -3814,7 +3815,7 @@ int rte_eth_mirror_rule_set(uint8_t port_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_mirror_rule_reset(uint8_t port_id,
+int rte_eth_mirror_rule_reset(uint16_t port_id,
 					 uint8_t rule_id);
 
 /**
@@ -3832,7 +3833,7 @@ int rte_eth_mirror_rule_reset(uint8_t port_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 			uint16_t tx_rate);
 
  /**
@@ -3848,7 +3849,7 @@ int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_hash_update(uint8_t port_id,
+int rte_eth_dev_rss_hash_update(uint16_t port_id,
 				struct rte_eth_rss_conf *rss_conf);
 
  /**
@@ -3865,7 +3866,7 @@ int rte_eth_dev_rss_hash_update(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support RSS.
  */
 int
-rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 			      struct rte_eth_rss_conf *rss_conf);
 
  /**
@@ -3886,7 +3887,7 @@ rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
 				struct rte_eth_udp_tunnel *tunnel_udp);
 
  /**
@@ -3908,7 +3909,7 @@ rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
 				   struct rte_eth_udp_tunnel *tunnel_udp);
 
 /**
@@ -3924,7 +3925,8 @@ rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support this filter type.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type);
+int rte_eth_dev_filter_supported(uint16_t port_id,
+		enum rte_filter_type filter_type);
 
 /**
  * Take operations to assigned filter type on an Ethernet device.
@@ -3944,7 +3946,7 @@ int rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_ty
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
+int rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op, void *arg);
 
 /**
@@ -3959,7 +3961,7 @@ int rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
  *   - (-ENODEV) if port identifier is invalid.
  *   - (-ENOTSUP) if hardware doesn't support.
  */
-int rte_eth_dev_get_dcb_info(uint8_t port_id,
+int rte_eth_dev_get_dcb_info(uint16_t port_id,
 			     struct rte_eth_dcb_info *dcb_info);
 
 /**
@@ -3986,7 +3988,7 @@ int rte_eth_dev_get_dcb_info(uint8_t port_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param);
 
 /**
@@ -4014,7 +4016,7 @@ void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param);
 
 /**
@@ -4041,7 +4043,7 @@ void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_tx_callback_fn fn, void *user_param);
 
 /**
@@ -4074,7 +4076,7 @@ void *rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -EINVAL:  The port_id or the queue_id is out of range, or the callback
  *               is NULL or not found for the port/queue.
  */
-int rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
+int rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb);
 
 /**
@@ -4107,7 +4109,7 @@ int rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -EINVAL:  The port_id or the queue_id is out of range, or the callback
  *               is NULL or not found for the port/queue.
  */
-int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
+int rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb);
 
 /**
@@ -4127,7 +4129,7 @@ int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -ENOTSUP: routine is not supported by the device PMD.
  *   - -EINVAL:  The port_id or the queue_id is out of range.
  */
-int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+int rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_rxq_info *qinfo);
 
 /**
@@ -4147,7 +4149,7 @@ int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
  *   - -ENOTSUP: routine is not supported by the device PMD.
  *   - -EINVAL:  The port_id or the queue_id is out of range.
  */
-int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+int rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_txq_info *qinfo);
 
 /**
@@ -4166,7 +4168,7 @@ int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info);
+int rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info);
 
 /**
  * Retrieve size of device EEPROM
@@ -4179,7 +4181,7 @@ int rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_eeprom_length(uint8_t port_id);
+int rte_eth_dev_get_eeprom_length(uint16_t port_id);
 
 /**
  * Retrieve EEPROM and EEPROM attribute
@@ -4195,7 +4197,7 @@ int rte_eth_dev_get_eeprom_length(uint8_t port_id);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
+int rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info);
 
 /**
  * Program EEPROM with provided data
@@ -4211,7 +4213,7 @@ int rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
+int rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info);
 
 /**
  * Set the list of multicast addresses to filter on an Ethernet device.
@@ -4230,7 +4232,7 @@ int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
  *   - (-ENOTSUP) if PMD of *port_id* doesn't support multicast filtering.
  *   - (-ENOSPC) if *port_id* has not enough multicast filtering resources.
  */
-int rte_eth_dev_set_mc_addr_list(uint8_t port_id,
+int rte_eth_dev_set_mc_addr_list(uint16_t port_id,
 				 struct ether_addr *mc_addr_set,
 				 uint32_t nb_mc_addr);
 
@@ -4245,7 +4247,7 @@ int rte_eth_dev_set_mc_addr_list(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_enable(uint8_t port_id);
+int rte_eth_timesync_enable(uint16_t port_id);
 
 /**
  * Disable IEEE1588/802.1AS timestamping for an Ethernet device.
@@ -4258,7 +4260,7 @@ int rte_eth_timesync_enable(uint8_t port_id);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_disable(uint8_t port_id);
+int rte_eth_timesync_disable(uint16_t port_id);
 
 /**
  * Read an IEEE1588/802.1AS RX timestamp from an Ethernet device.
@@ -4277,7 +4279,7 @@ int rte_eth_timesync_disable(uint8_t port_id);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
+int rte_eth_timesync_read_rx_timestamp(uint16_t port_id,
 		struct timespec *timestamp, uint32_t flags);
 
 /**
@@ -4294,7 +4296,7 @@ int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
+int rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
 		struct timespec *timestamp);
 
 /**
@@ -4313,7 +4315,7 @@ int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta);
+int rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta);
 
 /**
  * Read the time from the timesync clock on an Ethernet device.
@@ -4329,7 +4331,7 @@ int rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta);
  * @return
  *   - 0: Success.
  */
-int rte_eth_timesync_read_time(uint8_t port_id, struct timespec *time);
+int rte_eth_timesync_read_time(uint16_t port_id, struct timespec *time);
 
 /**
  * Set the time of the timesync clock on an Ethernet device.
@@ -4348,7 +4350,7 @@ int rte_eth_timesync_read_time(uint8_t port_id, struct timespec *time);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *time);
+int rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *time);
 
 /**
  * Create memzone for HW rings.
@@ -4389,7 +4391,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
 				    struct rte_eth_l2_tunnel_conf *l2_tunnel);
 
 /**
@@ -4416,7 +4418,7 @@ rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
 				  struct rte_eth_l2_tunnel_conf *l2_tunnel,
 				  uint32_t mask,
 				  uint8_t en);
@@ -4434,7 +4436,7 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
 *   - (-ENODEV or -EINVAL) on failure.
 */
 int
-rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id);
+rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id);
 
 /**
 * Get the device name from port id
@@ -4448,7 +4450,7 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id);
 *   - (-EINVAL) on failure.
 */
 int
-rte_eth_dev_get_name_by_port(uint8_t port_id, char *name);
+rte_eth_dev_get_name_by_port(uint16_t port_id, char *name);
 
 /**
  * Check that numbers of Rx and Tx descriptors satisfy descriptors limits from
@@ -4466,7 +4468,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name);
  *   - (0) if successful.
  *   - (-ENOTSUP, -ENODEV or -EINVAL) on failure.
  */
-int rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+int rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
 				     uint16_t *nb_rx_desc,
 				     uint16_t *nb_tx_desc);
 
diff --git a/lib/librte_ether/rte_flow.c b/lib/librte_ether/rte_flow.c
index 2001fbbf4..95d9ee007 100644
--- a/lib/librte_ether/rte_flow.c
+++ b/lib/librte_ether/rte_flow.c
@@ -108,7 +108,7 @@ static const struct rte_flow_desc_data rte_flow_desc_action[] = {
 
 /* Get generic flow operations structure from a port. */
 const struct rte_flow_ops *
-rte_flow_ops_get(uint8_t port_id, struct rte_flow_error *error)
+rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	const struct rte_flow_ops *ops;
diff --git a/lib/librte_ether/rte_flow_driver.h b/lib/librte_ether/rte_flow_driver.h
index 4d95391d8..8573cefa3 100644
--- a/lib/librte_ether/rte_flow_driver.h
+++ b/lib/librte_ether/rte_flow_driver.h
@@ -178,7 +178,7 @@ rte_flow_error_set(struct rte_flow_error *error,
  *   additional details.
  */
 const struct rte_flow_ops *
-rte_flow_ops_get(uint8_t port_id, struct rte_flow_error *error);
+rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_ether/rte_tm.c b/lib/librte_ether/rte_tm.c
index 71679650e..ceac34115 100644
--- a/lib/librte_ether/rte_tm.c
+++ b/lib/librte_ether/rte_tm.c
@@ -40,7 +40,7 @@
 
 /* Get generic traffic manager operations structure from a port. */
 const struct rte_tm_ops *
-rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error)
+rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	const struct rte_tm_ops *ops;
@@ -87,7 +87,7 @@ rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error)
 
 /* Get number of leaf nodes */
 int
-rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
+rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
 	uint32_t *n_leaf_nodes,
 	struct rte_tm_error *error)
 {
@@ -113,7 +113,7 @@ rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
 
 /* Check node type (leaf or non-leaf) */
 int
-rte_tm_node_type_get(uint8_t port_id,
+rte_tm_node_type_get(uint16_t port_id,
 	uint32_t node_id,
 	int *is_leaf,
 	struct rte_tm_error *error)
@@ -124,7 +124,7 @@ rte_tm_node_type_get(uint8_t port_id,
 }
 
 /* Get capabilities */
-int rte_tm_capabilities_get(uint8_t port_id,
+int rte_tm_capabilities_get(uint16_t port_id,
 	struct rte_tm_capabilities *cap,
 	struct rte_tm_error *error)
 {
@@ -134,7 +134,7 @@ int rte_tm_capabilities_get(uint8_t port_id,
 }
 
 /* Get level capabilities */
-int rte_tm_level_capabilities_get(uint8_t port_id,
+int rte_tm_level_capabilities_get(uint16_t port_id,
 	uint32_t level_id,
 	struct rte_tm_level_capabilities *cap,
 	struct rte_tm_error *error)
@@ -145,7 +145,7 @@ int rte_tm_level_capabilities_get(uint8_t port_id,
 }
 
 /* Get node capabilities */
-int rte_tm_node_capabilities_get(uint8_t port_id,
+int rte_tm_node_capabilities_get(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_capabilities *cap,
 	struct rte_tm_error *error)
@@ -156,7 +156,7 @@ int rte_tm_node_capabilities_get(uint8_t port_id,
 }
 
 /* Add WRED profile */
-int rte_tm_wred_profile_add(uint8_t port_id,
+int rte_tm_wred_profile_add(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_wred_params *profile,
 	struct rte_tm_error *error)
@@ -167,7 +167,7 @@ int rte_tm_wred_profile_add(uint8_t port_id,
 }
 
 /* Delete WRED profile */
-int rte_tm_wred_profile_delete(uint8_t port_id,
+int rte_tm_wred_profile_delete(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
 {
@@ -177,7 +177,7 @@ int rte_tm_wred_profile_delete(uint8_t port_id,
 }
 
 /* Add/update shared WRED context */
-int rte_tm_shared_wred_context_add_update(uint8_t port_id,
+int rte_tm_shared_wred_context_add_update(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
@@ -188,7 +188,7 @@ int rte_tm_shared_wred_context_add_update(uint8_t port_id,
 }
 
 /* Delete shared WRED context */
-int rte_tm_shared_wred_context_delete(uint8_t port_id,
+int rte_tm_shared_wred_context_delete(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	struct rte_tm_error *error)
 {
@@ -198,7 +198,7 @@ int rte_tm_shared_wred_context_delete(uint8_t port_id,
 }
 
 /* Add shaper profile */
-int rte_tm_shaper_profile_add(uint8_t port_id,
+int rte_tm_shaper_profile_add(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_shaper_params *profile,
 	struct rte_tm_error *error)
@@ -209,7 +209,7 @@ int rte_tm_shaper_profile_add(uint8_t port_id,
 }
 
 /* Delete WRED profile */
-int rte_tm_shaper_profile_delete(uint8_t port_id,
+int rte_tm_shaper_profile_delete(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
 {
@@ -219,7 +219,7 @@ int rte_tm_shaper_profile_delete(uint8_t port_id,
 }
 
 /* Add shared shaper */
-int rte_tm_shared_shaper_add_update(uint8_t port_id,
+int rte_tm_shared_shaper_add_update(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
@@ -230,7 +230,7 @@ int rte_tm_shared_shaper_add_update(uint8_t port_id,
 }
 
 /* Delete shared shaper */
-int rte_tm_shared_shaper_delete(uint8_t port_id,
+int rte_tm_shared_shaper_delete(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	struct rte_tm_error *error)
 {
@@ -240,7 +240,7 @@ int rte_tm_shared_shaper_delete(uint8_t port_id,
 }
 
 /* Add node to port traffic manager hierarchy */
-int rte_tm_node_add(uint8_t port_id,
+int rte_tm_node_add(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -256,7 +256,7 @@ int rte_tm_node_add(uint8_t port_id,
 }
 
 /* Delete node from traffic manager hierarchy */
-int rte_tm_node_delete(uint8_t port_id,
+int rte_tm_node_delete(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -266,7 +266,7 @@ int rte_tm_node_delete(uint8_t port_id,
 }
 
 /* Suspend node */
-int rte_tm_node_suspend(uint8_t port_id,
+int rte_tm_node_suspend(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -276,7 +276,7 @@ int rte_tm_node_suspend(uint8_t port_id,
 }
 
 /* Resume node */
-int rte_tm_node_resume(uint8_t port_id,
+int rte_tm_node_resume(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -286,7 +286,7 @@ int rte_tm_node_resume(uint8_t port_id,
 }
 
 /* Commit the initial port traffic manager hierarchy */
-int rte_tm_hierarchy_commit(uint8_t port_id,
+int rte_tm_hierarchy_commit(uint16_t port_id,
 	int clear_on_fail,
 	struct rte_tm_error *error)
 {
@@ -296,7 +296,7 @@ int rte_tm_hierarchy_commit(uint8_t port_id,
 }
 
 /* Update node parent  */
-int rte_tm_node_parent_update(uint8_t port_id,
+int rte_tm_node_parent_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -309,7 +309,7 @@ int rte_tm_node_parent_update(uint8_t port_id,
 }
 
 /* Update node private shaper */
-int rte_tm_node_shaper_update(uint8_t port_id,
+int rte_tm_node_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
@@ -320,7 +320,7 @@ int rte_tm_node_shaper_update(uint8_t port_id,
 }
 
 /* Update node shared shapers */
-int rte_tm_node_shared_shaper_update(uint8_t port_id,
+int rte_tm_node_shared_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_shaper_id,
 	int add,
@@ -332,7 +332,7 @@ int rte_tm_node_shared_shaper_update(uint8_t port_id,
 }
 
 /* Update node stats */
-int rte_tm_node_stats_update(uint8_t port_id,
+int rte_tm_node_stats_update(uint16_t port_id,
 	uint32_t node_id,
 	uint64_t stats_mask,
 	struct rte_tm_error *error)
@@ -343,7 +343,7 @@ int rte_tm_node_stats_update(uint8_t port_id,
 }
 
 /* Update WFQ weight mode */
-int rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
+int rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
 	uint32_t node_id,
 	int *wfq_weight_mode,
 	uint32_t n_sp_priorities,
@@ -355,7 +355,7 @@ int rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
 }
 
 /* Update node congestion management mode */
-int rte_tm_node_cman_update(uint8_t port_id,
+int rte_tm_node_cman_update(uint16_t port_id,
 	uint32_t node_id,
 	enum rte_tm_cman_mode cman,
 	struct rte_tm_error *error)
@@ -366,7 +366,7 @@ int rte_tm_node_cman_update(uint8_t port_id,
 }
 
 /* Update node private WRED context */
-int rte_tm_node_wred_context_update(uint8_t port_id,
+int rte_tm_node_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
@@ -377,7 +377,7 @@ int rte_tm_node_wred_context_update(uint8_t port_id,
 }
 
 /* Update node shared WRED context */
-int rte_tm_node_shared_wred_context_update(uint8_t port_id,
+int rte_tm_node_shared_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_wred_context_id,
 	int add,
@@ -389,7 +389,7 @@ int rte_tm_node_shared_wred_context_update(uint8_t port_id,
 }
 
 /* Read and/or clear stats counters for specific node */
-int rte_tm_node_stats_read(uint8_t port_id,
+int rte_tm_node_stats_read(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_stats *stats,
 	uint64_t *stats_mask,
@@ -402,7 +402,7 @@ int rte_tm_node_stats_read(uint8_t port_id,
 }
 
 /* Packet marking - VLAN DEI */
-int rte_tm_mark_vlan_dei(uint8_t port_id,
+int rte_tm_mark_vlan_dei(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -414,7 +414,7 @@ int rte_tm_mark_vlan_dei(uint8_t port_id,
 }
 
 /* Packet marking - IPv4/IPv6 ECN */
-int rte_tm_mark_ip_ecn(uint8_t port_id,
+int rte_tm_mark_ip_ecn(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -426,7 +426,7 @@ int rte_tm_mark_ip_ecn(uint8_t port_id,
 }
 
 /* Packet marking - IPv4/IPv6 DSCP */
-int rte_tm_mark_ip_dscp(uint8_t port_id,
+int rte_tm_mark_ip_dscp(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
diff --git a/lib/librte_ether/rte_tm.h b/lib/librte_ether/rte_tm.h
index ebbfa1eec..2b25a8715 100644
--- a/lib/librte_ether/rte_tm.h
+++ b/lib/librte_ether/rte_tm.h
@@ -1040,7 +1040,7 @@ struct rte_tm_error {
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
+rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
 	uint32_t *n_leaf_nodes,
 	struct rte_tm_error *error);
 
@@ -1064,7 +1064,7 @@ rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_node_type_get(uint8_t port_id,
+rte_tm_node_type_get(uint16_t port_id,
 	uint32_t node_id,
 	int *is_leaf,
 	struct rte_tm_error *error);
@@ -1082,7 +1082,7 @@ rte_tm_node_type_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_capabilities_get(uint8_t port_id,
+rte_tm_capabilities_get(uint16_t port_id,
 	struct rte_tm_capabilities *cap,
 	struct rte_tm_error *error);
 
@@ -1102,7 +1102,7 @@ rte_tm_capabilities_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_level_capabilities_get(uint8_t port_id,
+rte_tm_level_capabilities_get(uint16_t port_id,
 	uint32_t level_id,
 	struct rte_tm_level_capabilities *cap,
 	struct rte_tm_error *error);
@@ -1122,7 +1122,7 @@ rte_tm_level_capabilities_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_node_capabilities_get(uint8_t port_id,
+rte_tm_node_capabilities_get(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_capabilities *cap,
 	struct rte_tm_error *error);
@@ -1147,7 +1147,7 @@ rte_tm_node_capabilities_get(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_n_max
  */
 int
-rte_tm_wred_profile_add(uint8_t port_id,
+rte_tm_wred_profile_add(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_wred_params *profile,
 	struct rte_tm_error *error);
@@ -1170,7 +1170,7 @@ rte_tm_wred_profile_add(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_n_max
  */
 int
-rte_tm_wred_profile_delete(uint8_t port_id,
+rte_tm_wred_profile_delete(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
 
@@ -1201,7 +1201,7 @@ rte_tm_wred_profile_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_shared_wred_context_add_update(uint8_t port_id,
+rte_tm_shared_wred_context_add_update(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
@@ -1225,7 +1225,7 @@ rte_tm_shared_wred_context_add_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_shared_wred_context_delete(uint8_t port_id,
+rte_tm_shared_wred_context_delete(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	struct rte_tm_error *error);
 
@@ -1249,7 +1249,7 @@ rte_tm_shared_wred_context_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_n_max
  */
 int
-rte_tm_shaper_profile_add(uint8_t port_id,
+rte_tm_shaper_profile_add(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_shaper_params *profile,
 	struct rte_tm_error *error);
@@ -1272,7 +1272,7 @@ rte_tm_shaper_profile_add(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_n_max
  */
 int
-rte_tm_shaper_profile_delete(uint8_t port_id,
+rte_tm_shaper_profile_delete(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
 
@@ -1301,7 +1301,7 @@ rte_tm_shaper_profile_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_shared_shaper_add_update(uint8_t port_id,
+rte_tm_shared_shaper_add_update(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
@@ -1324,7 +1324,7 @@ rte_tm_shared_shaper_add_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_shared_shaper_delete(uint8_t port_id,
+rte_tm_shared_shaper_delete(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	struct rte_tm_error *error);
 
@@ -1392,7 +1392,7 @@ rte_tm_shared_shaper_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities
  */
 int
-rte_tm_node_add(uint8_t port_id,
+rte_tm_node_add(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -1425,7 +1425,7 @@ rte_tm_node_add(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_ADD_DELETE
  */
 int
-rte_tm_node_delete(uint8_t port_id,
+rte_tm_node_delete(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1449,7 +1449,7 @@ rte_tm_node_delete(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
  */
 int
-rte_tm_node_suspend(uint8_t port_id,
+rte_tm_node_suspend(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1472,7 +1472,7 @@ rte_tm_node_suspend(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
  */
 int
-rte_tm_node_resume(uint8_t port_id,
+rte_tm_node_resume(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1513,7 +1513,7 @@ rte_tm_node_resume(uint8_t port_id,
  * @see rte_tm_node_delete()
  */
 int
-rte_tm_hierarchy_commit(uint8_t port_id,
+rte_tm_hierarchy_commit(uint16_t port_id,
 	int clear_on_fail,
 	struct rte_tm_error *error);
 
@@ -1549,7 +1549,7 @@ rte_tm_hierarchy_commit(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL
  */
 int
-rte_tm_node_parent_update(uint8_t port_id,
+rte_tm_node_parent_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -1578,7 +1578,7 @@ rte_tm_node_parent_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_private_n_max
  */
 int
-rte_tm_node_shaper_update(uint8_t port_id,
+rte_tm_node_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
@@ -1605,7 +1605,7 @@ rte_tm_node_shaper_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_node_shared_shaper_update(uint8_t port_id,
+rte_tm_node_shared_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_shaper_id,
 	int add,
@@ -1632,7 +1632,7 @@ rte_tm_node_shared_shaper_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_STATS
  */
 int
-rte_tm_node_stats_update(uint8_t port_id,
+rte_tm_node_stats_update(uint16_t port_id,
 	uint32_t node_id,
 	uint64_t stats_mask,
 	struct rte_tm_error *error);
@@ -1660,7 +1660,7 @@ rte_tm_node_stats_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_N_SP_PRIORITIES
  */
 int
-rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
+rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
 	uint32_t node_id,
 	int *wfq_weight_mode,
 	uint32_t n_sp_priorities,
@@ -1683,7 +1683,7 @@ rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_CMAN
  */
 int
-rte_tm_node_cman_update(uint8_t port_id,
+rte_tm_node_cman_update(uint16_t port_id,
 	uint32_t node_id,
 	enum rte_tm_cman_mode cman,
 	struct rte_tm_error *error);
@@ -1707,7 +1707,7 @@ rte_tm_node_cman_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_private_n_max
 */
 int
-rte_tm_node_wred_context_update(uint8_t port_id,
+rte_tm_node_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
@@ -1732,7 +1732,7 @@ rte_tm_node_wred_context_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_node_shared_wred_context_update(uint8_t port_id,
+rte_tm_node_shared_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_wred_context_id,
 	int add,
@@ -1764,7 +1764,7 @@ rte_tm_node_shared_wred_context_update(uint8_t port_id,
  * @see enum rte_tm_stats_type
  */
 int
-rte_tm_node_stats_read(uint8_t port_id,
+rte_tm_node_stats_read(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_stats *stats,
 	uint64_t *stats_mask,
@@ -1801,7 +1801,7 @@ rte_tm_node_stats_read(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_vlan_dei_supported
  */
 int
-rte_tm_mark_vlan_dei(uint8_t port_id,
+rte_tm_mark_vlan_dei(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -1851,7 +1851,7 @@ rte_tm_mark_vlan_dei(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_ip_ecn_sctp_supported
  */
 int
-rte_tm_mark_ip_ecn(uint8_t port_id,
+rte_tm_mark_ip_ecn(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -1899,7 +1899,7 @@ rte_tm_mark_ip_ecn(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_ip_dscp_supported
  */
 int
-rte_tm_mark_ip_dscp(uint8_t port_id,
+rte_tm_mark_ip_dscp(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
diff --git a/lib/librte_ether/rte_tm_driver.h b/lib/librte_ether/rte_tm_driver.h
index a5b698fe0..b2e8ccf80 100644
--- a/lib/librte_ether/rte_tm_driver.h
+++ b/lib/librte_ether/rte_tm_driver.h
@@ -357,7 +357,7 @@ rte_tm_error_set(struct rte_tm_error *error,
  *   success, NULL otherwise.
  */
 const struct rte_tm_ops *
-rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error);
+rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 70f1ca8f6..43c115ddd 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,7 +38,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
-LIBABIVER := 2
+LIBABIVER := 3
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h
index 37deb4727..87812cd55 100644
--- a/lib/librte_kni/rte_kni.h
+++ b/lib/librte_kni/rte_kni.h
@@ -63,13 +63,13 @@ struct rte_mbuf;
  * Structure which has the function pointers for KNI interface.
  */
 struct rte_kni_ops {
-	uint8_t port_id; /* Port ID */
+	uint16_t port_id; /* Port ID */
 
 	/* Pointer to function of changing MTU */
-	int (*change_mtu)(uint8_t port_id, unsigned new_mtu);
+	int (*change_mtu)(uint16_t port_id, unsigned int new_mtu);
 
 	/* Pointer to function of configuring network interface */
-	int (*config_network_if)(uint8_t port_id, uint8_t if_up);
+	int (*config_network_if)(uint16_t port_id, uint8_t if_up);
 };
 
 /**
diff --git a/lib/librte_latencystats/rte_latencystats.c b/lib/librte_latencystats/rte_latencystats.c
index ce029a12c..d6ad13c4e 100644
--- a/lib/librte_latencystats/rte_latencystats.c
+++ b/lib/librte_latencystats/rte_latencystats.c
@@ -135,7 +135,7 @@ rte_latencystats_fill_values(struct rte_metric_value *values)
 }
 
 static uint16_t
-add_time_stamps(uint8_t pid __rte_unused,
+add_time_stamps(uint16_t pid __rte_unused,
 		uint16_t qid __rte_unused,
 		struct rte_mbuf **pkts,
 		uint16_t nb_pkts,
@@ -165,7 +165,7 @@ add_time_stamps(uint8_t pid __rte_unused,
 }
 
 static uint16_t
-calc_latency(uint8_t pid __rte_unused,
+calc_latency(uint16_t pid __rte_unused,
 		uint16_t qid __rte_unused,
 		struct rte_mbuf **pkts,
 		uint16_t nb_pkts,
@@ -226,10 +226,10 @@ rte_latencystats_init(uint64_t app_samp_intvl,
 		rte_latency_stats_flow_type_fn user_cb)
 {
 	unsigned int i;
-	uint8_t pid;
+	uint16_t pid;
 	uint16_t qid;
 	struct rxtx_cbs *cbs = NULL;
-	const uint8_t nb_ports = rte_eth_dev_count();
+	const uint16_t nb_ports = rte_eth_dev_count();
 	const char *ptr_strings[NUM_LATENCY_STATS] = {0};
 	const struct rte_memzone *mz = NULL;
 	const unsigned int flags = 0;
@@ -290,11 +290,11 @@ rte_latencystats_init(uint64_t app_samp_intvl,
 int
 rte_latencystats_uninit(void)
 {
-	uint8_t pid;
+	uint16_t pid;
 	uint16_t qid;
 	int ret = 0;
 	struct rxtx_cbs *cbs = NULL;
-	const uint8_t nb_ports = rte_eth_dev_count();
+	const uint16_t nb_ports = rte_eth_dev_count();
 
 	/** De register Rx/Tx callbacks */
 	for (pid = 0; pid < nb_ports; pid++) {
diff --git a/lib/librte_pdump/Makefile b/lib/librte_pdump/Makefile
index 1c03bcbb7..6b21c62e5 100644
--- a/lib/librte_pdump/Makefile
+++ b/lib/librte_pdump/Makefile
@@ -40,7 +40,7 @@ LDLIBS += -lpthread
 
 EXPORT_MAP := rte_pdump_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_PDUMP) := rte_pdump.c
diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c
index 729e79a36..e6182d35c 100644
--- a/lib/librte_pdump/rte_pdump.c
+++ b/lib/librte_pdump/rte_pdump.c
@@ -207,7 +207,7 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
 }
 
 static uint16_t
-pdump_rx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
+pdump_rx(uint16_t port __rte_unused, uint16_t qidx __rte_unused,
 	struct rte_mbuf **pkts, uint16_t nb_pkts,
 	uint16_t max_pkts __rte_unused,
 	void *user_params)
@@ -217,7 +217,7 @@ pdump_rx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
 }
 
 static uint16_t
-pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
+pdump_tx(uint16_t port __rte_unused, uint16_t qidx __rte_unused,
 		struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
 {
 	pdump_copy(pkts, nb_pkts, user_params);
@@ -225,7 +225,7 @@ pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
 }
 
 static int
-pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
+pdump_regitser_rx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
 				struct rte_ring *ring, struct rte_mempool *mp,
 				uint16_t operation)
 {
@@ -279,7 +279,7 @@ pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
 }
 
 static int
-pdump_regitser_tx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
+pdump_regitser_tx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
 				struct rte_ring *ring, struct rte_mempool *mp,
 				uint16_t operation)
 {
@@ -337,7 +337,7 @@ static int
 set_pdump_rxtx_cbs(struct pdump_request *p)
 {
 	uint16_t nb_rx_q = 0, nb_tx_q = 0, end_q, queue;
-	uint8_t port;
+	uint16_t port;
 	int ret = 0;
 	uint32_t flags;
 	uint16_t operation;
@@ -764,7 +764,7 @@ pdump_validate_flags(uint32_t flags)
 }
 
 static int
-pdump_validate_port(uint8_t port, char *name)
+pdump_validate_port(uint16_t port, char *name)
 {
 	int ret = 0;
 
@@ -828,7 +828,7 @@ pdump_prepare_client_request(char *device, uint16_t queue,
 }
 
 int
-rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
+rte_pdump_enable(uint16_t port, uint16_t queue, uint32_t flags,
 			struct rte_ring *ring,
 			struct rte_mempool *mp,
 			void *filter)
@@ -876,7 +876,7 @@ rte_pdump_enable_by_deviceid(char *device_id, uint16_t queue,
 }
 
 int
-rte_pdump_disable(uint8_t port, uint16_t queue, uint32_t flags)
+rte_pdump_disable(uint16_t port, uint16_t queue, uint32_t flags)
 {
 	int ret = 0;
 	char name[DEVICE_ID_SIZE];
diff --git a/lib/librte_pdump/rte_pdump.h b/lib/librte_pdump/rte_pdump.h
index ba6e39b09..4ec0a106f 100644
--- a/lib/librte_pdump/rte_pdump.h
+++ b/lib/librte_pdump/rte_pdump.h
@@ -113,7 +113,7 @@ rte_pdump_uninit(void);
  */
 
 int
-rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
+rte_pdump_enable(uint16_t port, uint16_t queue, uint32_t flags,
 		struct rte_ring *ring,
 		struct rte_mempool *mp,
 		void *filter);
@@ -136,7 +136,7 @@ rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
  */
 
 int
-rte_pdump_disable(uint8_t port, uint16_t queue, uint32_t flags);
+rte_pdump_disable(uint16_t port, uint16_t queue, uint32_t flags);
 
 /**
  * Enables packet capturing on given device id and queue.
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 76629a13a..c2b1b2ce4 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -44,7 +44,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
-LIBABIVER := 3
+LIBABIVER := 4
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_port/rte_port_ethdev.c b/lib/librte_port/rte_port_ethdev.c
index d5c5fba55..4ed10f276 100644
--- a/lib/librte_port/rte_port_ethdev.c
+++ b/lib/librte_port/rte_port_ethdev.c
@@ -60,7 +60,7 @@ struct rte_port_ethdev_reader {
 	struct rte_port_in_stats stats;
 
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
@@ -156,7 +156,7 @@ struct rte_port_ethdev_writer {
 	uint16_t tx_buf_count;
 	uint64_t bsz_mask;
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
@@ -337,7 +337,7 @@ struct rte_port_ethdev_writer_nodrop {
 	uint64_t bsz_mask;
 	uint64_t n_retries;
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
diff --git a/lib/librte_port/rte_port_ethdev.h b/lib/librte_port/rte_port_ethdev.h
index 201a79e41..f5ed9ab2d 100644
--- a/lib/librte_port/rte_port_ethdev.h
+++ b/lib/librte_port/rte_port_ethdev.h
@@ -54,7 +54,7 @@ extern "C" {
 /** ethdev_reader port parameters */
 struct rte_port_ethdev_reader_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
@@ -66,7 +66,7 @@ extern struct rte_port_in_ops rte_port_ethdev_reader_ops;
 /** ethdev_writer port parameters */
 struct rte_port_ethdev_writer_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
@@ -82,7 +82,7 @@ extern struct rte_port_out_ops rte_port_ethdev_writer_ops;
 /** ethdev_writer_nodrop port parameters */
 struct rte_port_ethdev_writer_nodrop_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
-- 
2.13.3

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v5 1/5] net/bonding: remove bonding APIs using ABI versioning
  2017-09-25  3:22  4%     ` [dpdk-dev] [PATCH v5 0/5] " Zhiyong Yang
@ 2017-09-25  3:22  7%       ` Zhiyong Yang
  2017-09-25 11:34  4%         ` Ferruh Yigit
  2017-09-25  3:22  1%       ` [dpdk-dev] [PATCH v5 2/5] ethdev: increase port_id range Zhiyong Yang
  2017-09-29  7:17  4%       ` [dpdk-dev] [PATCH v6 0/5] " Zhiyong Yang
  2 siblings, 1 reply; 200+ results
From: Zhiyong Yang @ 2017-09-25  3:22 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, thomas, adrien.mazarguil, Zhiyong Yang

There are two bonding APIs using ABI versioning, and both have
port_id as parameter. Since we are already breaking ABI, no need
to keep older versions of APIs.

Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
---
 drivers/net/bonding/rte_eth_bond_8023ad.c    | 149 +--------------------------
 drivers/net/bonding/rte_eth_bond_8023ad.h    |  18 ----
 drivers/net/bonding/rte_eth_bond_version.map |   4 -
 3 files changed, 2 insertions(+), 169 deletions(-)

diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index 20b5a8961..c2b9e053c 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -1111,27 +1111,6 @@ bond_mode_8023ad_conf_get(struct rte_eth_dev *dev,
 	conf->tx_period_ms = mode4->tx_period_timeout / ms_ticks;
 	conf->update_timeout_ms = mode4->update_timeout_us / 1000;
 	conf->rx_marker_period_ms = mode4->rx_marker_timeout / ms_ticks;
-}
-
-static void
-bond_mode_8023ad_conf_get_v1607(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	bond_mode_8023ad_conf_get(dev, conf);
-	conf->slowrx_cb = mode4->slowrx_cb;
-}
-
-static void
-bond_mode_8023ad_conf_get_v1708(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	bond_mode_8023ad_conf_get(dev, conf);
 	conf->slowrx_cb = mode4->slowrx_cb;
 	conf->agg_selection = mode4->agg_selection;
 }
@@ -1171,27 +1150,6 @@ bond_mode_8023ad_conf_assign(struct mode8023ad_private *mode4,
 	mode4->dedicated_queues.tx_qid = UINT16_MAX;
 }
 
-static void
-bond_mode_8023ad_setup_v20(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_bond_8023ad_conf def_conf;
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	if (conf == NULL) {
-		conf = &def_conf;
-		bond_mode_8023ad_conf_get_default(conf);
-	}
-
-	bond_mode_8023ad_stop(dev);
-	bond_mode_8023ad_conf_assign(mode4, conf);
-
-	if (dev->data->dev_started)
-		bond_mode_8023ad_start(dev);
-}
-
-
 void
 bond_mode_8023ad_setup(struct rte_eth_dev *dev,
 		struct rte_eth_bond_8023ad_conf *conf)
@@ -1207,27 +1165,6 @@ bond_mode_8023ad_setup(struct rte_eth_dev *dev,
 
 	bond_mode_8023ad_stop(dev);
 	bond_mode_8023ad_conf_assign(mode4, conf);
-
-
-	if (dev->data->dev_started)
-		bond_mode_8023ad_start(dev);
-}
-
-static void
-bond_mode_8023ad_setup_v1708(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_bond_8023ad_conf def_conf;
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	if (conf == NULL) {
-		conf = &def_conf;
-		bond_mode_8023ad_conf_get_default(conf);
-	}
-
-	bond_mode_8023ad_stop(dev);
-	bond_mode_8023ad_conf_assign(mode4, conf);
 	mode4->slowrx_cb = conf->slowrx_cb;
 	mode4->agg_selection = AGG_STABLE;
 
@@ -1358,7 +1295,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
 }
 
 int
-rte_eth_bond_8023ad_conf_get_v20(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1373,46 +1310,6 @@ rte_eth_bond_8023ad_conf_get_v20(uint8_t port_id,
 	bond_mode_8023ad_conf_get(bond_dev, conf);
 	return 0;
 }
-VERSION_SYMBOL(rte_eth_bond_8023ad_conf_get, _v20, 2.0);
-
-int
-rte_eth_bond_8023ad_conf_get_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-
-	if (valid_bonded_port_id(port_id) != 0)
-		return -EINVAL;
-
-	if (conf == NULL)
-		return -EINVAL;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_conf_get_v1607(bond_dev, conf);
-	return 0;
-}
-VERSION_SYMBOL(rte_eth_bond_8023ad_conf_get, _v1607, 16.07);
-
-int
-rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-
-	if (valid_bonded_port_id(port_id) != 0)
-		return -EINVAL;
-
-	if (conf == NULL)
-		return -EINVAL;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_conf_get_v1708(bond_dev, conf);
-	return 0;
-}
-MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_conf_get(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf),
-		rte_eth_bond_8023ad_conf_get_v1708);
-BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_conf_get, _v1708, 17.08);
 
 int
 rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
@@ -1483,25 +1380,7 @@ bond_8023ad_setup_validate(uint8_t port_id,
 }
 
 int
-rte_eth_bond_8023ad_setup_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-	int err;
-
-	err = bond_8023ad_setup_validate(port_id, conf);
-	if (err != 0)
-		return err;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_setup_v20(bond_dev, conf);
-
-	return 0;
-}
-VERSION_SYMBOL(rte_eth_bond_8023ad_setup, _v20, 2.0);
-
-int
-rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1516,30 +1395,6 @@ rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
 
 	return 0;
 }
-VERSION_SYMBOL(rte_eth_bond_8023ad_setup, _v1607, 16.07);
-
-
-int
-rte_eth_bond_8023ad_setup_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-	int err;
-
-	err = bond_8023ad_setup_validate(port_id, conf);
-	if (err != 0)
-		return err;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_setup_v1708(bond_dev, conf);
-
-	return 0;
-}
-BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_setup, _v1708, 17.08);
-MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf),
-		rte_eth_bond_8023ad_setup_v1708);
-
 
 
 
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h
index 1d353c734..d609745e0 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.h
@@ -194,15 +194,6 @@ struct rte_eth_bond_8023ad_slave_info {
 int
 rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
  * @internal
@@ -218,15 +209,6 @@ rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
 int
 rte_eth_bond_8023ad_setup(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
  * @internal
diff --git a/drivers/net/bonding/rte_eth_bond_version.map b/drivers/net/bonding/rte_eth_bond_version.map
index 0f4e847da..ec3374b0f 100644
--- a/drivers/net/bonding/rte_eth_bond_version.map
+++ b/drivers/net/bonding/rte_eth_bond_version.map
@@ -1,8 +1,6 @@
 DPDK_2.0 {
 	global:
 
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
 	rte_eth_bond_active_slaves_get;
 	rte_eth_bond_create;
 	rte_eth_bond_link_monitoring_set;
@@ -39,8 +37,6 @@ DPDK_16.07 {
 	rte_eth_bond_8023ad_ext_distrib;
 	rte_eth_bond_8023ad_ext_distrib_get;
 	rte_eth_bond_8023ad_ext_slowtx;
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
 
 } DPDK_16.04;
 
-- 
2.13.3

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v5 0/5] increase port_id range
  2017-09-21  8:32  4%   ` [dpdk-dev] [PATCH v4 0/5] " Zhiyong Yang
  2017-09-21  8:32  8%     ` [dpdk-dev] [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
  2017-09-21  8:32  1%     ` [dpdk-dev] [PATCH v4 2/5] ethdev: increase port_id range Zhiyong Yang
@ 2017-09-25  3:22  4%     ` Zhiyong Yang
  2017-09-25  3:22  7%       ` [dpdk-dev] [PATCH v5 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
                         ` (2 more replies)
  2 siblings, 3 replies; 200+ results
From: Zhiyong Yang @ 2017-09-25  3:22 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, thomas, adrien.mazarguil

port_id is currently defined as uint8_t, which is limited to the range
0 to 255. A larger range is required for vdev scalability.

It is necessary for a redefinition of port_id to extend it from
1 bytes to 2 bytes. All ethdev APIs and usages related to port_id will
be changed at the same time.

Discussion about port_id is the following thread.
http://www.dpdk.org/dev/patchwork/patch/23208/

Changes in V2:
1. cover more PMDs to increase port_id range.
2. cover more examples to increase port_id range.
3. add 17.11 release note.

Changes in V3:
1.  cover mlx4 and mlx5.
2.  add to increase port_id range in test code.
3.  The patch "librte_mbuf: modify port initialization value" is merged
    into the patchset.

Changes in V4:
1.  Add a patch to remove bonding APIs using ABI versioning according to
    Ferruh's comments.
2.  Unify to use typedef portid_t in testpmd code.
3.  update release note deprecation doc in 2/5
4.  fix some issues according to comments.

Changes in V5:
1.  For 1/5, bond_mode_8023ad_conf_get_v1708() and bond_mode_8023ad_conf_get()
    are merged into one function bond_mode_8023ad_conf_get.

Note: 3/5 and 4/5 patches' compilling depends on 2/5 patch since 2/5 patch
breaks lib/PMD API/ABI.

Zhiyong Yang (5):
  net/bonding: remove bonding APIs using ABI versioning
  ethdev: increase port_id range
  examples: increase port_id range
  test: increase port_id range
  librte_mbuf: modify port initialization value

 app/pdump/main.c                                   |   2 +-
 app/test-pmd/cmdline.c                             |   6 +-
 app/test-pmd/config.c                              |   4 +-
 app/test-pmd/ieee1588fwd.c                         |  26 +--
 app/test-pmd/parameters.c                          |   2 +-
 app/test-pmd/rxonly.c                              |   2 +-
 app/test-pmd/testpmd.c                             |  18 +-
 app/test-pmd/testpmd.h                             |   4 +-
 doc/guides/rel_notes/deprecation.rst               |   6 -
 doc/guides/rel_notes/release_17_11.rst             |  18 +-
 drivers/net/af_packet/Makefile                     |   2 +-
 drivers/net/af_packet/rte_eth_af_packet.c          |   2 +-
 drivers/net/ark/ark_ethdev.c                       |   2 +-
 drivers/net/avp/Makefile                           |   2 +-
 drivers/net/avp/avp_ethdev.c                       |   2 +-
 drivers/net/bnx2x/Makefile                         |   2 +-
 drivers/net/bnx2x/bnx2x_rxtx.h                     |   4 +-
 drivers/net/bnxt/Makefile                          |   2 +-
 drivers/net/bnxt/bnxt.h                            |   2 +-
 drivers/net/bnxt/bnxt_ethdev.c                     |   4 +-
 drivers/net/bnxt/bnxt_rxq.h                        |   2 +-
 drivers/net/bnxt/bnxt_txq.h                        |   2 +-
 drivers/net/bnxt/rte_pmd_bnxt.c                    |  32 +--
 drivers/net/bnxt/rte_pmd_bnxt.h                    |  32 +--
 drivers/net/bonding/Makefile                       |   2 +-
 drivers/net/bonding/rte_eth_bond.h                 |  41 ++--
 drivers/net/bonding/rte_eth_bond_8023ad.c          | 203 +++--------------
 drivers/net/bonding/rte_eth_bond_8023ad.h          |  48 ++--
 drivers/net/bonding/rte_eth_bond_8023ad_private.h  |  12 +-
 drivers/net/bonding/rte_eth_bond_alb.c             |   6 +-
 drivers/net/bonding/rte_eth_bond_alb.h             |   6 +-
 drivers/net/bonding/rte_eth_bond_api.c             |  64 +++---
 drivers/net/bonding/rte_eth_bond_args.c            |   2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c             |  62 +++---
 drivers/net/bonding/rte_eth_bond_private.h         |  45 ++--
 drivers/net/bonding/rte_eth_bond_version.map       |   4 -
 drivers/net/e1000/Makefile                         |   2 +-
 drivers/net/e1000/em_ethdev.c                      |   2 +-
 drivers/net/e1000/em_rxtx.c                        |   4 +-
 drivers/net/e1000/igb_rxtx.c                       |   4 +-
 drivers/net/failsafe/Makefile                      |   2 +-
 drivers/net/failsafe/failsafe_ether.c              |   4 +-
 drivers/net/failsafe/failsafe_private.h            |   4 +-
 drivers/net/fm10k/Makefile                         |   2 +-
 drivers/net/fm10k/fm10k.h                          |   6 +-
 drivers/net/i40e/Makefile                          |   2 +-
 drivers/net/i40e/i40e_ethdev.c                     |   5 +-
 drivers/net/i40e/i40e_rxtx.h                       |   4 +-
 drivers/net/i40e/rte_pmd_i40e.c                    |  50 ++---
 drivers/net/i40e/rte_pmd_i40e.h                    |  48 ++--
 drivers/net/ixgbe/Makefile                         |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c                   |   5 +-
 drivers/net/ixgbe/ixgbe_rxtx.h                     |   4 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c                  |  60 ++---
 drivers/net/ixgbe/rte_pmd_ixgbe.h                  |  64 +++---
 drivers/net/mlx5/mlx5_rxtx.h                       |   4 +-
 drivers/net/nfp/nfp_net.c                          |  16 +-
 drivers/net/nfp/nfp_net_pmd.h                      |   2 +-
 drivers/net/null/Makefile                          |   2 +-
 drivers/net/null/rte_eth_null.c                    |   2 +-
 drivers/net/pcap/Makefile                          |   2 +-
 drivers/net/pcap/rte_eth_pcap.c                    |   2 +-
 drivers/net/qede/qede_if.h                         |   2 +-
 drivers/net/ring/rte_eth_ring.c                    |   2 +-
 drivers/net/szedata2/rte_eth_szedata2.c            |   2 +-
 drivers/net/thunderx/nicvf_struct.h                |   2 +-
 drivers/net/vhost/Makefile                         |   2 +-
 drivers/net/vhost/rte_eth_vhost.c                  |   6 +-
 drivers/net/vhost/rte_eth_vhost.h                  |   4 +-
 drivers/net/virtio/Makefile                        |   2 +-
 drivers/net/virtio/virtio_pci.h                    |   2 +-
 drivers/net/virtio/virtio_rxtx.h                   |   6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h                 |   4 +-
 examples/bond/main.c                               |  16 +-
 examples/distributor/main.c                        |  26 +--
 examples/exception_path/main.c                     |  35 ++-
 examples/ip_fragmentation/main.c                   |  33 +--
 examples/ip_pipeline/init.c                        |   4 +-
 examples/ip_reassembly/main.c                      |  34 +--
 examples/ipv4_multicast/main.c                     |  30 +--
 examples/kni/main.c                                |  30 +--
 examples/l2fwd-cat/l2fwd-cat.c                     |  12 +-
 examples/l2fwd-jobstats/main.c                     |  34 +--
 examples/l2fwd-keepalive/main.c                    |  50 ++---
 examples/l2fwd/main.c                              |  47 ++--
 examples/l3fwd-acl/main.c                          |   9 +-
 examples/l3fwd-power/main.c                        |  60 ++---
 examples/l3fwd-vf/main.c                           |  50 +++--
 examples/l3fwd/l3fwd.h                             |  10 +-
 examples/l3fwd/l3fwd_common.h                      |   2 +-
 examples/l3fwd/l3fwd_em.c                          |   2 +-
 examples/l3fwd/l3fwd_em.h                          |   6 +-
 examples/l3fwd/l3fwd_em_hlm.h                      |  14 +-
 examples/l3fwd/l3fwd_lpm.c                         |  15 +-
 examples/l3fwd/l3fwd_lpm.h                         |   4 +-
 examples/l3fwd/l3fwd_lpm_neon.h                    |   4 +-
 examples/l3fwd/l3fwd_lpm_sse.h                     |   4 +-
 examples/l3fwd/main.c                              |  30 +--
 examples/link_status_interrupt/main.c              |   9 +-
 examples/load_balancer/config.c                    |  14 +-
 examples/load_balancer/init.c                      |  34 ++-
 examples/load_balancer/main.h                      |  11 +-
 examples/load_balancer/runtime.c                   |  12 +-
 .../client_server_mp/mp_client/client.c            |  17 +-
 .../client_server_mp/mp_server/args.c              |   4 +-
 .../client_server_mp/mp_server/args.h              |   2 +-
 .../client_server_mp/mp_server/init.c              |  11 +-
 .../client_server_mp/mp_server/main.c              |   2 +-
 .../multi_process/client_server_mp/shared/common.h |   4 +-
 examples/multi_process/l2fwd_fork/main.c           |  23 +-
 examples/netmap_compat/lib/compat_netmap.c         |  52 +++--
 examples/netmap_compat/lib/compat_netmap.h         |   2 +-
 examples/packet_ordering/main.c                    |  19 +-
 examples/performance-thread/l3fwd-thread/main.c    | 143 ++++++------
 examples/ptpclient/ptpclient.c                     |   4 +-
 examples/qos_sched/args.c                          |  12 +-
 examples/qos_sched/init.c                          |  31 +--
 examples/qos_sched/main.c                          |  14 +-
 examples/qos_sched/main.h                          |  24 +-
 examples/qos_sched/stats.c                         |  16 +-
 examples/quota_watermark/qw/init.c                 |   4 +-
 examples/quota_watermark/qw/main.c                 |  10 +-
 examples/rxtx_callbacks/main.c                     |   8 +-
 examples/server_node_efd/server/main.c             |   2 +-
 examples/server_node_efd/shared/common.h           |   4 +-
 examples/skeleton/basicfwd.c                       |  12 +-
 examples/vhost/main.c                              |  10 +-
 lib/librte_bitratestats/Makefile                   |   2 +-
 lib/librte_bitratestats/rte_bitrate.c              |   2 +-
 lib/librte_bitratestats/rte_bitrate.h              |   2 +-
 lib/librte_ether/Makefile                          |   2 +-
 lib/librte_ether/rte_ethdev.c                      | 241 +++++++++++----------
 lib/librte_ether/rte_ethdev.h                      | 238 ++++++++++----------
 lib/librte_ether/rte_flow.c                        |   2 +-
 lib/librte_ether/rte_flow_driver.h                 |   2 +-
 lib/librte_ether/rte_tm.c                          |  62 +++---
 lib/librte_ether/rte_tm.h                          |  60 ++---
 lib/librte_ether/rte_tm_driver.h                   |   2 +-
 lib/librte_kni/Makefile                            |   2 +-
 lib/librte_kni/rte_kni.h                           |   6 +-
 lib/librte_latencystats/rte_latencystats.c         |  12 +-
 lib/librte_mbuf/rte_mbuf.c                         |   2 +-
 lib/librte_mbuf/rte_mbuf.h                         |   4 +-
 lib/librte_pdump/Makefile                          |   2 +-
 lib/librte_pdump/rte_pdump.c                       |  16 +-
 lib/librte_pdump/rte_pdump.h                       |   4 +-
 lib/librte_port/Makefile                           |   2 +-
 lib/librte_port/rte_port_ethdev.c                  |   6 +-
 lib/librte_port/rte_port_ethdev.h                  |   6 +-
 test/test/test_kni.c                               |  12 +-
 test/test/test_link_bonding.c                      |  40 ++--
 test/test/test_link_bonding_mode4.c                |  12 +-
 test/test/test_pmd_perf.c                          |  30 +--
 test/test/test_pmd_ring_perf.c                     |   2 +-
 test/test/virtual_pmd.c                            |  24 +-
 test/test/virtual_pmd.h                            |  28 +--
 156 files changed, 1402 insertions(+), 1507 deletions(-)

-- 
2.13.3

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [pull-request] next-net 17.11 PRE-RC1
@ 2017-09-22 18:09  1% Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-09-22 18:09 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit

The following changes since commit 5dce9fcdb2308becb7de7470118af3eeccfe4fd7:

  ethdev: support vtune task tracing (2017-09-22 19:01:32 +0200)

are available in the git repository at:

  http://dpdk.org/git/next/dpdk-next-net 

for you to fetch changes up to 0d16c17ae7a4cd97e141e7b30f7d8647b85b01ed:

  net/af_packet: make qdisc bypass configurable (2017-09-22 18:58:44 +0100)

----------------------------------------------------------------
Adrien Mazarguil (54):
      net/mlx4: add consistency to copyright notices
      net/mlx4: remove limitation on number of instances
      net/mlx4: check max number of ports dynamically
      net/mlx4: remove useless compilation checks
      net/mlx4: remove secondary process support
      net/mlx4: remove useless code
      net/mlx4: remove soft counters compilation option
      net/mlx4: remove scatter mode compilation option
      net/mlx4: remove Tx inline compilation option
      net/mlx4: remove allmulti and promisc support
      net/mlx4: remove VLAN filter support
      net/mlx4: remove MAC address configuration support
      net/mlx4: drop MAC flows affecting all Rx queues
      net/mlx4: revert flow API RSS support
      net/mlx4: revert RSS parent queue refactoring
      net/mlx4: drop RSS support
      net/mlx4: drop checksum offloads support
      net/mlx4: drop packet type recognition support
      net/mlx4: drop scatter/gather support
      net/mlx4: drop inline receive support
      net/mlx4: use standard QP attributes
      net/mlx4: revert resource domain support
      net/mlx4: revert multicast echo prevention
      net/mlx4: revert fast Verbs interface for Tx
      net/mlx4: revert fast Verbs interface for Rx
      net/mlx4: simplify Rx buffer handling
      net/mlx4: simplify link update function
      net/mlx4: standardize on negative errno values
      net/mlx4: clean up coding style inconsistencies
      net/mlx4: remove control path locks
      net/mlx4: remove unnecessary wrapper functions
      net/mlx4: remove mbuf macro definitions
      net/mlx4: use standard macro to get array size
      net/mlx4: separate debugging macros
      net/mlx4: use a single interrupt handle
      net/mlx4: rename alarm field
      net/mlx4: refactor interrupt FD settings
      net/mlx4: clean up interrupt functions prototypes
      net/mlx4: compact interrupt functions
      net/mlx4: separate interrupt handling
      net/mlx4: separate Rx/Tx definitions
      net/mlx4: separate Rx/Tx functions
      net/mlx4: separate device control functions
      net/mlx4: separate Tx configuration functions
      net/mlx4: separate Rx configuration functions
      net/mlx4: group flow API handlers in common file
      net/mlx4: rename private functions in flow API
      net/mlx4: separate memory management functions
      net/mlx4: clean up includes and comments
      net/mlx4: remove isolated mode constraint
      net/mlx4: rely on ethdev for Tx/Rx queue arrays
      net/mlx4: fix unhandled event debug message
      net/mlx4: fix rescheduled link status check
      net/mlx4: merge interrupt collector function

Alejandro Lucero (28):
      net/nfp: write MAC address to configuration bar
      net/nfp: fix RSS
      net/nfp: fix Rx interrupt when multiqueue
      net/nfp: handle packets with length 0 as usual ones
      net/nfp: support new firmware medatada API
      net/nfp: add NSP user space interface
      net/nfp: add specific PF probe function
      net/nfp: add support for new PCI id
      net/nfp: add NSP support for commands
      net/nfp: add NSP FW upload command
      net/nfp: add NSP symbol resolution command
      net/nfp: add FW upload logic
      net/nfp: add support for vnic config bar mapping
      net/nfp: add support for vNIC Rx/Tx bar mappings
      net/nfp: support PF devices inside PMD initialization
      net/nfp: allocate ethernet device from PF probe function
      net/nfp: support PF multiport
      net/nfp: add NSP support for HW link configuration
      net/nfp: add support for HW port link configuration
      net/nfp: read PF port MAC addr using NSP
      doc: update NFP with PF support information
      doc: update release notes with NFP PF support
      doc: create different features files for NFP drivers
      net/nfp: add info about RSS capabilities
      net/nfp: remove firmware ABI check
      net/nfp: configure L2 broadcast and multicast
      net/nfp: configure capabilities by default
      net/nfp: write PF MAC to config BAR

Andrew Rybchenko (2):
      net/sfc/base: provide information about supported tunnels
      net/sfc: use RSS key size define from base driver

Beilei Xing (4):
      net/i40e: remove virtual channel command for VLAN pvid
      net/i40e: remove virtual channel command for VSI queue
      net/i40e: remove DPDK PF version specific code
      net/i40e: fix VF device stop issue

Bruce Richardson (1):
      net/bonding: rename map file to standard name

Chas Williams (1):
      net/af_packet: make qdisc bypass configurable

Congwen Zhang (1):
      net/cxgbe: fix memory leak

Daniel Mrzyglod (1):
      net/i40e: fix return code not checked

David Harton (4):
      net/vmxnet3: replenish ring buffers in Rx processing
      net/vmxnet3: fix MAC address set
      net/i40e: fix i40evf MAC filter table
      net/ixgbe: eliminate duplicate filterlist symbols

Ferruh Yigit (1):
      net/ark: remove empty header file

Gaetan Rivet (2):
      net/failsafe: safer subdev iterator
      net/failsafe: fix errno set on command execution

Ivan Malov (8):
      net/sfc: specify correct scale table size on Rx start
      net/sfc: add support for Rx descriptor status API
      net/sfc: add support for Tx descriptor status API
      net/sfc: fix unused variable warnings in RSS-agnostic build
      net/sfc/base: add RSS key size define
      net/sfc: add support for the flow API RSS action
      net/sfc: free mbufs in bulks on EF10 native Tx datapath reap
      net/sfc: free mbufs in bulks on simple EF10 Tx datapath reap

Jerin Jacob (1):
      net/thunderx: add device speed capability info

Jingjing Wu (5):
      net/i40e: fix interrupt throttling setting in PF
      net/i40e: remove unused and incorrect definition
      net/i40e: fix memory leak if VF init fails
      net/i40e/base: fix bool definition
      net/i40e: fix variable assignment

John Daley (1):
      net/enic: fix multi-process operation

Mark Spender (10):
      net/sfc/base: use proper MCDI command for encap filters
      net/sfc/base: support filters for encapsulated packets
      net/sfc/base: insert filters for encapsulated packets
      net/sfc/base: define a handle to denote default RSS context
      net/sfc/base: fix default RSS context check on Siena
      net/sfc/base: add the max number of RSS exclusive contexts
      net/sfc/base: rename API to check Rx scale and hash support
      net/sfc/base: add API to allocate and free RSS contexts
      net/sfc/base: update RSS API to take RSS context parameter
      net/sfc/base: add API to set an RSS context for a filter

Matan Azrad (8):
      net/failsafe: fix Tx sub device deactivating
      net/mlx5: fix locking in xstats functions
      net/failsafe: fix parameters parsing
      net/mlx5: fix probe failure report
      net/failsafe: fix adding MAC error report miss
      net/mlx5: link status update separation
      net/mlx5: support device removal event
      net/failsafe: stat support enhancement

Nélio Laranjeiro (10):
      net/mlx5: avoid reusing old queue's mbuf on reconfigure
      net/mlx5: prepare vector Rx ring at setup time
      net/mlx5: cleanup Rx ring in free functions
      net/mlx5: remove flow drop useless if branches
      net/mlx5: remove pedantic pragma
      net/mlx5: fix non working secondary process by removing it
      net/mlx5: remove multiple drop RSS queues
      net/mlx5: remove old MLNX OFED 3.3 verification
      net/mlx5: fix clang build
      net/mlx5: improve stack usage during link update

Ophir Munk (1):
      net/tap: fix flow and port commands

Qi Zhang (2):
      net/i40e: fix flow control watermark mismatch
      net/i40e: fix packet count for PF

Qiming Yang (1):
      doc: add i40e firmware upgrade guide

Rasesh Mody (53):
      net/qede/base: add NVM config options
      net/qede/base: update management FW supported features
      net/qede/base: use crc32 OSAL macro
      net/qede/base: allocate VF queues before PF
      net/qede/base: convert device type to enum
      net/qede/base: changes for VF queue zone
      net/qede/base: interchangeably use SB between PF and VF
      net/qede/base: add API to configure coalescing for VF queues
      net/qede/base: restrict cache line size register padding
      net/qede/base: fix to use a passed ptt handle
      net/qede/base: add a sanity check
      net/qede/base: add SmartAN support
      net/qede/base: alter driver's force load behavior
      net/qede/base: add mdump sub-commands
      net/qede/base: add EEE support
      net/qede/base: use passed ptt handler
      net/qede/base: prevent re-assertions of parity errors
      net/qede/base: avoid possible race condition
      net/qede/base: revise management FW mbox access scheme
      net/qede/base: remove helper functions/structures
      net/qede/base: initialize resc lock/unlock params
      net/qede/base: rename MFW get/set field defines
      net/qede/base: allow clients to override VF MSI-X table size
      net/qede/base: add API to send STAG config update to FW
      net/qede/base: add support for doorbell overflow recovery
      net/qede/base: block mbox command to unresponsive MFW
      net/qede/base: prevent stop vport assert by malicious VF
      net/qede/base: remove unused parameters
      net/qede/base: fix macros to check chip revision/metal
      net/qede/base: read per queue coalescing from HW
      net/qede/base: refactor device's number of ports logic
      net/qede/base: use proper units for rate limiting
      net/qede/base: use available macro
      net/qede/base: use function pointers for spq async callback
      net/qede/base: fix API return types
      net/qede/base: semantic changes
      net/qede/base: handle the error condition properly
      net/qede/base: add new macro for CMT mode
      net/qede/base: change verbosity
      net/qede/base: fix number of app table entries
      net/qede/base: update firmware to 8.30.12.0
      net/qede/base: add UFP support
      net/qede/base: add support for mapped doorbell Bars for VFs
      net/qede/base: add support for driver attribute repository
      net/qede/base: move define to header file
      net/qede/base: dcbx dscp related extensions
      net/qede/base: add feature support for per-PF virtual link
      net/qede/base: catch an init command write failure
      net/qede/base: retain dcbx config till actually applied
      net/qede/base: disable aRFS for NPAR and 100G
      net/qede/base: add support for WoL writes
      net/qede/base: remove unused input parameter
      net/qede/base: update PMD version to 2.6.0.1

Raslan Darawsheh (1):
      net/failsafe: fix failsafe bus uninit return value

RongQiang Xie (3):
      net/ixgbe: check memory allocation result
      net/enic: fix possible null pointer dereference
      net/qede: fix possible null pointer dereference

Sebastian Basierski (1):
      net/vmxnet3: fix unintentional integer overflow

Shachar Beiser (1):
      net/mlx5: replace network to host macros

Shahaf Shuler (8):
      net/mlx5: extend debug logs verbosity
      net/mlx5: replace memory barrier type
      net/mlx5: don't map doorbell register to write combining
      net/mlx5: fix num seg assumption on vPMD
      net/mlx5: fix Tx stats error counter definition
      net/mlx5: fix Tx stats error counter logic
      net/mlx5: enforce Tx num of segments limitation
      net/mlx5: fix TSO segment size verification

Shijith Thotton (2):
      net/liquidio: remove FLR request to PF driver
      net/liquidio: add API to set MTU

Stephen Hemminger (6):
      app/testpmd: remove unnecessary void casts
      net/bnx2x: remove unnecessary void casts
      net/sfc: remove unnecessary void casts
      net/igb: remove unnecessary void casts
      net/i40e: remove unnecessary void casts
      net/ixgbe: remove unnecessary void casts

Tomasz Kulasek (1):
      net/bonding: fix slaves capacity check

Vipin Varghese (1):
      net/tap: fix unregistering callback with invalid fd

Wei Dai (3):
      net/ixgbe: add VLAN info in queue info msg to VF
      net/ixgbe: fix mapping of user priority to TC
      net/ixgbe: fix adding a mirror rule

Wei Zhao (5):
      net/ixgbe: fix MAC VLAN filter fail problem
      net/i40e: fix clear xstats bug in VF
      app/testpmd: fix packet throughput after stats reset
      net/i40e: support reset stats in VF
      net/i40e: refactor some stats related functions

Wenfeng Liu (1):
      net/af_packet: support Tx scattered mbuf input

Wenzhuo Lu (2):
      net/i40e: new API to add VF MAC address from PF
      app/testpmd: fix wrong API of adding VF MAC

Xiaoyun Li (1):
      net/i40e: fix PF notify issue when VF is not up

Xueming Li (1):
      net/mlx5: fix tunnel offload detection

Yong Wang (3):
      doc/failsafe: fix typos
      net/liquidio: fix uninitialized variable
      net/igb: fix memcpy length

Yongseok Koh (1):
      net/mlx5: fix calculating TSO inline size

Zhiyong Yang (1):
      test: fix assignment operation

 app/test-pmd/cmdline.c                             |   33 +-
 app/test-pmd/config.c                              |   10 +-
 app/test-pmd/testpmd.c                             |    2 +-
 config/common_base                                 |    3 -
 doc/guides/nics/ark.rst                            |    3 -
 doc/guides/nics/fail_safe.rst                      |    4 +-
 doc/guides/nics/features/enic.ini                  |    1 +
 doc/guides/nics/features/liquidio.ini              |    1 +
 doc/guides/nics/features/mlx4.ini                  |   13 -
 doc/guides/nics/features/mlx5.ini                  |    2 +-
 doc/guides/nics/features/{nfp.ini => nfp_pf.ini}   |    1 -
 doc/guides/nics/features/nfp_vf.ini                |   28 +
 doc/guides/nics/features/sfc_efx.ini               |    2 +
 doc/guides/nics/features/thunderx.ini              |    1 +
 doc/guides/nics/i40e.rst                           |    2 +
 doc/guides/nics/mlx4.rst                           |   37 +-
 doc/guides/nics/mlx5.rst                           |    4 +
 doc/guides/nics/nfp.rst                            |   78 +-
 doc/guides/nics/sfc_efx.rst                        |    8 +-
 doc/guides/rel_notes/release_17_11.rst             |   10 +
 drivers/net/af_packet/rte_eth_af_packet.c          |   39 +-
 drivers/net/ark/ark_ethdev.c                       |    1 -
 drivers/net/ark/ark_ethdev.h                       |   37 -
 drivers/net/ark/ark_ethdev_rx.c                    |    1 -
 drivers/net/ark/ark_ethdev_tx.c                    |    1 -
 drivers/net/bnx2x/bnx2x.c                          |    6 +-
 drivers/net/bnx2x/bnx2x.h                          |    4 +-
 drivers/net/bnx2x/ecore_sp.h                       |    2 +-
 drivers/net/bonding/Makefile                       |    2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c             |   25 +-
 ...h_bond_version.map => rte_pmd_bond_version.map} |    0
 drivers/net/cxgbe/base/t4_hw.c                     |    3 +
 drivers/net/e1000/igb_ethdev.c                     |    2 +-
 drivers/net/e1000/igb_flow.c                       |    8 +-
 drivers/net/enic/base/vnic_dev.c                   |   10 +-
 drivers/net/enic/enic_ethdev.c                     |   43 +
 drivers/net/enic/enic_main.c                       |    8 +
 drivers/net/failsafe/failsafe_args.c               |   32 +-
 drivers/net/failsafe/failsafe_eal.c                |   19 +-
 drivers/net/failsafe/failsafe_ether.c              |   36 +-
 drivers/net/failsafe/failsafe_ops.c                |   16 +-
 drivers/net/failsafe/failsafe_private.h            |   46 +-
 drivers/net/i40e/base/i40e_osdep.h                 |    3 +-
 drivers/net/i40e/i40e_ethdev.c                     |  110 +-
 drivers/net/i40e/i40e_ethdev.h                     |    4 +-
 drivers/net/i40e/i40e_ethdev_vf.c                  |  313 +-
 drivers/net/i40e/i40e_fdir.c                       |    2 +-
 drivers/net/i40e/i40e_pf.c                         |  129 +-
 drivers/net/i40e/i40e_pf.h                         |   60 -
 drivers/net/i40e/i40e_rxtx.c                       |   84 +-
 drivers/net/i40e/i40e_tm.c                         |    6 +-
 drivers/net/i40e/rte_pmd_i40e.c                    |   64 +-
 drivers/net/i40e/rte_pmd_i40e.h                    |   20 +
 drivers/net/i40e/rte_pmd_i40e_version.map          |    7 +
 drivers/net/ixgbe/ixgbe_ethdev.c                   |   16 +-
 drivers/net/ixgbe/ixgbe_ethdev.h                   |   44 +-
 drivers/net/ixgbe/ixgbe_fdir.c                     |    5 +-
 drivers/net/ixgbe/ixgbe_flow.c                     |   96 +-
 drivers/net/ixgbe/ixgbe_pf.c                       |   61 +-
 drivers/net/ixgbe/ixgbe_rxtx.c                     |   41 +-
 drivers/net/ixgbe/ixgbe_tm.c                       |    6 +-
 drivers/net/liquidio/base/lio_23xx_vf.c            |   19 -
 drivers/net/liquidio/base/lio_23xx_vf.h            |    2 -
 drivers/net/liquidio/base/lio_hw_defs.h            |    1 +
 drivers/net/liquidio/base/lio_mbox.h               |    1 -
 drivers/net/liquidio/lio_ethdev.c                  |   97 +-
 drivers/net/mlx4/Makefile                          |   41 +-
 drivers/net/mlx4/mlx4.c                            | 6354 +-------------------
 drivers/net/mlx4/mlx4.h                            |  333 +-
 drivers/net/mlx4/mlx4_ethdev.c                     |  788 +++
 drivers/net/mlx4/mlx4_flow.c                       |  491 +-
 drivers/net/mlx4/mlx4_flow.h                       |   51 +-
 drivers/net/mlx4/mlx4_intr.c                       |  367 ++
 drivers/net/mlx4/mlx4_mr.c                         |  183 +
 drivers/net/mlx4/mlx4_rxq.c                        |  579 ++
 drivers/net/mlx4/mlx4_rxtx.c                       |  524 ++
 drivers/net/mlx4/mlx4_rxtx.h                       |  154 +
 drivers/net/mlx4/mlx4_txq.c                        |  472 ++
 drivers/net/mlx4/mlx4_utils.c                      |   66 +
 drivers/net/mlx4/mlx4_utils.h                      |  111 +
 drivers/net/mlx5/Makefile                          |    5 -
 drivers/net/mlx5/mlx5.c                            |   54 +-
 drivers/net/mlx5/mlx5.h                            |   21 -
 drivers/net/mlx5/mlx5_defs.h                       |    3 +-
 drivers/net/mlx5/mlx5_ethdev.c                     |  301 +-
 drivers/net/mlx5/mlx5_fdir.c                       |    7 -
 drivers/net/mlx5/mlx5_flow.c                       |   59 +-
 drivers/net/mlx5/mlx5_mac.c                        |   15 +-
 drivers/net/mlx5/mlx5_mr.c                         |    9 +-
 drivers/net/mlx5/mlx5_prm.h                        |    6 +-
 drivers/net/mlx5/mlx5_rss.c                        |    7 -
 drivers/net/mlx5/mlx5_rxmode.c                     |   15 +-
 drivers/net/mlx5/mlx5_rxq.c                        |  175 +-
 drivers/net/mlx5/mlx5_rxtx.c                       |  192 +-
 drivers/net/mlx5/mlx5_rxtx.h                       |   47 +-
 drivers/net/mlx5/mlx5_rxtx_vec_sse.c               |   68 +-
 drivers/net/mlx5/mlx5_stats.c                      |   18 +-
 drivers/net/mlx5/mlx5_trigger.c                    |    7 -
 drivers/net/mlx5/mlx5_txq.c                        |   72 +-
 drivers/net/mlx5/mlx5_vlan.c                       |    7 -
 drivers/net/nfp/Makefile                           |    2 +
 drivers/net/nfp/nfp_net.c                          |  542 +-
 drivers/net/nfp/nfp_net_ctrl.h                     |   10 +
 drivers/net/nfp/nfp_net_eth.h                      |   82 +
 drivers/net/nfp/nfp_net_pmd.h                      |   13 +
 drivers/net/nfp/nfp_nfpu.c                         |  103 +
 drivers/net/nfp/nfp_nfpu.h                         |   55 +
 drivers/net/nfp/nfp_nspu.c                         |  623 ++
 drivers/net/nfp/nfp_nspu.h                         |   83 +
 drivers/net/qede/base/bcm_osal.c                   |   12 +
 drivers/net/qede/base/bcm_osal.h                   |   20 +-
 drivers/net/qede/base/common_hsi.h                 |  760 +--
 drivers/net/qede/base/ecore.h                      |  210 +-
 drivers/net/qede/base/ecore_cxt.c                  |  111 +-
 drivers/net/qede/base/ecore_cxt.h                  |    6 +-
 drivers/net/qede/base/ecore_dcbx.c                 |  328 +-
 drivers/net/qede/base/ecore_dcbx.h                 |    9 +-
 drivers/net/qede/base/ecore_dev.c                  | 1066 +++-
 drivers/net/qede/base/ecore_dev_api.h              |  113 +-
 drivers/net/qede/base/ecore_hsi_common.h           |  245 +-
 drivers/net/qede/base/ecore_hsi_debug_tools.h      |    6 +-
 drivers/net/qede/base/ecore_hsi_eth.h              |   65 +-
 drivers/net/qede/base/ecore_hw.c                   |   10 +-
 drivers/net/qede/base/ecore_hw.h                   |   15 +-
 drivers/net/qede/base/ecore_init_fw_funcs.c        |  511 +-
 drivers/net/qede/base/ecore_init_fw_funcs.h        |   98 +-
 drivers/net/qede/base/ecore_init_ops.c             |   73 +-
 drivers/net/qede/base/ecore_init_ops.h             |    3 +-
 drivers/net/qede/base/ecore_int.c                  | 1001 ++-
 drivers/net/qede/base/ecore_int.h                  |   73 +-
 drivers/net/qede/base/ecore_int_api.h              |   47 +-
 drivers/net/qede/base/ecore_iov_api.h              |   41 +-
 drivers/net/qede/base/ecore_iro.h                  |    8 +
 drivers/net/qede/base/ecore_iro_values.h           |   44 +-
 drivers/net/qede/base/ecore_l2.c                   |  293 +-
 drivers/net/qede/base/ecore_l2.h                   |   82 +-
 drivers/net/qede/base/ecore_l2_api.h               |   30 +-
 drivers/net/qede/base/ecore_mcp.c                  | 1612 +++--
 drivers/net/qede/base/ecore_mcp.h                  |  195 +-
 drivers/net/qede/base/ecore_mcp_api.h              |  190 +-
 drivers/net/qede/base/ecore_mng_tlv.c              |    9 +-
 drivers/net/qede/base/ecore_proto_if.h             |    5 +
 drivers/net/qede/base/ecore_rt_defs.h              |  858 +--
 drivers/net/qede/base/ecore_sp_api.h               |    2 +
 drivers/net/qede/base/ecore_sp_commands.c          |  152 +-
 drivers/net/qede/base/ecore_sp_commands.h          |   33 +-
 drivers/net/qede/base/ecore_spq.c                  |  109 +-
 drivers/net/qede/base/ecore_spq.h                  |   20 +
 drivers/net/qede/base/ecore_sriov.c                |  945 ++-
 drivers/net/qede/base/ecore_sriov.h                |   53 +-
 drivers/net/qede/base/ecore_vf.c                   |  414 +-
 drivers/net/qede/base/ecore_vf.h                   |   72 +-
 drivers/net/qede/base/ecore_vfpf_if.h              |   80 +-
 drivers/net/qede/base/mcp_public.h                 |  465 +-
 drivers/net/qede/base/nvm_cfg.h                    |   90 +-
 drivers/net/qede/base/reg_addr.h                   |   17 +
 drivers/net/qede/qede_ethdev.c                     |   33 +-
 drivers/net/qede/qede_ethdev.h                     |    4 +-
 drivers/net/qede/qede_fdir.c                       |    8 +-
 drivers/net/qede/qede_if.h                         |   15 +-
 drivers/net/qede/qede_main.c                       |   76 +-
 drivers/net/qede/qede_rxtx.c                       |   12 +-
 drivers/net/sfc/Makefile                           |    3 +
 drivers/net/sfc/base/ef10_filter.c                 |  288 +-
 drivers/net/sfc/base/ef10_impl.h                   |   25 +
 drivers/net/sfc/base/ef10_nic.c                    |   10 +
 drivers/net/sfc/base/ef10_rx.c                     |   96 +-
 drivers/net/sfc/base/efx.h                         |  105 +-
 drivers/net/sfc/base/efx_filter.c                  |  103 +-
 drivers/net/sfc/base/efx_impl.h                    |   20 +-
 drivers/net/sfc/base/efx_rx.c                      |  142 +-
 drivers/net/sfc/base/hunt_nic.c                    |    7 +
 drivers/net/sfc/base/medford_nic.c                 |    7 +
 drivers/net/sfc/base/siena_nic.c                   |    3 +
 drivers/net/sfc/sfc.c                              |   14 +-
 drivers/net/sfc/sfc.h                              |    6 +-
 drivers/net/sfc/sfc_dp_rx.h                        |    5 +
 drivers/net/sfc/sfc_dp_tx.h                        |    9 +
 drivers/net/sfc/sfc_ef10_rx.c                      |    9 +
 drivers/net/sfc/sfc_ef10_tx.c                      |   73 +-
 drivers/net/sfc/sfc_ethdev.c                       |   47 +-
 drivers/net/sfc/sfc_flow.c                         |  188 +-
 drivers/net/sfc/sfc_flow.h                         |   15 +
 drivers/net/sfc/sfc_rx.c                           |   72 +-
 drivers/net/sfc/sfc_tweak.h                        |    3 +
 drivers/net/sfc/sfc_tx.c                           |   56 +
 drivers/net/tap/rte_eth_tap.c                      |  146 +-
 drivers/net/tap/rte_eth_tap.h                      |    2 +-
 drivers/net/tap/tap_flow.c                         |    3 +-
 drivers/net/thunderx/nicvf_ethdev.c                |    7 +
 drivers/net/vmxnet3/vmxnet3_ethdev.c               |    6 +-
 drivers/net/vmxnet3/vmxnet3_rxtx.c                 |   22 +-
 test/test/test_link_bonding_mode4.c                |    2 +-
 193 files changed, 14781 insertions(+), 12352 deletions(-)
 rename doc/guides/nics/features/{nfp.ini => nfp_pf.ini} (96%)
 create mode 100644 doc/guides/nics/features/nfp_vf.ini
 delete mode 100644 drivers/net/ark/ark_ethdev.h
 rename drivers/net/bonding/{rte_eth_bond_version.map => rte_pmd_bond_version.map} (100%)
 create mode 100644 drivers/net/mlx4/mlx4_ethdev.c
 create mode 100644 drivers/net/mlx4/mlx4_intr.c
 create mode 100644 drivers/net/mlx4/mlx4_mr.c
 create mode 100644 drivers/net/mlx4/mlx4_rxq.c
 create mode 100644 drivers/net/mlx4/mlx4_rxtx.c
 create mode 100644 drivers/net/mlx4/mlx4_rxtx.h
 create mode 100644 drivers/net/mlx4/mlx4_txq.c
 create mode 100644 drivers/net/mlx4/mlx4_utils.c
 create mode 100644 drivers/net/mlx4/mlx4_utils.h
 create mode 100644 drivers/net/nfp/nfp_net_eth.h
 create mode 100644 drivers/net/nfp/nfp_nfpu.c
 create mode 100644 drivers/net/nfp/nfp_nfpu.h
 create mode 100644 drivers/net/nfp/nfp_nspu.c
 create mode 100644 drivers/net/nfp/nfp_nspu.h

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [RFC PATCH v2 1/1] eventtimer: introduce event timer adapter
  @ 2017-09-22 15:17  1%   ` Erik Gabriel Carrillo
  0 siblings, 0 replies; 200+ results
From: Erik Gabriel Carrillo @ 2017-09-22 15:17 UTC (permalink / raw)
  To: jerin.jacob
  Cc: dev, bruce.richardson, harry.van.haaren, hemant.agrawal,
	gage.ads, nipun.gupta, narender.vangati, nikhil.rao,
	pbhagavatula, rsanford

Signed-off-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
---
v2
- Added ops structure and stubbed out plugin for SW impl
- Added unit test stubs
- Replaced occurrences of "wheel" in API with "adapter"
- Replaced occurrences of pointer to struct rte_event_timer_adapter with ids
- Removed rte_event_timer_adapter_lookup() function
- Replaced RTE_EVENT_TIMER_SUCCESS_{ARM,CANCEL} states with
  RTE_EVENT_TIMER_ARMED

 drivers/event/sw/Makefile                          |   1 +
 drivers/event/sw/sw_evdev.c                        |  11 +
 drivers/event/sw/sw_evdev_timer_adapter.c          | 124 +++++++
 lib/librte_eventdev/Makefile                       |   3 +
 lib/librte_eventdev/rte_event_timer_adapter.c      | 227 ++++++++++++
 lib/librte_eventdev/rte_event_timer_adapter.h      | 388 +++++++++++++++++++++
 .../rte_event_timer_adapter_driver.h               | 128 +++++++
 lib/librte_eventdev/rte_eventdev.h                 |   2 +-
 lib/librte_eventdev/rte_eventdev_pmd.h             |  15 +
 lib/librte_eventdev/rte_eventdev_version.map       |  14 +
 test/test/Makefile                                 |   1 +
 test/test/test_event_timer_adapter.c               | 183 ++++++++++
 12 files changed, 1096 insertions(+), 1 deletion(-)
 create mode 100644 drivers/event/sw/sw_evdev_timer_adapter.c
 create mode 100644 lib/librte_eventdev/rte_event_timer_adapter.c
 create mode 100644 lib/librte_eventdev/rte_event_timer_adapter.h
 create mode 100644 lib/librte_eventdev/rte_event_timer_adapter_driver.h
 create mode 100644 test/test/test_event_timer_adapter.c

diff --git a/drivers/event/sw/Makefile b/drivers/event/sw/Makefile
index 857a87c..f059915 100644
--- a/drivers/event/sw/Makefile
+++ b/drivers/event/sw/Makefile
@@ -55,6 +55,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev_worker.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev_scheduler.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev_xstats.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev_timer_adapter.c
 
 # export include files
 SYMLINK-y-include +=
diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c
index 9c534b7..bbbf80a 100644
--- a/drivers/event/sw/sw_evdev.c
+++ b/drivers/event/sw/sw_evdev.c
@@ -49,6 +49,8 @@
 #define SCHED_QUANTA_ARG "sched_quanta"
 #define CREDIT_QUANTA_ARG "credit_quanta"
 
+extern const struct rte_event_timer_adapter_ops sw_event_adapter_timer_ops;
+
 static void
 sw_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *info);
 
@@ -733,6 +735,13 @@ static int32_t sw_sched_service_func(void *args)
 }
 
 static int
+sw_event_timer_adapter_ctrl(void *arg)
+{
+	*(const void **)arg = &sw_event_adapter_timer_ops;
+	return 0;
+}
+
+static int
 sw_probe(struct rte_vdev_device *vdev)
 {
 	static const struct rte_eventdev_ops evdev_sw_ops = {
@@ -756,6 +765,8 @@ sw_probe(struct rte_vdev_device *vdev)
 			.xstats_get_names = sw_xstats_get_names,
 			.xstats_get_by_name = sw_xstats_get_by_name,
 			.xstats_reset = sw_xstats_reset,
+
+			.event_timer_adapter_ctrl = sw_event_timer_adapter_ctrl,
 	};
 
 	static const char *const args[] = {
diff --git a/drivers/event/sw/sw_evdev_timer_adapter.c b/drivers/event/sw/sw_evdev_timer_adapter.c
new file mode 100644
index 0000000..5edab0a
--- /dev/null
+++ b/drivers/event/sw/sw_evdev_timer_adapter.c
@@ -0,0 +1,124 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016-2017 Intel Corporation. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+#include <stdbool.h>
+
+#include <rte_event_timer_adapter.h>
+#include <rte_event_timer_adapter_driver.h>
+#include <rte_service_component.h>
+#include <rte_service.h>
+#include <rte_log.h>
+
+static int
+event_timer_adapter_service_func(void *args)
+{
+	RTE_SET_USED(args);
+
+	return 0;
+}
+
+static int
+start_event_timer_adapter_service(struct rte_event_timer_adapter *adapter,
+				  uint8_t id)
+{
+	RTE_SET_USED(adapter);
+	RTE_SET_USED(id);
+
+	RTE_SET_USED(event_timer_adapter_service_func);
+
+	return 0;
+}
+
+static int
+sw_event_timer_adapter_start(struct rte_event_timer_adapter *adapter)
+{
+	RTE_SET_USED(adapter);
+
+	RTE_SET_USED(start_event_timer_adapter_service);
+
+	return 0;
+}
+
+static int
+sw_event_timer_adapter_stop(struct rte_event_timer_adapter *adapter)
+{
+	RTE_SET_USED(adapter);
+
+	return 0;
+}
+
+static int
+sw_event_timer_arm_burst(struct rte_event_timer_adapter *adapter,
+			 struct rte_event_timer **tims,
+			 const uint16_t nb_tims)
+{
+	RTE_SET_USED(adapter);
+	RTE_SET_USED(tims);
+	RTE_SET_USED(nb_tims);
+
+	return 0;
+}
+
+static int
+sw_event_timer_arm_tmo_tick_burst(struct rte_event_timer_adapter *adapter,
+				  struct rte_event_timer **tims,
+				  const uint64_t timeout_tick,
+				  const uint16_t nb_tims)
+{
+	RTE_SET_USED(adapter);
+	RTE_SET_USED(tims);
+	RTE_SET_USED(timeout_tick);
+	RTE_SET_USED(nb_tims);
+
+	return 0;
+}
+
+static int
+sw_event_timer_cancel_burst(struct rte_event_timer_adapter *adapter,
+			    struct rte_event_timer **tims,
+			    const uint16_t nb_tims)
+{
+	RTE_SET_USED(adapter);
+	RTE_SET_USED(tims);
+	RTE_SET_USED(nb_tims);
+
+	return 0;
+}
+
+const struct rte_event_timer_adapter_ops sw_event_adapter_timer_ops = {
+	.adapter_start = sw_event_timer_adapter_start,
+	.adapter_stop = sw_event_timer_adapter_stop,
+	.event_timer_arm_burst = sw_event_timer_arm_burst,
+	.event_timer_arm_tmo_tick_burst = sw_event_timer_arm_tmo_tick_burst,
+	.event_timer_cancel_burst = sw_event_timer_cancel_burst,
+};
diff --git a/lib/librte_eventdev/Makefile b/lib/librte_eventdev/Makefile
index 410578a..b0904fe 100644
--- a/lib/librte_eventdev/Makefile
+++ b/lib/librte_eventdev/Makefile
@@ -43,6 +43,7 @@ CFLAGS += $(WERROR_FLAGS)
 # library source files
 SRCS-y += rte_eventdev.c
 SRCS-y += rte_event_ring.c
+SRCS-y += rte_event_timer_adapter.c
 
 # export include files
 SYMLINK-y-include += rte_eventdev.h
@@ -50,6 +51,8 @@ SYMLINK-y-include += rte_eventdev_pmd.h
 SYMLINK-y-include += rte_eventdev_pmd_pci.h
 SYMLINK-y-include += rte_eventdev_pmd_vdev.h
 SYMLINK-y-include += rte_event_ring.h
+SYMLINK-y-include += rte_event_timer_adapter.h
+SYMLINK-y-include += rte_event_timer_adapter_driver.h
 
 # versioning export map
 EXPORT_MAP := rte_eventdev_version.map
diff --git a/lib/librte_eventdev/rte_event_timer_adapter.c b/lib/librte_eventdev/rte_event_timer_adapter.c
new file mode 100644
index 0000000..d28c676
--- /dev/null
+++ b/lib/librte_eventdev/rte_event_timer_adapter.c
@@ -0,0 +1,227 @@
+/*
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+
+#include <rte_malloc.h>
+#include <rte_memzone.h>
+#include <rte_lcore.h>
+#include <rte_log.h>
+#include <rte_service_component.h>
+#include <rte_branch_prediction.h>
+
+#include "rte_eventdev_pmd.h"
+#include "rte_event_timer_adapter.h"
+#include "rte_event_timer_adapter_driver.h"
+
+#define RTE_EVENT_TIMER_ADAPTER_NUM_MAX 64
+
+static struct rte_event_timer_adapter *rte_event_timer_adapters;
+
+static inline int
+adapter_valid(uint16_t id)
+{
+	RTE_SET_USED(id);
+
+	return -1;
+}
+
+/* validate ID and retrieve adapter pointer, or return error value */
+#define ADAPTER_VALID_GET_OR_ERR_RET(id, adapter, retval) do {           \
+	if (id >= RTE_EVENT_TIMER_ADAPTER_NUM_MAX || !adapter_valid(id)) \
+		return retval;                                           \
+	adapter = &rte_event_timer_adapters[id];			 \
+} while (0)
+
+
+static int
+default_port_conf_cb(uint16_t id, uint8_t event_dev_id, uint8_t event_port_id,
+		void *conf_arg)
+{
+	RTE_SET_USED(id);
+	RTE_SET_USED(event_dev_id);
+	RTE_SET_USED(event_port_id);
+	RTE_SET_USED(conf_arg);
+
+	return 0;
+}
+
+int
+rte_event_timer_adapter_create(struct rte_event_timer_adapter_conf *conf)
+{
+	/* TODO: check default values */
+	struct rte_event_port_conf port_conf = {
+		.new_event_threshold = 128,
+		.dequeue_depth = 32,
+		.enqueue_depth = 32
+	};
+
+	return rte_event_timer_adapter_create_ext(conf, default_port_conf_cb,
+						  &port_conf);
+}
+
+int
+rte_event_timer_adapter_create_ext(struct rte_event_timer_adapter_conf *conf,
+		rte_event_timer_adapter_port_conf_cb_t conf_cb,
+		void *conf_arg)
+{
+	RTE_SET_USED(conf);
+	RTE_SET_USED(conf_cb);
+	RTE_SET_USED(conf_arg);
+
+	return 0;
+}
+
+int
+rte_event_timer_adapter_get_info(uint16_t id,
+		struct rte_event_timer_adapter_info *adapter_info)
+{
+
+	RTE_SET_USED(id);
+	RTE_SET_USED(adapter_info);
+
+	return 0;
+}
+
+int
+rte_event_timer_adapter_start(uint16_t id)
+{
+	const struct rte_event_timer_adapter_ops *ops = NULL;
+	struct rte_event_timer_adapter *adapter;
+
+	ADAPTER_VALID_GET_OR_ERR_RET(id, adapter, -EINVAL);
+
+	ops = rte_event_timer_adapter_ops_get(adapter);
+	if (unlikely(!ops))
+		return -1;
+	if (likely(!!ops->adapter_start))
+		return ops->adapter_start(adapter);
+
+	return -1;
+}
+
+int
+rte_event_timer_adapter_stop(uint16_t id)
+{
+	const struct rte_event_timer_adapter_ops *ops = NULL;
+	struct rte_event_timer_adapter *adapter;
+
+	ADAPTER_VALID_GET_OR_ERR_RET(id, adapter, -EINVAL);
+
+	ops = rte_event_timer_adapter_ops_get(adapter);
+	if (unlikely(!ops))
+		return -1;
+	if (likely(!!ops->adapter_stop))
+		return ops->adapter_stop(adapter);
+
+	return -1;
+}
+
+int
+rte_event_timer_adapter_free(uint16_t id)
+{
+	RTE_SET_USED(id);
+	return 0;
+}
+
+const struct rte_event_timer_adapter_ops *
+rte_event_timer_adapter_ops_get(struct rte_event_timer_adapter *adapter)
+{
+	struct rte_eventdev *evdev = &rte_eventdevs[adapter->event_dev_id];
+	struct rte_event_timer_adapter_ops *ops;
+	RTE_SET_USED(evdev);
+
+	if (unlikely(!evdev->dev_ops->event_timer_adapter_ctrl ||
+		     evdev->dev_ops->event_timer_adapter_ctrl(&ops) || !ops))
+		return NULL;
+
+	return ops;
+}
+
+int
+rte_event_timer_arm_burst(uint16_t id,
+			  struct rte_event_timer **tim,
+			  uint16_t nb_tims)
+{
+	const struct rte_event_timer_adapter_ops *ops = NULL;
+	struct rte_event_timer_adapter *adapter;
+
+	ADAPTER_VALID_GET_OR_ERR_RET(id, adapter, -EINVAL);
+
+	ops = rte_event_timer_adapter_ops_get(adapter);
+	if (unlikely(!ops))
+		return -1;
+	if (likely(!!ops->event_timer_arm_burst))
+		return ops->event_timer_arm_burst(adapter, tim, nb_tims);
+
+	return -1;
+}
+
+int
+rte_event_timer_arm_tmo_tick_burst(uint16_t id,
+				   struct rte_event_timer **tim,
+				   const uint64_t timeout_tick,
+				   uint16_t nb_tims)
+{
+	const struct rte_event_timer_adapter_ops *ops = NULL;
+	struct rte_event_timer_adapter *adapter;
+
+	ADAPTER_VALID_GET_OR_ERR_RET(id, adapter, -EINVAL);
+
+	ops = rte_event_timer_adapter_ops_get(adapter);
+	if (unlikely(!ops))
+		return -1;
+	if (likely(!!ops->event_timer_arm_tmo_tick_burst))
+		return ops->event_timer_arm_tmo_tick_burst(adapter,
+							   tim,
+							   timeout_tick,
+							   nb_tims);
+
+	return -1;
+}
+
+int rte_event_timer_cancel_burst(uint16_t id,
+				 struct rte_event_timer **tim,
+				 uint16_t nb_tims)
+{
+	const struct rte_event_timer_adapter_ops *ops = NULL;
+	struct rte_event_timer_adapter *adapter;
+
+	ADAPTER_VALID_GET_OR_ERR_RET(id, adapter, -EINVAL);
+
+	ops = rte_event_timer_adapter_ops_get(adapter);
+	if (unlikely(!ops))
+		return -1;
+	if (likely(!!ops->event_timer_cancel_burst))
+		return ops->event_timer_cancel_burst(adapter, tim, nb_tims);
+
+	return -1;
+}
diff --git a/lib/librte_eventdev/rte_event_timer_adapter.h b/lib/librte_eventdev/rte_event_timer_adapter.h
new file mode 100644
index 0000000..85ae7da
--- /dev/null
+++ b/lib/librte_eventdev/rte_event_timer_adapter.h
@@ -0,0 +1,388 @@
+/*
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_EVENT_TIMER_ADAPTER_H_
+#define _RTE_EVENT_TIMER_ADAPTER_H_
+
+/**
+ * @file
+ *
+ * RTE Event Timer Adapter
+ *
+ * TODO: Update description
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "rte_eventdev.h"
+
+/*
+ * Timer adapter clock source
+ */
+enum rte_event_timer_adapter_clk_src {
+	RTE_EVENT_TIMER_ADAPTER_CPU_CLK,
+	/**< Use CPU clock as the clock source. */
+	RTE_EVENT_TIMER_ADAPTER_EXT_CLK0,
+	/**< Platform dependent external clock source 0. */
+	RTE_EVENT_TIMER_ADAPTER_EXT_CLK1,
+	/**< Platform dependent external clock source 1. */
+	RTE_EVENT_TIMER_ADAPTER_EXT_CLK2,
+	/**< Platform dependent external clock source 2. */
+	RTE_EVENT_TIMER_ADAPTER_EXT_CLK3,
+	/**< Platform dependent external clock source 3. */
+};
+
+#define RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES	(1ULL << 0)
+/**< The event timer adapter implementation may have constraints on the
+ * resolution (timer_tick_ns) and maximum timer expiry timeout(max_tmo_ns)
+ * based on the given timer adapter or system.  If this flag is set, the
+ * implementation adjusts the resolution and maximum timeout to the best
+ * possible configuration. On successful timer adapter creation, the
+ * application can get the configured resolution and max timeout with
+ * ``rte_event_timer_adapter_get_info()``.
+ */
+#define RTE_EVENT_TIMER_ADAPTER_F_SP_PUT	(1ULL << 1)
+/**< ``rte_event_timer_arm_burst()`` API to be used in single producer mode.
+ *
+ * @see struct rte_event_timer_adapter_conf::timer_wheel_flags
+ */
+
+
+/*
+ * Timer adapter configuration structure
+ */
+struct rte_event_timer_adapter_conf {
+	uint8_t event_dev_id;
+	/**< Event device identifier */
+	uint16_t timer_adapter_id;
+	/**< Event timer adapter identifier */
+	enum rte_event_timer_adapter_clk_src clk_src;
+	/**< Clock source for timer adapter */
+	uint64_t timer_tick_ns;
+	/**< Timer wheel resolution in ns */
+	uint64_t max_tmo_ns;
+	/**< Maximum timer timeout(expiry) in ns */
+	uint64_t nb_timers;
+	/**< Total number of timers per adapter */
+	uint32_t timer_adapter_flags;
+	/**< Timer adapter config flags (RTE_EVENT_TIMER_ADAPTER_F_*) */
+};
+
+struct rte_event_timer_adapter; /* opaque pointer */
+
+/*
+ * Callback function type for producer port creation.
+ */
+typedef int (*rte_event_timer_adapter_port_conf_cb_t)(uint16_t id,
+						      uint8_t event_dev_id,
+						      uint8_t event_port_id,
+						      void *conf_arg);
+
+/*
+ * Create an event timer adapter.
+ *
+ * This function must be invoked first before any other function in the API.
+ *
+ * @param conf
+ *   The event timer adapter configuration structure.
+ *
+ * @return
+ *   Possible rte_errno values include:
+ *    - ERANGE: timer_tick_ns is not in supported range.
+ */
+int rte_event_timer_adapter_create(struct rte_event_timer_adapter_conf *conf);
+
+/*
+ * Create a timer adapter with the supplied callback.
+ *
+ * This function can be used to have a more granular control over the timer
+ * adapter creation.  If a built-in port is absent, then the function uses the
+ * callback provided to create and get the port id to be used as a producer
+ * port.
+ *
+ * @param conf
+ *   The timer adapter configuration structure
+ * @param conf_cb
+ *   The port config callback function.
+ * @param conf_arg
+ *   Opaque pointer to the argument for the callback function
+ *
+ * @return
+ *   Pointer to the new allocated event timer adapter on success.
+ *   NULL on error with rte_errno set appropriately.
+ *   Possible rte_errno values include:
+ *    - ERANGE: timer_tick_ns is not in supported range.
+ */
+int rte_event_timer_adapter_create_ext(
+		struct rte_event_timer_adapter_conf *conf,
+		rte_event_timer_adapter_port_conf_cb_t conf_cb,
+		void *conf_arg);
+
+/*
+ * Timer adapter info structure.
+ */
+struct rte_event_timer_adapter_info {
+	uint64_t min_resolution_ns;
+	/**< Minimum timer adapter resolution in ns */
+	uint64_t max_tmo_ns;
+	/**< Maximum timer timeout(expire) in ns */
+	struct rte_event_timer_adapter_conf conf;
+	/**< Configured timer adapter attributes */
+	uint8_t event_dev_port_id;
+	/* TODO: document this */
+};
+
+/**
+ * Retrieve the contextual information of an event timer adapter.
+ *
+ * @param id
+ *   The identifier of an event timer adapter.
+ *
+ * @param[out] adapter_info
+ *   A pointer to a structure of type *rte_event_timer_adapter_info* to be
+ *   filled with the contextual information of the adapter.
+ *
+ * @return
+ *   - 0: Success, driver updates the contextual information of the
+ *   timer adapter
+ *   - <0: Error code returned by the driver info get function.
+ *   - -EINVAL if adapter identifier invalid
+ *
+ * @see RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
+ *   struct rte_event_timer_adapter_info
+ *
+ */
+int rte_event_timer_adapter_get_info(uint16_t id,
+		struct rte_event_timer_adapter_info *adapter_info);
+
+/**
+ * Start a timer adapter.
+ *
+ * The adapter start step is the last one and consists of setting the timer
+ * adapter to start accepting the timers and schedules to event queues.
+ *
+ * On success, all basic functions exported by the API (timer arm,
+ * timer cancel and so on) can be invoked.
+ *
+ * @param id
+ *   The identifier of an event timer adapter.
+ *
+ * @return
+ *   - 0: Success, adapter started.
+ *   - <0: Error code returned by the driver start function.
+ *   - -EINVAL if adapter identifier invalid
+ */
+int rte_event_timer_adapter_start(uint16_t id);
+
+/**
+ * Stop an event timer adapter.
+ *
+ * The adapter can be restarted with a call to
+ * ``rte_event_timer_adapter_start()``.
+ *
+ * @param id
+ *   The identifier of an event timer adapter.
+ *
+ * @return
+ *   - 0: Success, adapter stop.
+ *   - <0: Error code returned by the driver stop function.
+ *   - -EINVAL if adapter identifier invalid
+ */
+int rte_event_timer_adapter_stop(uint16_t id);
+
+/**
+ * Free an event timer adapter.
+ *
+ * Destroy an event timer adapter, freeing all resources.
+ *
+ * Before invoking this function, the application must wait for all the armed
+ * timers to expire or cancel the outstanding armed timers.
+ *
+ * @param id
+ *   The identifier of an event timer adapter.
+ *
+ * @return
+ *   - 0 on successfully freed the event timer adapter resources.
+ *   - <0 on failure to free an event timer adapter.
+ *   - -EAGAIN if adapter is busy
+ *   - -EINVAL if adapter identifier invalid
+ */
+int rte_event_timer_adapter_free(uint16_t id);
+
+/**
+ * Event timer state.
+ */
+enum rte_event_timer_state {
+	RTE_EVENT_TIMER_NOT_ARMED = 0,
+	/**< Event timer is in not armed state.*/
+	RTE_EVENT_TIMER_ARMED = 1,
+	/**< Event timer successfully armed.*/
+	RTE_EVENT_TIMER_ERROR = -1,
+	/**< Generic event timer error.*/
+	RTE_EVENT_TIMER_ERROR_TOOEARLY = -2,
+	/**< Event timer timeout tick is too little to add to the adapter. */
+	RTE_EVENT_TIMER_ERROR_TOOLATE = -3,
+	/**< Event timer timeout tick is greater than the maximum timeout.*/
+};
+
+/**
+ * The generic *rte_event_timer* structure to hold the event timer attributes
+ * for arm and cancel operations.
+ */
+RTE_STD_C11
+struct rte_event_timer {
+	struct rte_event ev;
+	/**<
+	 * Expiry event attributes.  On successful event timer timeout,
+	 * the following attributes will be used to inject the expiry event to
+	 * the eventdev:
+	 *  - event_queue_id: Targeted event queue id for expiry events.
+	 *  - event_priority: Event priority of the event expiry event in the
+	 *  event queue relative to other events.
+	 *  - sched_type: Scheduling type of the expiry event.
+	 *  - flow_id: Flow id of the expiry event.
+	 *  - op: RTE_EVENT_OP_NEW
+	 *  - event_type: RTE_EVENT_TYPE_TIMER
+	 */
+	enum rte_event_timer_state state;
+	/**< State of the event timer. */
+	uint64_t timeout_ticks;
+	/**< Expiry timer ticks expressed in number of *timer_ticks_ns* from
+	 * now.
+	 * @see struct rte_event_timer_adapter_info::adapter_conf::timer_tick_ns
+	 */
+	uint64_t impl_opaque[2];
+	/**< Implementation-specific opaque data.
+	 * An event timer adapter implementation use this field to hold
+	 * implementation specific values to share between the arm and cancel
+	 * operations.  The application should not modify this field.
+	 */
+	uint8_t user_meta[];
+	/**< Memory to store user specific metadata.
+	 * The event timer adapter implementation should not modify this area.
+	 */
+} __rte_cache_aligned;
+
+/**
+ * Arm a burst of event timers with separate expiration timeout tick for each
+ * event timer.
+ *
+ * Before calling this function, the application allocates
+ * ``struct rte_event_timer`` objects from mempool or huge page backed
+ * application buffers of desired size. On successful allocation,
+ * application updates the `struct rte_event_timer`` attributes such as
+ * expiry event attributes, timeout ticks from now.
+ * This function submits the event timer arm requests to the event timer adapter
+ * and on expiry, the events will be injected to designated event queue.
+ *
+ * @param id
+ *   The identifier of an event timer adapter.
+ * @param tim
+ *   Points to an array of objects of type *rte_event_timer* structure.
+ * @param nb_timers
+ *   Number of event timers in the supplied array.
+ *
+ * @return
+ *   The number of successfully armed event timers. The return value can be less
+ *   than the value of the *nb_timers* parameter. If the return value is less
+ *   than *nb_events*, the remaining event timers at the end of *tim*
+ *   are not consumed, and the caller has to take care of them, and rte_errno
+ *   is set accordingly. Possible errno values include:
+ *   - -EINVAL  Invalid timer adapter identifier, expiry event queue ID is
+ *   invalid, or an expiry event's sched type doesn't match the capabilities of
+ *   the destination event queue.
+ */
+int rte_event_timer_arm_burst(uint16_t id,
+			      struct rte_event_timer **tim,
+			      uint16_t nb_timers);
+
+/**
+ * Arm a burst of event timers with same expiration timeout tick.
+ *
+ * Provides the same functionality as ``rte_event_timer_arm_burst()``, except
+ * that application can use this API when all the event timers have the
+ * same timeout expiration tick. This specialized function can provide the
+ * additional hint to the adapter implementation and optimize if possible.
+ *
+ * @param id
+ *   The identifier of an event timer adapter.
+ * @param tim
+ *   Points to an array of objects of type *rte_event_timer* structure.
+ * @param nb_timers
+ *   Number of event timers in the supplied array.
+ *
+ * @return
+ *   The number of successfully armed event timers. The return value can be less
+ *   than the value of the *nb_timers* parameter. If the return value is less
+ *   than *nb_events*, the remaining event timers at the end of *tim*
+ *   are not consumed, and the caller has to take care of them, and rte_errno
+ *   is set accordingly. Possible errno values include:
+ *   - -EINVAL  Invalid timer adapter identifier, expiry event queue ID is
+ *   invalid, or an expiry event's sched type doesn't match the capabilities of
+ *   the destination event queue.
+ */
+int
+rte_event_timer_arm_tmo_tick_burst(
+		uint16_t id,
+		struct rte_event_timer **tim,
+		const uint64_t timeout_tick,
+		const uint16_t nb_timers);
+
+/**
+ * Cancel a burst of event timer from being scheduled to the event device.
+ *
+ * @param id
+ *   The identifier of an event timer adapter.
+ * @param tim
+ *   Points to an array of objects of type *rte_event_timer* structure
+ * @param nb_timers
+ *   Number of event timer instances in the supplied array.
+ *
+ * @return
+ *   The number of successfully canceled event timers. The return value can be
+ *   less than the value of the *nb_timers* parameter. If the return value is
+ *   less than *nb_events*, the remaining event timers at the end of *tim*
+ *   are not consumed, and the caller has to take care of them, and rte_errno
+ *   is set accordingly. Possible errno values include:
+ *   - -EINVAL  Invalid timer adapter identifier
+ */
+int rte_event_timer_cancel_burst(uint16_t id,
+				 struct rte_event_timer **tim,
+				 uint16_t nb_timers);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_EVENT_TIMER_ADAPTER_H_ */
diff --git a/lib/librte_eventdev/rte_event_timer_adapter_driver.h b/lib/librte_eventdev/rte_event_timer_adapter_driver.h
new file mode 100644
index 0000000..d82fe38
--- /dev/null
+++ b/lib/librte_eventdev/rte_event_timer_adapter_driver.h
@@ -0,0 +1,128 @@
+/*
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RTE_EVENT_TIMER_ADAPTER_DRIVER_H_
+#define RTE_EVENT_TIMER_ADAPTER_DRIVER_H_
+
+/**
+ * @file
+ * RTE event timer adapter driver side API
+ *
+ * This file provides implementation helpers for internal use by plugins, they
+ * are not intended to be exposed to applications and are not subject to ABI
+ * versioning.
+ */
+#include <rte_timer.h>
+#include <rte_ring.h>
+
+#include "rte_event_timer_adapter.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Event timer adapter structure.
+ */
+struct rte_event_timer_adapter {
+	uint8_t event_dev_id;
+	/**< Event device identifier */
+	uint8_t event_port_id;
+	/**< Event device port identifier */
+	uint16_t id;
+	/**< Event timer adapter identifier */
+	rte_event_timer_adapter_port_conf_cb_t conf_cb;
+	/**< Port configuration callback function for event timer adapter. */
+	void *conf_arg;
+	/**< Argument for port configuration callback function. */
+
+	/**
+	 * Fields for software implementation
+	 */
+	uint32_t service_id;
+	/**< Identifier of service executing timer management logic. */
+	int socket_id;
+	/**< Socket identifier of service. */
+	struct rte_ring event_timer_ring;
+	/**< Ring of messages submitted by application to arm/cancel event
+	 * timers.
+	 */
+	/* event buffer */
+	/**< Buffered timer events to be enqueued to an event device. */
+
+	/* stats */
+};
+
+/**
+ * These callback functions are not supposed to be used by applications
+ * directly, which must rely on the API defined in rte_event_timer_adapter.h.
+ *
+ * See also rte_event_timer_adapter_ops_get().
+ */
+struct rte_event_timer_adapter_ops {
+	int (*adapter_start)
+		(struct rte_event_timer_adapter *adapter);
+	int (*adapter_stop)
+		(struct rte_event_timer_adapter *adapter);
+	int (*event_timer_arm_burst)
+		(struct rte_event_timer_adapter *adapter,
+		 struct rte_event_timer **tims,
+		 const uint16_t nb_tims);
+	int (*event_timer_arm_tmo_tick_burst)
+		(struct rte_event_timer_adapter *adapter,
+		 struct rte_event_timer **tims,
+		 const uint64_t timeout_tick,
+		 const uint16_t nb_tims);
+	int (*event_timer_cancel_burst)
+		(struct rte_event_timer_adapter *adapter,
+		 struct rte_event_timer **tims,
+		 const uint16_t nb_tims);
+};
+
+/**
+ * Get event timer adapter operations structure from an event device.
+ *
+ * @param adapter
+ *   Pointer to adapter for which to obtain an operations struct.
+ *
+ * @return
+ *   The adapter operation structure associated with the event device, NULL in
+ *   case of error, in which case rte_errno is set and the error structure
+ *   contains additional details.
+ */
+const struct rte_event_timer_adapter_ops *
+rte_event_timer_adapter_ops_get(struct rte_event_timer_adapter *adapter);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RTE_EVENT_TIMER_ADAPTER_DRIVER_H_ */
diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h
index 128bc52..8357c5e 100644
--- a/lib/librte_eventdev/rte_eventdev.h
+++ b/lib/librte_eventdev/rte_eventdev.h
@@ -865,7 +865,7 @@ rte_event_dev_close(uint8_t dev_id);
 /**< The event generated from ethdev subsystem */
 #define RTE_EVENT_TYPE_CRYPTODEV        0x1
 /**< The event generated from crypodev subsystem */
-#define RTE_EVENT_TYPE_TIMERDEV         0x2
+#define RTE_EVENT_TYPE_TIMER		0x2
 /**< The event generated from timerdev subsystem */
 #define RTE_EVENT_TYPE_CPU              0x3
 /**< The event generated from cpu for pipelining.
diff --git a/lib/librte_eventdev/rte_eventdev_pmd.h b/lib/librte_eventdev/rte_eventdev_pmd.h
index 3d72acf..27bcc77 100644
--- a/lib/librte_eventdev/rte_eventdev_pmd.h
+++ b/lib/librte_eventdev/rte_eventdev_pmd.h
@@ -412,6 +412,18 @@ typedef int (*eventdev_xstats_get_names_t)(const struct rte_eventdev *dev,
 		unsigned int *ids, unsigned int size);
 
 /**
+ * Timer adapter control function for an event device.  Currently used to
+ * fill an ops structure with function pointers for an adapter plugin.
+ *
+ * @param arg
+ *   Pointer to an ops structure to fill
+ * @return
+ *   0: Success
+ *   <0: Failure
+ */
+typedef int (*event_timer_adapter_ctrl_t)(void *arg);
+
+/**
  * Get value of one stats and optionally return its id
  *
  * @param dev
@@ -468,6 +480,9 @@ struct rte_eventdev_ops {
 	/**< Get one value by name. */
 	eventdev_xstats_reset_t xstats_reset;
 	/**< Reset the statistics values in xstats. */
+
+	event_timer_adapter_ctrl_t event_timer_adapter_ctrl;
+	/**< Perform actions related to an event timer adapter.*/
 };
 
 /**
diff --git a/lib/librte_eventdev/rte_eventdev_version.map b/lib/librte_eventdev/rte_eventdev_version.map
index 4c48e5f..5655d92 100644
--- a/lib/librte_eventdev/rte_eventdev_version.map
+++ b/lib/librte_eventdev/rte_eventdev_version.map
@@ -51,3 +51,17 @@ DPDK_17.08 {
 	rte_event_ring_init;
 	rte_event_ring_lookup;
 } DPDK_17.05;
+
+DPDK_17.11 {
+	global:
+
+	rte_event_timer_adapter_create;
+	rte_event_timer_adapter_create_ext;
+	rte_event_timer_adapter_get_info;
+	rte_event_timer_adapter_start;
+	rte_event_timer_adapter_stop;
+	rte_event_timer_adapter_free;
+	rte_event_timer_arm_burst;
+	rte_event_timer_arm_tmo_tick_burst;
+	rte_event_timer_cancel_burst;
+} DPDK_17.08;
diff --git a/test/test/Makefile b/test/test/Makefile
index 42d9a49..f09dc73 100644
--- a/test/test/Makefile
+++ b/test/test/Makefile
@@ -204,6 +204,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += test_cryptodev.c
 ifeq ($(CONFIG_RTE_LIBRTE_EVENTDEV),y)
 SRCS-y += test_eventdev.c
 SRCS-y += test_event_ring.c
+SRCS-y += test_event_timer_adapter.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += test_eventdev_sw.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_OCTEONTX_SSOVF) += test_eventdev_octeontx.c
 endif
diff --git a/test/test/test_event_timer_adapter.c b/test/test/test_event_timer_adapter.c
new file mode 100644
index 0000000..46ed098
--- /dev/null
+++ b/test/test/test_event_timer_adapter.c
@@ -0,0 +1,183 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+
+#include <rte_eventdev.h>
+#include <rte_dev.h>
+#include <rte_event_timer_adapter.h>
+#include <rte_mempool.h>
+#include <rte_errno.h>
+
+#include "test.h"
+
+static int evdev;
+struct rte_event_timer_adapter *g_adapter;
+struct rte_event_timer *g_evtimer;
+struct rte_mempool *g_event_timer_pool;
+
+static inline void
+devconf_set_default_sane_values(struct rte_event_dev_config *dev_conf,
+			struct rte_event_dev_info *info)
+{
+	memset(dev_conf, 0, sizeof(struct rte_event_dev_config));
+	dev_conf->dequeue_timeout_ns = info->min_dequeue_timeout_ns;
+	dev_conf->nb_event_ports = info->max_event_ports;
+	dev_conf->nb_event_queues = info->max_event_queues;
+	dev_conf->nb_event_queue_flows = info->max_event_queue_flows;
+	dev_conf->nb_event_port_dequeue_depth =
+			info->max_event_port_dequeue_depth;
+	dev_conf->nb_event_port_enqueue_depth =
+			info->max_event_port_enqueue_depth;
+	dev_conf->nb_event_port_enqueue_depth =
+			info->max_event_port_enqueue_depth;
+	dev_conf->nb_events_limit =
+			info->max_num_events;
+}
+
+static int
+configure_event_dev(void)
+{
+	struct rte_event_dev_config devconf;
+	int ret;
+	const char *eventdev_name = "event_sw0";
+	struct rte_event_dev_info info;
+
+	evdev = rte_event_dev_get_dev_id(eventdev_name);
+	if (evdev < 0) {
+		if (rte_vdev_init(eventdev_name, NULL) < 0) {
+			printf("Error creating eventdev\n");
+			return TEST_FAILED;
+		}
+		evdev = rte_event_dev_get_dev_id(eventdev_name);
+		if (evdev < 0) {
+			printf("Error finding newly created eventdev\n");
+			return TEST_FAILED;
+		}
+	}
+
+	ret = rte_event_dev_info_get(evdev, &info);
+	TEST_ASSERT_SUCCESS(ret, "Failed to get event dev info");
+
+	devconf_set_default_sane_values(&devconf, &info);
+
+	ret = rte_event_dev_configure(evdev, &devconf);
+	TEST_ASSERT_SUCCESS(ret, "Failed to configure eventdev");
+
+	/* Start the event device */
+	ret = rte_event_dev_start(evdev);
+	TEST_ASSERT_SUCCESS(ret, "Failed to start device");
+
+	return TEST_SUCCESS;
+}
+
+static int
+testsuite_setup(void)
+{
+	int ret;
+
+	/* Setup and start event device. */
+	ret = configure_event_dev();
+	if (ret) {
+		printf("Failed to configure event dev\n");
+		return TEST_FAILED;
+	}
+
+	/* Create a mempool of event timers. */
+	g_event_timer_pool = rte_mempool_create("event_timer_mempool",
+						32,
+						sizeof(struct rte_event_timer),
+						0,
+						0,
+						NULL,
+						NULL,
+						NULL,
+						NULL,
+						rte_socket_id(),
+						0);
+	if (g_event_timer_pool == NULL) {
+		/* Failed to create event timer mempool. */
+		printf("Failed to configure event timer mempool: %s\n",
+		       rte_strerror(rte_errno));
+		return TEST_FAILED;
+	}
+
+	return TEST_SUCCESS;
+}
+
+static void
+testsuite_teardown(void)
+{
+	/* TODO: tear down adapter and evdev */
+
+	rte_mempool_free(g_event_timer_pool);
+}
+
+static int
+adapter_create_free(void)
+{
+	int ret;
+
+	struct rte_event_timer_adapter_conf conf = {
+		.event_dev_id = evdev,
+		.timer_adapter_id = 0,
+	};
+
+	ret = rte_event_timer_adapter_create(&conf);
+	if (ret)
+		return TEST_FAILED;
+
+	ret = rte_event_timer_adapter_free(conf.timer_adapter_id);
+	if (ret)
+		return TEST_FAILED;
+
+	return TEST_SUCCESS;
+}
+
+static struct unit_test_suite adapter_tests  = {
+	.suite_name = "event timer adapter test suite",
+	.setup = testsuite_setup,
+	.teardown = testsuite_teardown,
+	.unit_test_cases = {
+		TEST_CASE(adapter_create_free),
+		TEST_CASES_END() /**< NULL terminate unit test array */
+	}
+};
+
+static int
+test_event_timer_adapter_common(void)
+{
+	return unit_test_suite_runner(&adapter_tests);
+}
+
+REGISTER_TEST_COMMAND(event_timer_adapter_autotest,
+		      test_event_timer_adapter_common);
-- 
2.6.4

^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI versioning
  2017-09-21 10:36  4%       ` Ferruh Yigit
@ 2017-09-22  2:02  4%         ` Yang, Zhiyong
  0 siblings, 0 replies; 200+ results
From: Yang, Zhiyong @ 2017-09-22  2:02 UTC (permalink / raw)
  To: Yigit, Ferruh, dev; +Cc: thomas

Ferruh,

> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Thursday, September 21, 2017 6:37 PM
> To: Yang, Zhiyong <zhiyong.yang@intel.com>; dev@dpdk.org
> Cc: thomas@monjalon.net
> Subject: Re: [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI
> versioning
> 
> On 9/21/2017 9:32 AM, Zhiyong Yang wrote:
> > There are two bonding APIs using ABI versioning, and both have port_id
> > as parameter. Since we are already breaking ABI, no need to keep older
> > versions of APIs.
> >
> > Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
> 
> <...>
> 
> > -int
> > -rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
> > +rte_eth_bond_8023ad_conf_get(uint8_t port_id,
> >  		struct rte_eth_bond_8023ad_conf *conf)  {
> >  	struct rte_eth_dev *bond_dev;
> > @@ -1409,10 +1320,6 @@ rte_eth_bond_8023ad_conf_get_v1708(uint8_t
> port_id,
> >  	bond_mode_8023ad_conf_get_v1708(bond_dev, conf);
> 
> I am aware this is not focus of the patchset, but it would be good to rename this
> function too and remove _v1708 suffix.
> 
> It seems there is already a function named "bond_mode_8023ad_conf_get"
> and after removed code, "bond_mode_8023ad_conf_get" only called by
> "bond_mode_8023ad_conf_get_v1708":
> 
> bond_mode_8023ad_conf_get_v1708()
>    bond_mode_8023ad_conf_get()
> 
> So it is possible to merge them into name "bond_mode_8023ad_conf_get()"
> 

Ok. I will merge them into one.

> Thanks,
> Ferruh




^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v4] devtools: rework abi checker script
  2017-09-20  9:12 27%   ` [dpdk-dev] [PATCH v4] " Olivier Matz
@ 2017-09-21 15:40  7%     ` Neil Horman
  2017-09-25  9:11  9%       ` Olivier MATZ
  2017-10-05  7:53 27%     ` [dpdk-dev] [PATCH v5] " Olivier Matz
  1 sibling, 1 reply; 200+ results
From: Neil Horman @ 2017-09-21 15:40 UTC (permalink / raw)
  To: Olivier Matz; +Cc: dev, bruce.richardson

On Wed, Sep 20, 2017 at 11:12:53AM +0200, Olivier Matz wrote:
> The initial version of the script had some limitations:
> - cannot work on a non-clean workspace
> - environment variables are not documented
> - no compilation log in case of failure
> - return success even it abi is incompatible
> 
> This patch addresses these issues and rework the code.
> 
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> ---
> 
> v3->v4:
> - clarify logs on incompatible abi
> - log when an error returned an error
> - [really] fix the report path
> - log the output of make config in the proper file
> 
> v2->v3:
> - fix when not launched from dpdk root dir
> - use "-Og -Wno-error" instead of "-O0"
> - fix typo in commit log
> 
> v1->v2:
> - use /usr/bin/env to find bash (which is required)
> - fix displayed path to html reports
> - reword help for -f option
> 
> 
>  devtools/validate-abi.sh | 397 ++++++++++++++++++++++++-----------------------
>  1 file changed, 205 insertions(+), 192 deletions(-)
> 
This looks better, thank you for the iterations.  One last note: The abi dumper
utility errors out with error code of 12 if a given object has no exported
symbols, and I see a few of those.  You may want to consider catching that
error, logging an appropriate message and skipping the error emit.  That can be
handled later though, as its a corner case.  I'd go with this patch, and then
do a incremental improvement later

Acked-by: Neil Horman <nhorman@tuxdriver.com>

> diff --git a/devtools/validate-abi.sh b/devtools/validate-abi.sh
> index 0accc99b1..8caf43e83 100755
> --- a/devtools/validate-abi.sh
> +++ b/devtools/validate-abi.sh
> @@ -1,7 +1,8 @@
> -#!/bin/sh
> +#!/usr/bin/env bash
>  #   BSD LICENSE
>  #
>  #   Copyright(c) 2015 Neil Horman. All rights reserved.
> +#   Copyright(c) 2017 6WIND S.A.
>  #   All rights reserved.
>  #
>  #   Redistribution and use in source and binary forms, with or without
> @@ -27,236 +28,248 @@
>  #   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
>  #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>  
> -TAG1=$1
> -TAG2=$2
> -TARGET=$3
> -ABI_DIR=`mktemp -d -p /tmp ABI.XXXXXX`
> +set -e
>  
> -usage() {
> -	echo "$0 <REV1> <REV2> <TARGET>"
> -}
> +abicheck=abi-compliance-checker
> +abidump=abi-dumper
> +default_dst=abi-check
> +default_target=x86_64-native-linuxapp-gcc
>  
> -log() {
> -	local level=$1
> -	shift
> -	echo "$*"
> +# trap on error
> +err_report() {
> +    echo "$0: error at line $1"
>  }
> +trap 'err_report $LINENO' ERR
>  
> -validate_tags() {
> +print_usage () {
> +	cat <<- END_OF_HELP
> +	$(basename $0) [options] <rev1> <rev2>
>  
> -	if [ -z "$HASH1" ]
> -	then
> -		echo "invalid revision: $TAG1"
> -		return
> -	fi
> -	if [ -z "$HASH2" ]
> -	then
> -		echo "invalid revision: $TAG2"
> -		return
> -	fi
> +	This script compares the ABI of 2 git revisions of the current
> +	workspace. The output is a html report and a compilation log.
> +
> +	The objective is to make sure that applications built against
> +	DSOs from the first revision can still run when executed using
> +	the DSOs built from the second revision.
> +
> +	<rev1> and <rev2> are git commit id or tags.
> +
> +	Options:
> +	  -h		show this help
> +	  -j <num>	enable parallel compilation with <num> threads
> +	  -v		show compilation logs on the console
> +	  -d <dir>	change working directory (default is ${default_dst})
> +	  -t <target>	the dpdk target to use (default is ${default_target})
> +	  -f		overwrite existing files in destination directory
> +
> +	The script returns 0 on success, or the value of last failing
> +	call of ${abicheck} (incompatible abi or the tool has run with errors).
> +	The errors returned by ${abidump} are ignored.
> +
> +	END_OF_HELP
>  }
>  
> -validate_args() {
> -	if [ -z "$TAG1" ]
> -	then
> -		echo "Must Specify REV1"
> -		return
> -	fi
> -	if [ -z "$TAG2" ]
> -	then
> -		echo "Must Specify REV2"
> -		return
> -	fi
> -	if [ -z "$TARGET" ]
> -	then
> -		echo "Must Specify a build target"
> +# log in the file, and on stdout if verbose
> +# $1: level string
> +# $2: string to be logged
> +log() {
> +	echo "$1: $2"
> +	if [ "${verbose}" != "true" ]; then
> +		echo "$1: $2" >&3
>  	fi
>  }
>  
> +# launch a command and log it, taking care of surrounding spaces with quotes
> +cmd() {
> +	local i s whitespace ret
> +	s=""
> +	whitespace="[[:space:]]"
> +	for i in "$@"; do
> +		if [[ $i =~ $whitespace ]]; then
> +			i=\"$i\"
> +		fi
> +		if [ -z "$s" ]; then
> +			s="$i"
> +		else
> +			s="$s $i"
> +		fi
> +	done
> +
> +	ret=0
> +	log "CMD" "$s"
> +	"$@" || ret=$?
> +	if [ "$ret" != "0" ]; then
> +		log "CMD" "previous command returned $ret"
> +	fi
> +
> +	return $ret
> +}
>  
> -cleanup_and_exit() {
> -	rm -rf $ABI_DIR
> -	git checkout $CURRENT_BRANCH
> -	exit $1
> +# redirect or copy stderr/stdout to a file
> +# the syntax is unfamiliar, but it makes the rest of the
> +# code easier to read, avoiding the use of pipes
> +set_log_file() {
> +	# save original stdout and stderr in fd 3 and 4
> +	exec 3>&1
> +	exec 4>&2
> +	# create a new fd 5 that send to a file
> +	exec 5> >(cat > $1)
> +	# send stdout and stderr to fd 5
> +	if [ "${verbose}" = "true" ]; then
> +		exec 1> >(tee /dev/fd/5 >&3)
> +		exec 2> >(tee /dev/fd/5 >&4)
> +	else
> +		exec 1>&5
> +		exec 2>&5
> +	fi
>  }
>  
>  # Make sure we configure SHARED libraries
>  # Also turn off IGB and KNI as those require kernel headers to build
>  fixup_config() {
> -	sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" config/defconfig_$TARGET
> -	sed -i -e"$ a\CONFIG_RTE_NEXT_ABI=n" config/defconfig_$TARGET
> -	sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET
> -	sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" config/defconfig_$TARGET
> -	sed -i -e"$ a\CONFIG_RTE_KNI_KMOD=n" config/defconfig_$TARGET
> +	local conf=config/defconfig_$target
> +	cmd sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" $conf
> +	cmd sed -i -e"$ a\CONFIG_RTE_NEXT_ABI=n" $conf
> +	cmd sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" $conf
> +	cmd sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" $conf
> +	cmd sed -i -e"$ a\CONFIG_RTE_KNI_KMOD=n" $conf
>  }
>  
> -###########################################
> -#START
> -############################################
> +# build dpdk for the given tag and dump abi
> +# $1: hash of the revision
> +gen_abi() {
> +	local i
> +
> +	cmd git clone ${dpdkroot} ${dst}/${1}
> +	cmd cd ${dst}/${1}
> +
> +	log "INFO" "Checking out version ${1} of the dpdk"
> +	# Move to the old version of the tree
> +	cmd git checkout ${1}
> +
> +	fixup_config
> +
> +	# Now configure the build
> +	log "INFO" "Configuring DPDK ${1}"
> +	cmd make config T=$target O=$target
> +
> +	# Checking abi compliance relies on using the dwarf information in
> +	# the shared objects. Build with -g to include them.
> +	log "INFO" "Building DPDK ${1}. This might take a moment"
> +	cmd make -j$parallel O=$target V=1 EXTRA_CFLAGS="-g -Og -Wno-error" \
> +	    EXTRA_LDFLAGS="-g" || log "INFO" "The build failed"
> +
> +	# Move to the lib directory
> +	cmd cd ${PWD}/$target/lib
> +	log "INFO" "Collecting ABI information for ${1}"
> +	for i in *.so; do
> +		[ -e "$i" ] || break
> +		cmd $abidump ${i} -o $dst/${1}/${i}.dump -lver ${1} || true
> +		# hack to ignore empty SymbolsInfo section (no public ABI)
> +		if grep -q "'SymbolInfo' => {}," $dst/${1}/${i}.dump \
> +				2> /dev/null; then
> +			log "INFO" "${i} has no public ABI, remove dump file"
> +			cmd rm -f $dst/${1}/${i}.dump
> +		fi
> +	done
> +}
>  
> -#trap on ctrl-c to clean up
> -trap cleanup_and_exit SIGINT
> +verbose=false
> +parallel=1
> +dst=${default_dst}
> +target=${default_target}
> +force=0
> +while getopts j:vd:t:fh ARG ; do
> +	case $ARG in
> +		j ) parallel=$OPTARG ;;
> +		v ) verbose=true ;;
> +		d ) dst=$OPTARG ;;
> +		t ) target=$OPTARG ;;
> +		f ) force=1 ;;
> +		h ) print_usage ; exit 0 ;;
> +		? ) print_usage ; exit 1 ;;
> +	esac
> +done
> +shift $(($OPTIND - 1))
>  
> -if [ -z "$DPDK_MAKE_JOBS" ]
> -then
> -	# This counts the number of cpus on the system
> -	if [ -e /usr/bin/lscpu ]
> -	then
> -		DPDK_MAKE_JOBS=`lscpu -p=cpu | grep -v "#" | wc -l`
> -	else
> -		DPDK_MAKE_JOBS=1
> -	fi
> +if [ $# != 2 ]; then
> +	print_usage
> +	exit 1
>  fi
>  
> -#Save the current branch
> -CURRENT_BRANCH=`git branch | grep \* | cut -d' ' -f2`
> +tag1=$1
> +tag2=$2
>  
> -if [ -z "$CURRENT_BRANCH" ]
> -then
> -	CURRENT_BRANCH=`git log --pretty=format:%H HEAD~1..HEAD`
> -fi
> +# convert path to absolute
> +case "${dst}" in
> +	/*) ;;
> +	*) dst=${PWD}/${dst} ;;
> +esac
> +dpdkroot=$(readlink -e $(dirname $0)/..)
>  
> -if [ -n "$VERBOSE" ]
> -then
> -	export VERBOSE=/dev/stdout
> -else
> -	export VERBOSE=/dev/null
> +if [ -e "${dst}" -a "$force" = 0 ]; then
> +	echo "The ${dst} directory is not empty. Remove it, use another"
> +	echo "one (-d <dir>), or force overriding (-f)"
> +	exit 1
>  fi
>  
> -# Validate that we have all the arguments we need
> -res=$(validate_args)
> -if [ -n "$res" ]
> -then
> -	echo $res
> -	usage
> -	cleanup_and_exit 1
> -fi
> +rm -rf ${dst}
> +mkdir -p ${dst}
> +set_log_file ${dst}/abi-check.log
> +log "INFO" "Logs available in ${dst}/abi-check.log"
>  
> -HASH1=$(git show -s --format=%H "$TAG1" -- 2> /dev/null | tail -1)
> -HASH2=$(git show -s --format=%H "$TAG2" -- 2> /dev/null | tail -1)
> +command -v ${abicheck} || log "INFO" "Can't find ${abicheck} utility"
> +command -v ${abidump} || log "INFO" "Can't find ${abidump} utility"
>  
> -# Make sure our tags exist
> -res=$(validate_tags)
> -if [ -n "$res" ]
> -then
> -	echo $res
> -	cleanup_and_exit 1
> -fi
> +hash1=$(git show -s --format=%h "$tag1" -- 2> /dev/null | tail -1)
> +hash2=$(git show -s --format=%h "$tag2" -- 2> /dev/null | tail -1)
>  
>  # Make hashes available in output for non-local reference
> -TAG1="$TAG1 ($HASH1)"
> -TAG2="$TAG2 ($HASH2)"
> -
> -ABICHECK=`which abi-compliance-checker 2>/dev/null`
> -if [ $? -ne 0 ]
> -then
> -	log "INFO" "Can't find abi-compliance-checker utility"
> -	cleanup_and_exit 1
> -fi
> -
> -ABIDUMP=`which abi-dumper 2>/dev/null`
> -if [ $? -ne 0 ]
> -then
> -	log "INFO" "Can't find abi-dumper utility"
> -	cleanup_and_exit 1
> -fi
> +tag1="$tag1 ($hash1)"
> +tag2="$tag2 ($hash2)"
>  
> -log "INFO" "We're going to check and make sure that applications built"
> -log "INFO" "against DPDK DSOs from version $TAG1 will still run when executed"
> -log "INFO" "against DPDK DSOs built from version $TAG2."
> -log "INFO" ""
> -
> -# Check to make sure we have a clean tree
> -git status | grep -q clean
> -if [ $? -ne 0 ]
> -then
> -	log "WARN" "Working directory not clean, aborting"
> -	cleanup_and_exit 1
> +if [ "$hash1" = "$hash2" ]; then
> +	log "ERROR" "$tag1 and $tag2 are the same revisions"
> +	exit 1
>  fi
>  
> -# Move to the root of the git tree
> -cd $(dirname $0)/..
> +cmd mkdir -p ${dst}
>  
> -log "INFO" "Checking out version $TAG1 of the dpdk"
> -# Move to the old version of the tree
> -git checkout $HASH1
> +# dump abi for each revision
> +gen_abi ${hash1}
> +gen_abi ${hash2}
>  
> -fixup_config
> +# compare the abi dumps
> +cmd cd ${dst}
> +ret=0
> +list=""
> +for i in ${hash2}/*.dump; do
> +	name=`basename $i`
> +	libname=${name%.dump}
>  
> -# Checking abi compliance relies on using the dwarf information in
> -# The shared objects.  Thats only included in the DSO's if we build
> -# with -g
> -export EXTRA_CFLAGS="$EXTRA_CFLAGS -g -O0"
> -export EXTRA_LDFLAGS="$EXTRA_LDFLAGS -g"
> -
> -# Now configure the build
> -log "INFO" "Configuring DPDK $TAG1"
> -make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
> -
> -log "INFO" "Building DPDK $TAG1. This might take a moment"
> -make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1
> -
> -if [ $? -ne 0 ]
> -then
> -	log "INFO" "THE BUILD FAILED.  ABORTING"
> -	cleanup_and_exit 1
> -fi
> +	if [ ! -f ${hash1}/$name ]; then
> +		log "INFO" "$NAME does not exist in $tag1. skipping..."
> +		continue
> +	fi
>  
> -# Move to the lib directory
> -cd $TARGET/lib
> -log "INFO" "COLLECTING ABI INFORMATION FOR $TAG1"
> -for i in `ls *.so`
> -do
> -	$ABIDUMP $i -o $ABI_DIR/$i-ABI-0.dump -lver $HASH1
> +	local_ret=0
> +	cmd $abicheck -l $libname \
> +	    -old ${hash1}/$name -new ${hash2}/$name || local_ret=$?
> +	if [ $local_ret != 0 ]; then
> +		log "NOTICE" "$abicheck returned $local_ret"
> +		ret=$local_ret
> +		list="$list $libname"
> +	fi
>  done
> -cd ../..
> -
> -# Now clean the tree, checkout the second tag, and rebuild
> -git clean -f -d
> -git reset --hard
> -# Move to the new version of the tree
> -log "INFO" "Checking out version $TAG2 of the dpdk"
> -git checkout $HASH2
> -
> -fixup_config
> -
> -# Now configure the build
> -log "INFO" "Configuring DPDK $TAG2"
> -make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
> -
> -log "INFO" "Building DPDK $TAG2. This might take a moment"
> -make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1
>  
> -if [ $? -ne 0 ]
> -then
> -	log "INFO" "THE BUILD FAILED.  ABORTING"
> -	cleanup_and_exit 1
> +if [ $ret != 0 ]; then
> +	log "NOTICE" "ABI may be incompatible, check reports/logs for details."
> +	log "NOTICE" "Incompatible list: $list"
> +else
> +	log "NOTICE" "No error detected, ABI is compatible."
>  fi
>  
> -cd $TARGET/lib
> -log "INFO" "COLLECTING ABI INFORMATION FOR $TAG2"
> -for i in `ls *.so`
> -do
> -	$ABIDUMP $i -o $ABI_DIR/$i-ABI-1.dump -lver $HASH2
> -done
> -cd ../..
> -
> -# Start comparison of ABI dumps
> -for i in `ls $ABI_DIR/*-1.dump`
> -do
> -	NEWNAME=`basename $i`
> -	OLDNAME=`basename $i | sed -e"s/1.dump/0.dump/"`
> -	LIBNAME=`basename $i | sed -e"s/-ABI-1.dump//"`
> -
> -	if [ ! -f $ABI_DIR/$OLDNAME ]
> -	then
> -		log "INFO" "$OLDNAME DOES NOT EXIST IN $TAG1. SKIPPING..."
> -	fi
> -
> -	#compare the abi dumps
> -	$ABICHECK -l $LIBNAME -old $ABI_DIR/$OLDNAME -new $ABI_DIR/$NEWNAME
> -done
> +log "INFO" "Logs are in ${dst}/abi-check.log"
> +log "INFO" "HTML reports are in ${dst}/compat_reports directory"
>  
> -git reset --hard
> -log "INFO" "ABI CHECK COMPLETE.  REPORTS ARE IN compat_report directory"
> -cleanup_and_exit 0
> +exit $ret
> -- 
> 2.11.0
> 
> 

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [RFC] Wireless Base Band Device (bbdev)
  @ 2017-09-21 14:56  3% ` Thomas Monjalon
  2017-10-03 14:29  0%   ` Mokhtar, Amr
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2017-09-21 14:56 UTC (permalink / raw)
  To: Amr Mokhtar; +Cc: dev

25/08/2017 15:46, Amr Mokhtar:
> +/**
> + * Configure a device.
> + * This function must be called on a device before setting up the queues and
> + * starting the device. It can also be called when a device is in the stopped
> + * state. If any device queues have been configured their configuration will be
> + * cleared by a call to this function.
> + *
> + * @param dev_id
> + *   The identifier of the device.
> + * @param num_queues
> + *   Number of queues to configure on device.
> + * @param conf
> + *   The device configuration. If NULL, a default configuration will be used.
> + *
> + * @return
> + *   - 0 on success
> + *   - EINVAL if num_queues is invalid, 0 or greater than maximum
> + *   - EBUSY if the identified device has already started
> + *   - ENOMEM if unable to allocate memory
> + */
> +int
> +rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues,
> +		const struct rte_bbdev_conf *conf);

I am not convinced by the "configure all" function in ethdev.
We break the ABI each time we add a new feature to configure.
And it does not really help to have all configurations in one struct.
Would you mind to split the struct rte_bbdev_conf and split
the function accordingly?

[...]
> +struct rte_bbdev_info {
> +	int socket_id;  /**< NUMA socket that device is on */
> +	const char *dev_name;  /**< Unique device name */
> +	const struct rte_pci_device *pci_dev;  /**< PCI information */
> +	unsigned int num_queues;  /**< Number of queues currently configured */
> +	struct rte_bbdev_conf conf;  /**< Current device configuration */
> +	bool started;  /**< Set if device is currently started */
> +	struct rte_bbdev_driver_info drv;  /**< Info from device driver */
> +};

As Stephen said, PCI must not appear in this API.
Please use the bus abstraction.

[...]
> +struct __rte_cache_aligned rte_bbdev {
> +	rte_bbdev_enqueue_ops_t enqueue_ops; /**< Enqueue function */
> +	rte_bbdev_dequeue_ops_t dequeue_ops;  /**< Dequeue function */
> +	const struct rte_bbdev_ops *dev_ops;  /**< Functions exported by PMD */
> +	struct rte_bbdev_data *data;  /**< Pointer to device data */
> +	bool attached;  /**< If device is currently attached or not */

What "attached" means?
I'm afraid you are trying to manage hotplug in the wrong layer.

> +	struct rte_device *device; /**< Backing device (HW only) */

SW port should have also a rte_device (vdev).

[...]
> +/** Data input and output buffer for Turbo operations */
> +struct rte_bbdev_op_data {

Why there is no "turbo" word in the name of this struct?

> +	struct rte_mbuf *data;
> +	/**< First mbuf segment with input/output data. */
> +	uint32_t offset;
> +	/**< The starting point for the Turbo input/output, in bytes, from the
> +	 * start of the data in the data buffer. It must be smaller than
> +	 * data_len of the mbuf's first segment!
> +	 */
> +	uint32_t length;
> +	/**< For input operations: the length, in bytes, of the source buffer
> +	 * on which the Turbo encode/decode will be computed.
> +	 * For output operations: the length, in bytes, of the output buffer
> +	 * of the Turbo operation.
> +	 */
> +};

[...]
> +/** Structure specifying a single operation */
> +struct rte_bbdev_op {
> +	enum rte_bbdev_op_type type;  /**< Type of this operation */
> +	int status;  /**< Status of operation that was performed */
> +	struct rte_mempool *mempool;  /**< Mempool which op instance is in */
> +	void *opaque_data;  /**< Opaque pointer for user data */
> +	/**
> +	 * Anonymous union of operation-type specific parameters. When allocated
> +	 * using rte_bbdev_op_pool_create(), space is allocated for the
> +	 * parameters at the end of each rte_bbdev_op structure, and the
> +	 * pointers here point to it.
> +	 */
> +	RTE_STD_C11
> +	union {
> +		void *generic;
> +		struct rte_bbdev_op_turbo_dec *turbo_dec;
> +		struct rte_bbdev_op_turbo_enc *turbo_enc;
> +	};
> +};

I am not sure it is a good idea to fit every operations in the
same struct and the same functions.

[...]
> +/**
> + * Helper macro for logging
> + *
> + * @param level
> + *   Log level: EMERG, ALERT, CRIT, ERR, WARNING, NOTICE, INFO, or DEBUG
> + * @param fmt
> + *   The format string, as in printf(3).
> + * @param ...
> + *   The variable arguments required by the format string.
> + *
> + * @return
> + *   - 0 on success
> + *   - Negative on error
> + */
> +#define rte_bbdev_log(level, fmt, ...) \
> +		RTE_LOG(level, BBDEV, fmt "\n", ##__VA_ARGS__)

This is the legacy log system.
Please use dynamic log type.

[...]
> +#ifdef RTE_LIBRTE_BBDEV_DEBUG
> +#define rte_bbdev_log_verbose(fmt, ...)  rte_bbdev_log_debug(fmt, ##__VA_ARGS__)
> +#else
> +#define rte_bbdev_log_verbose(fmt, ...)
> +#endif

With the new log functions, you do not need to disable debug log
at compilation time.

> +/**
> + *  Initialisation params structure that can be used by software based drivers
> + */
> +struct rte_bbdev_init_params {
> +	int socket_id;  /**< Base band null device socket */
> +	uint16_t queues_num;  /**< Base band null device queues number */
> +};
> +
> +/**
> + * Parse generic parameters that could be used for software based devices.
> + *
> + * @param params
> + *   Pointer to structure that will hold the parsed parameters.
> + * @param input_args
> + *   Pointer to arguments to be parsed.
> + *
> + * @return
> + *   - 0 on success
> + *   - EINVAL if invalid parameter pointer is provided
> + *   - EFAULT if unable to parse provided arguments
> + */
> +int
> +rte_bbdev_parse_params(struct rte_bbdev_init_params *params,
> +		const char *input_args);

I do not understand the intent of these parameters.
Are they common to every PMDs?
Or could they be moved in software PMDs?

End of this first review pass :)

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI versioning
  2017-09-21  8:32  8%     ` [dpdk-dev] [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
@ 2017-09-21 10:36  4%       ` Ferruh Yigit
  2017-09-22  2:02  4%         ` Yang, Zhiyong
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2017-09-21 10:36 UTC (permalink / raw)
  To: Zhiyong Yang, dev; +Cc: thomas

On 9/21/2017 9:32 AM, Zhiyong Yang wrote:
> There are two bonding APIs using ABI versioning, and both have
> port_id as parameter. Since we are already breaking ABI, no need
> to keep older versions of APIs.
> 
> Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>

<...>

> -int
> -rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
> +rte_eth_bond_8023ad_conf_get(uint8_t port_id,
>  		struct rte_eth_bond_8023ad_conf *conf)
>  {
>  	struct rte_eth_dev *bond_dev;
> @@ -1409,10 +1320,6 @@ rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
>  	bond_mode_8023ad_conf_get_v1708(bond_dev, conf);

I am aware this is not focus of the patchset, but it would be good to
rename this function too and remove _v1708 suffix.

It seems there is already a function named "bond_mode_8023ad_conf_get"
and after removed code, "bond_mode_8023ad_conf_get" only called by
"bond_mode_8023ad_conf_get_v1708":

bond_mode_8023ad_conf_get_v1708()
   bond_mode_8023ad_conf_get()

So it is possible to merge them into name "bond_mode_8023ad_conf_get()"

Thanks,
ferruh

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v4 2/5] ethdev: increase port_id range
  2017-09-21  8:32  4%   ` [dpdk-dev] [PATCH v4 0/5] " Zhiyong Yang
  2017-09-21  8:32  8%     ` [dpdk-dev] [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
@ 2017-09-21  8:32  1%     ` Zhiyong Yang
  2017-09-25  3:22  4%     ` [dpdk-dev] [PATCH v5 0/5] " Zhiyong Yang
  2 siblings, 0 replies; 200+ results
From: Zhiyong Yang @ 2017-09-21  8:32 UTC (permalink / raw)
  To: dev; +Cc: thomas, ferruh.yigit, Zhiyong Yang

Extend port_id definition from uint8_t to uint16_t in lib and drivers
data structures, specifically rte_eth_dev_data. Modify the APIs,
drivers and app using port_id at the same time.

Fix some checkpatch issues from the original code and remove some
unnecessary cast operations.

release_17_11 and deprecation have been updated in the patch.

Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
---
 app/pdump/main.c                                  |   2 +-
 app/test-pmd/cmdline.c                            |   6 +-
 app/test-pmd/config.c                             |   4 +-
 app/test-pmd/ieee1588fwd.c                        |  26 ++-
 app/test-pmd/parameters.c                         |   2 +-
 app/test-pmd/rxonly.c                             |   2 +-
 app/test-pmd/testpmd.c                            |  18 +-
 app/test-pmd/testpmd.h                            |   4 +-
 doc/guides/rel_notes/deprecation.rst              |   6 -
 doc/guides/rel_notes/release_17_11.rst            |  18 +-
 drivers/net/af_packet/Makefile                    |   2 +-
 drivers/net/af_packet/rte_eth_af_packet.c         |   2 +-
 drivers/net/ark/ark_ethdev.c                      |   2 +-
 drivers/net/avp/Makefile                          |   2 +-
 drivers/net/avp/avp_ethdev.c                      |   2 +-
 drivers/net/bnx2x/Makefile                        |   2 +-
 drivers/net/bnx2x/bnx2x_rxtx.h                    |   4 +-
 drivers/net/bnxt/Makefile                         |   2 +-
 drivers/net/bnxt/bnxt.h                           |   2 +-
 drivers/net/bnxt/bnxt_ethdev.c                    |   4 +-
 drivers/net/bnxt/bnxt_rxq.h                       |   2 +-
 drivers/net/bnxt/bnxt_txq.h                       |   2 +-
 drivers/net/bnxt/rte_pmd_bnxt.c                   |  32 +--
 drivers/net/bnxt/rte_pmd_bnxt.h                   |  32 +--
 drivers/net/bonding/Makefile                      |   2 +-
 drivers/net/bonding/rte_eth_bond.h                |  42 ++--
 drivers/net/bonding/rte_eth_bond_8023ad.c         |  60 +++---
 drivers/net/bonding/rte_eth_bond_8023ad.h         |  30 +--
 drivers/net/bonding/rte_eth_bond_8023ad_private.h |  12 +-
 drivers/net/bonding/rte_eth_bond_alb.c            |   6 +-
 drivers/net/bonding/rte_eth_bond_alb.h            |   6 +-
 drivers/net/bonding/rte_eth_bond_api.c            |  64 +++---
 drivers/net/bonding/rte_eth_bond_args.c           |   2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c            |  62 +++---
 drivers/net/bonding/rte_eth_bond_private.h        |  45 ++--
 drivers/net/e1000/Makefile                        |   2 +-
 drivers/net/e1000/em_ethdev.c                     |   2 +-
 drivers/net/e1000/em_rxtx.c                       |   4 +-
 drivers/net/e1000/igb_rxtx.c                      |   4 +-
 drivers/net/failsafe/Makefile                     |   2 +-
 drivers/net/failsafe/failsafe_ether.c             |   4 +-
 drivers/net/failsafe/failsafe_private.h           |   4 +-
 drivers/net/fm10k/Makefile                        |   2 +-
 drivers/net/fm10k/fm10k.h                         |   6 +-
 drivers/net/i40e/Makefile                         |   2 +-
 drivers/net/i40e/i40e_ethdev.c                    |   5 +-
 drivers/net/i40e/i40e_rxtx.h                      |   4 +-
 drivers/net/i40e/rte_pmd_i40e.c                   |  50 ++---
 drivers/net/i40e/rte_pmd_i40e.h                   |  48 ++---
 drivers/net/ixgbe/Makefile                        |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c                  |   5 +-
 drivers/net/ixgbe/ixgbe_rxtx.h                    |   4 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c                 |  60 +++---
 drivers/net/ixgbe/rte_pmd_ixgbe.h                 |  64 +++---
 drivers/net/mlx5/mlx5_rxtx.h                      |   4 +-
 drivers/net/nfp/nfp_net.c                         |  16 +-
 drivers/net/nfp/nfp_net_pmd.h                     |   2 +-
 drivers/net/null/Makefile                         |   2 +-
 drivers/net/null/rte_eth_null.c                   |   2 +-
 drivers/net/pcap/Makefile                         |   2 +-
 drivers/net/pcap/rte_eth_pcap.c                   |   2 +-
 drivers/net/qede/qede_if.h                        |   2 +-
 drivers/net/ring/rte_eth_ring.c                   |   2 +-
 drivers/net/szedata2/rte_eth_szedata2.c           |   2 +-
 drivers/net/thunderx/nicvf_struct.h               |   2 +-
 drivers/net/vhost/Makefile                        |   2 +-
 drivers/net/vhost/rte_eth_vhost.c                 |   6 +-
 drivers/net/vhost/rte_eth_vhost.h                 |   4 +-
 drivers/net/virtio/Makefile                       |   2 +-
 drivers/net/virtio/virtio_pci.h                   |   2 +-
 drivers/net/virtio/virtio_rxtx.h                  |   6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h                |   4 +-
 lib/librte_bitratestats/Makefile                  |   2 +-
 lib/librte_bitratestats/rte_bitrate.c             |   2 +-
 lib/librte_bitratestats/rte_bitrate.h             |   2 +-
 lib/librte_ether/Makefile                         |   2 +-
 lib/librte_ether/rte_ethdev.c                     | 241 +++++++++++-----------
 lib/librte_ether/rte_ethdev.h                     | 238 ++++++++++-----------
 lib/librte_ether/rte_flow.c                       |   2 +-
 lib/librte_ether/rte_flow_driver.h                |   2 +-
 lib/librte_ether/rte_tm.c                         |  62 +++---
 lib/librte_ether/rte_tm.h                         |  60 +++---
 lib/librte_ether/rte_tm_driver.h                  |   2 +-
 lib/librte_kni/Makefile                           |   2 +-
 lib/librte_kni/rte_kni.h                          |   6 +-
 lib/librte_latencystats/rte_latencystats.c        |  12 +-
 lib/librte_pdump/Makefile                         |   2 +-
 lib/librte_pdump/rte_pdump.c                      |  16 +-
 lib/librte_pdump/rte_pdump.h                      |   4 +-
 lib/librte_port/Makefile                          |   2 +-
 lib/librte_port/rte_port_ethdev.c                 |   6 +-
 lib/librte_port/rte_port_ethdev.h                 |   6 +-
 92 files changed, 773 insertions(+), 747 deletions(-)

diff --git a/app/pdump/main.c b/app/pdump/main.c
index 3b13753d9..090a50cfc 100644
--- a/app/pdump/main.c
+++ b/app/pdump/main.c
@@ -623,7 +623,7 @@ static void
 create_mp_ring_vdev(void)
 {
 	int i;
-	uint8_t portid;
+	uint16_t portid;
 	struct pdump_tuples *pt = NULL;
 	struct rte_mempool *mbuf_pool = NULL;
 	char vdev_args[SIZE];
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index ccdf239d6..d9d083888 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -4588,7 +4588,7 @@ struct cmd_show_bonding_config_result {
 	cmdline_fixed_string_t show;
 	cmdline_fixed_string_t bonding;
 	cmdline_fixed_string_t config;
-	uint8_t port_id;
+	portid_t port_id;
 };
 
 static void cmd_show_bonding_config_parsed(void *parsed_result,
@@ -4597,7 +4597,7 @@ static void cmd_show_bonding_config_parsed(void *parsed_result,
 {
 	struct cmd_show_bonding_config_result *res = parsed_result;
 	int bonding_mode, agg_mode;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	portid_t slaves[RTE_MAX_ETHPORTS];
 	int num_slaves, num_active_slaves;
 	int primary_id;
 	int i;
@@ -11500,7 +11500,7 @@ struct cmd_vf_vlan_stripq_result {
 	cmdline_fixed_string_t vf;
 	cmdline_fixed_string_t vlan;
 	cmdline_fixed_string_t stripq;
-	uint8_t port_id;
+	portid_t port_id;
 	uint16_t vf_id;
 	cmdline_fixed_string_t on_off;
 };
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 3ae3e1cd8..155136dd5 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -358,7 +358,7 @@ rx_queue_infos_display(portid_t port_id, uint16_t queue_id)
 
 	rc = rte_eth_rx_queue_info_get(port_id, queue_id, &qinfo);
 	if (rc != 0) {
-		printf("Failed to retrieve information for port: %hhu, "
+		printf("Failed to retrieve information for port: %u, "
 			"RX queue: %hu\nerror desc: %s(%d)\n",
 			port_id, queue_id, strerror(-rc), rc);
 		return;
@@ -391,7 +391,7 @@ tx_queue_infos_display(portid_t port_id, uint16_t queue_id)
 
 	rc = rte_eth_tx_queue_info_get(port_id, queue_id, &qinfo);
 	if (rc != 0) {
-		printf("Failed to retrieve information for port: %hhu, "
+		printf("Failed to retrieve information for port: %u, "
 			"TX queue: %hu\nerror desc: %s(%d)\n",
 			port_id, queue_id, strerror(-rc), rc);
 		return;
diff --git a/app/test-pmd/ieee1588fwd.c b/app/test-pmd/ieee1588fwd.c
index 51170ee3e..91ee78646 100644
--- a/app/test-pmd/ieee1588fwd.c
+++ b/app/test-pmd/ieee1588fwd.c
@@ -86,12 +86,11 @@ port_ieee1588_rx_timestamp_check(portid_t pi, uint32_t index)
 	struct timespec timestamp = {0, 0};
 
 	if (rte_eth_timesync_read_rx_timestamp(pi, &timestamp, index) < 0) {
-		printf("Port %u RX timestamp registers not valid\n",
-		       (unsigned) pi);
+		printf("Port %u RX timestamp registers not valid\n", pi);
 		return;
 	}
 	printf("Port %u RX timestamp value %lu s %lu ns\n",
-	       (unsigned) pi, timestamp.tv_sec, timestamp.tv_nsec);
+		pi, timestamp.tv_sec, timestamp.tv_nsec);
 }
 
 #define MAX_TX_TMST_WAIT_MICROSECS 1000 /**< 1 milli-second */
@@ -110,12 +109,12 @@ port_ieee1588_tx_timestamp_check(portid_t pi)
 	if (wait_us >= MAX_TX_TMST_WAIT_MICROSECS) {
 		printf("Port %u TX timestamp registers not valid after "
 		       "%u micro-seconds\n",
-		       (unsigned) pi, (unsigned) MAX_TX_TMST_WAIT_MICROSECS);
+		       pi, MAX_TX_TMST_WAIT_MICROSECS);
 		return;
 	}
 	printf("Port %u TX timestamp value %lu s %lu ns validated after "
 	       "%u micro-second%s\n",
-	       (unsigned) pi, timestamp.tv_sec, timestamp.tv_nsec, wait_us,
+	       pi, timestamp.tv_sec, timestamp.tv_nsec, wait_us,
 	       (wait_us == 1) ? "" : "s");
 }
 
@@ -148,11 +147,11 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 		if (eth_type == ETHER_TYPE_1588) {
 			printf("Port %u Received PTP packet not filtered"
 			       " by hardware\n",
-			       (unsigned) fs->rx_port);
+			       fs->rx_port);
 		} else {
 			printf("Port %u Received non PTP packet type=0x%4x "
 			       "len=%u\n",
-			       (unsigned) fs->rx_port, eth_type,
+			       fs->rx_port, eth_type,
 			       (unsigned) mb->pkt_len);
 		}
 		rte_pktmbuf_free(mb);
@@ -161,7 +160,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (eth_type != ETHER_TYPE_1588) {
 		printf("Port %u Received NON PTP packet incorrectly"
 		       " detected by hardware\n",
-		       (unsigned) fs->rx_port);
+		       fs->rx_port);
 		rte_pktmbuf_free(mb);
 		return;
 	}
@@ -175,19 +174,19 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (ptp_hdr->version != 0x02) {
 		printf("Port %u Received PTP V2 Ethernet frame with wrong PTP"
 		       " protocol version 0x%x (should be 0x02)\n",
-		       (unsigned) fs->rx_port, ptp_hdr->version);
+		       fs->rx_port, ptp_hdr->version);
 		rte_pktmbuf_free(mb);
 		return;
 	}
 	if (ptp_hdr->msg_id != PTP_SYNC_MESSAGE) {
 		printf("Port %u Received PTP V2 Ethernet frame with unexpected"
 		       " message ID 0x%x (expected 0x0 - PTP_SYNC_MESSAGE)\n",
-		       (unsigned) fs->rx_port, ptp_hdr->msg_id);
+		       fs->rx_port, ptp_hdr->msg_id);
 		rte_pktmbuf_free(mb);
 		return;
 	}
 	printf("Port %u IEEE1588 PTP V2 SYNC Message filtered by hardware\n",
-	       (unsigned) fs->rx_port);
+	       fs->rx_port);
 
 	/*
 	 * Check that the received PTP packet has been timestamped by the
@@ -196,7 +195,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	if (! (mb->ol_flags & PKT_RX_IEEE1588_TMST)) {
 		printf("Port %u Received PTP packet not timestamped"
 		       " by hardware\n",
-		       (unsigned) fs->rx_port);
+		       fs->rx_port);
 		rte_pktmbuf_free(mb);
 		return;
 	}
@@ -216,8 +215,7 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
 	mb->ol_flags |= PKT_TX_IEEE1588_TMST;
 	fs->tx_packets += 1;
 	if (rte_eth_tx_burst(fs->rx_port, fs->tx_queue, &mb, 1) == 0) {
-		printf("Port %u sent PTP packet dropped\n",
-		       (unsigned) fs->rx_port);
+		printf("Port %u sent PTP packet dropped\n", fs->rx_port);
 		fs->fwd_dropped += 1;
 		rte_pktmbuf_free(mb);
 		return;
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 2f7f70fd6..31287d71d 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -734,7 +734,7 @@ launch_args_parse(int argc, char** argv)
 			if (!strcmp(lgopts[opt_idx].name, "nb-ports")) {
 				n = atoi(optarg);
 				if (n > 0 && n <= nb_ports)
-					nb_fwd_ports = (uint8_t) n;
+					nb_fwd_ports = n;
 				else
 					rte_exit(EXIT_FAILURE,
 						 "Invalid port %d\n", n);
diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c
index 5ef021905..57df01468 100644
--- a/app/test-pmd/rxonly.c
+++ b/app/test-pmd/rxonly.c
@@ -122,7 +122,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 	 */
 	if (verbose_level > 0)
 		printf("port %u/queue %u: received %u packets\n",
-		       (unsigned) fs->rx_port,
+		       fs->rx_port,
 		       (unsigned) fs->rx_queue,
 		       (unsigned) nb_rx);
 	for (i = 0; i < nb_rx; i++) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index e097ee04e..477e2e7ad 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -390,7 +390,7 @@ struct gro_status gro_ports[RTE_MAX_ETHPORTS];
 /* Forward function declarations */
 static void map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port);
 static void check_all_ports_link_status(uint32_t port_mask);
-static int eth_event_callback(uint8_t port_id,
+static int eth_event_callback(portid_t port_id,
 			      enum rte_eth_event_type type,
 			      void *param, void *ret_param);
 
@@ -1816,7 +1816,8 @@ check_all_ports_link_status(uint32_t port_mask)
 {
 #define CHECK_INTERVAL 100 /* 100ms */
 #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */
-	uint8_t portid, count, all_ports_up, print_flag = 0;
+	portid_t portid;
+	uint8_t count, all_ports_up, print_flag = 0;
 	struct rte_eth_link link;
 
 	printf("Checking link statuses...\n");
@@ -1831,14 +1832,13 @@ check_all_ports_link_status(uint32_t port_mask)
 			/* print link status if flag set */
 			if (print_flag == 1) {
 				if (link.link_status)
-					printf("Port %d Link Up - speed %u "
-						"Mbps - %s\n", (uint8_t)portid,
-						(unsigned)link.link_speed,
+					printf(
+					"Port%d Link Up. speed %u Mbps- %s\n",
+					portid, link.link_speed,
 				(link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
 					("full-duplex") : ("half-duplex\n"));
 				else
-					printf("Port %d Link Down\n",
-						(uint8_t)portid);
+					printf("Port %d Link Down\n", portid);
 				continue;
 			}
 			/* clear all_ports_up flag if any link down */
@@ -1885,7 +1885,7 @@ rmv_event_callback(void *arg)
 
 /* This function is used by the interrupt thread */
 static int
-eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param,
+eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
 		  void *ret_param)
 {
 	static const char * const event_desc[] = {
@@ -2328,7 +2328,7 @@ int
 main(int argc, char** argv)
 {
 	int  diag;
-	uint8_t port_id;
+	portid_t port_id;
 
 	signal(SIGINT, signal_handler);
 	signal(SIGTERM, signal_handler);
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 1d1ee7587..657c1235c 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -78,7 +78,7 @@
 #define UMA_NO_CONFIG  0xFF
 
 typedef uint8_t  lcoreid_t;
-typedef uint8_t  portid_t;
+typedef uint16_t portid_t;
 typedef uint16_t queueid_t;
 typedef uint16_t streamid_t;
 
@@ -283,7 +283,7 @@ enum dcb_mode_enable
 #define MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128 rx_queues/port */
 
 struct queue_stats_mappings {
-	uint8_t port_id;
+	portid_t port_id;
 	uint16_t queue_id;
 	uint8_t stats_counter_id;
 } __rte_cache_aligned;
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 3362f3350..45eb5c4a9 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -76,12 +76,6 @@ Deprecation Notices
   done by the EAL and not by the ``ethdev`` layer anymore. Users relying on this
   flag being present only have to remove their checks to follow the change.
 
-* ABI/API changes are planned for 17.11 in all structures which include port_id
-  definition such as "rte_eth_dev_data", "rte_port_ethdev_reader_params",
-  "rte_port_ethdev_writer_params", and so on. The definition of port_id will be
-  changed from 8 bits to 16 bits in order to support more than 256 ports in
-  DPDK. All APIs which have port_id parameter will be changed at the same time.
-
 * ethdev: An ABI change is planned for 17.11 for the structure rte_eth_dev_data.
   The size of the unique name will increase RTE_ETH_NAME_MAX_LEN from 32 to
   64 characters to allow using a globally unique identifier (GUID) in this field.
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8bf91bd40..6ff730e9e 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -41,6 +41,11 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Extended port_id range from uint8_t to uint16_t.**
+
+  Increased port_id range from 8 bits to 16 bits in order to support more than
+  256 ports in dpdk. All ethdev APIs which have port_id parameter are changed
+  in the meantime.
 
 Resolved Issues
 ---------------
@@ -144,7 +149,10 @@ ABI Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* **Extended port_id range.**
 
+  The size of the field ``port_id`` in the ``rte_eth_dev_data`` structure
+  changed, as described in the `New Features` section.
 
 Shared Library Versions
 -----------------------
@@ -165,19 +173,19 @@ The libraries prepended with a plus sign were incremented in this version.
 .. code-block:: diff
 
      librte_acl.so.2
-     librte_bitratestats.so.1
+     librte_bitratestats.so.2
      librte_cfgfile.so.2
      librte_cmdline.so.2
      librte_cryptodev.so.3
      librte_distributor.so.1
      librte_eal.so.5
-     librte_ethdev.so.7
+     librte_ethdev.so.8
      librte_eventdev.so.2
      librte_gro.so.1
      librte_hash.so.2
      librte_ip_frag.so.1
      librte_jobstats.so.1
-     librte_kni.so.2
+     librte_kni.so.3
      librte_kvargs.so.1
      librte_latencystats.so.1
      librte_lpm.so.2
@@ -186,11 +194,11 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_meter.so.1
      librte_metrics.so.1
      librte_net.so.1
-     librte_pdump.so.1
+     librte_pdump.so.2
      librte_pipeline.so.3
      librte_pmd_bond.so.1
      librte_pmd_ring.so.2
-     librte_port.so.3
+     librte_port.so.4
      librte_power.so.1
      librte_reorder.so.1
      librte_ring.so.1
diff --git a/drivers/net/af_packet/Makefile b/drivers/net/af_packet/Makefile
index 70d517c16..4d62b7dbd 100644
--- a/drivers/net/af_packet/Makefile
+++ b/drivers/net/af_packet/Makefile
@@ -40,7 +40,7 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index 9a47852ca..483b0c107 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -75,7 +75,7 @@ struct pkt_rx_queue {
 	unsigned int framenum;
 
 	struct rte_mempool *mb_pool;
-	uint8_t in_port;
+	uint16_t in_port;
 
 	volatile unsigned long rx_pkts;
 	volatile unsigned long err_pkts;
diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c
index 6db362b04..893284733 100644
--- a/drivers/net/ark/ark_ethdev.c
+++ b/drivers/net/ark/ark_ethdev.c
@@ -641,7 +641,7 @@ eth_ark_dev_stop(struct rte_eth_dev *dev)
 	for (i = 0; i < dev->data->nb_tx_queues; i++) {
 		status = eth_ark_tx_queue_stop(dev, i);
 		if (status != 0) {
-			uint8_t port = dev->data->port_id;
+			uint16_t port = dev->data->port_id;
 			PMD_DRV_LOG(ERR,
 				    "tx_queue stop anomaly"
 				    " port %u, queue %u\n",
diff --git a/drivers/net/avp/Makefile b/drivers/net/avp/Makefile
index cd465aac9..7ffb4d172 100644
--- a/drivers/net/avp/Makefile
+++ b/drivers/net/avp/Makefile
@@ -42,7 +42,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_pmd_avp_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # install public header files to enable compilation of the hypervisor level
 # dpdk application
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index c746a0e2c..b5cc955f2 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -190,7 +190,7 @@ struct avp_dev {
 	struct rte_eth_dev_data *dev_data;
 	/**< Back pointer to ethernet device data */
 	volatile uint32_t flags; /**< Device operational flags */
-	uint8_t port_id; /**< Ethernet port identifier */
+	uint16_t port_id; /**< Ethernet port identifier */
 	struct rte_mempool *pool; /**< pkt mbuf mempool */
 	unsigned int guest_mbuf_size; /**< local pool mbuf size */
 	unsigned int host_mbuf_size; /**< host mbuf size */
diff --git a/drivers/net/bnx2x/Makefile b/drivers/net/bnx2x/Makefile
index e12310691..7a1c77523 100644
--- a/drivers/net/bnx2x/Makefile
+++ b/drivers/net/bnx2x/Makefile
@@ -12,7 +12,7 @@ LDLIBS += -lz
 
 EXPORT_MAP := rte_pmd_bnx2x_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 CFLAGS += -wd188 #188: enumerated type mixed with another type
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.h b/drivers/net/bnx2x/bnx2x_rxtx.h
index 2e38ec26a..9600e0f1c 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.h
+++ b/drivers/net/bnx2x/bnx2x_rxtx.h
@@ -41,7 +41,7 @@ struct bnx2x_rx_queue {
 	uint16_t                   rx_cq_head;           /**< Index of current rcq bd. */
 	uint16_t                   rx_cq_tail;           /**< Index of last rcq bd. */
 	uint16_t                   queue_id;             /**< RX queue index. */
-	uint8_t                    port_id;              /**< Device port identifier. */
+	uint16_t                   port_id;              /**< Device port identifier. */
 	struct bnx2x_softc           *sc;                  /**< Ptr to dev_private data. */
 };
 
@@ -62,7 +62,7 @@ struct bnx2x_tx_queue {
 	uint16_t                   nb_tx_avail;          /**< Number of TX descriptors available. */
 	uint16_t                   nb_tx_pages;          /**< number of TX pages */
 	uint16_t                   queue_id;             /**< TX queue index. */
-	uint8_t                    port_id;              /**< Device port identifier. */
+	uint16_t                   port_id;              /**< Device port identifier. */
 	struct bnx2x_softc           *sc;                  /**< Ptr to dev_private data */
 };
 
diff --git a/drivers/net/bnxt/Makefile b/drivers/net/bnxt/Makefile
index b03f65dc9..55b49b538 100644
--- a/drivers/net/bnxt/Makefile
+++ b/drivers/net/bnxt/Makefile
@@ -40,7 +40,7 @@ LIB = librte_pmd_bnxt.a
 
 EXPORT_MAP := rte_pmd_bnxt_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 405d94deb..26a9018b5 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -126,7 +126,7 @@ struct bnxt_pf_info {
 #define BNXT_FIRST_VF_FID	128
 #define BNXT_PF_RINGS_USED(bp)	bnxt_get_num_queues(bp)
 #define BNXT_PF_RINGS_AVAIL(bp)	(bp->pf.max_cp_rings - BNXT_PF_RINGS_USED(bp))
-	uint8_t			port_id;
+	uint16_t		port_id;
 	uint16_t		first_vf_id;
 	uint16_t		active_vfs;
 	uint16_t		max_vfs;
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index c9d11228b..2e817535e 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -489,13 +489,13 @@ static void bnxt_print_link_info(struct rte_eth_dev *eth_dev)
 
 	if (link->link_status)
 		RTE_LOG(INFO, PMD, "Port %d Link Up - speed %u Mbps - %s\n",
-			(uint8_t)(eth_dev->data->port_id),
+			eth_dev->data->port_id,
 			(uint32_t)link->link_speed,
 			(link->link_duplex == ETH_LINK_FULL_DUPLEX) ?
 			("full-duplex") : ("half-duplex\n"));
 	else
 		RTE_LOG(INFO, PMD, "Port %d Link Down\n",
-			(uint8_t)(eth_dev->data->port_id));
+			eth_dev->data->port_id);
 }
 
 static int bnxt_dev_lsc_intr_setup(struct rte_eth_dev *eth_dev)
diff --git a/drivers/net/bnxt/bnxt_rxq.h b/drivers/net/bnxt/bnxt_rxq.h
index 01aaa007f..cea0785d1 100644
--- a/drivers/net/bnxt/bnxt_rxq.h
+++ b/drivers/net/bnxt/bnxt_rxq.h
@@ -48,7 +48,7 @@ struct bnxt_rx_queue {
 	uint16_t		rx_free_thresh; /* max free RX desc to hold */
 	uint16_t		queue_id; /* RX queue index */
 	uint16_t		reg_idx; /* RX queue register index */
-	uint8_t			port_id; /* Device port identifier */
+	uint16_t		port_id; /* Device port identifier */
 	uint8_t			crc_len; /* 0 if CRC stripped, 4 otherwise */
 
 	struct bnxt		*bp;
diff --git a/drivers/net/bnxt/bnxt_txq.h b/drivers/net/bnxt/bnxt_txq.h
index 16f3a0bdd..f753c10f2 100644
--- a/drivers/net/bnxt/bnxt_txq.h
+++ b/drivers/net/bnxt/bnxt_txq.h
@@ -46,7 +46,7 @@ struct bnxt_tx_queue {
 	uint16_t		tx_next_rs; /* next desc to set RS bit */
 	uint16_t		queue_id; /* TX queue index */
 	uint16_t		reg_idx; /* TX queue register index */
-	uint8_t			port_id; /* Device port identifier */
+	uint16_t		port_id; /* Device port identifier */
 	uint8_t			pthresh; /* Prefetch threshold register */
 	uint8_t			hthresh; /* Host threshold register */
 	uint8_t			wthresh; /* Write-back threshold reg */
diff --git a/drivers/net/bnxt/rte_pmd_bnxt.c b/drivers/net/bnxt/rte_pmd_bnxt.c
index c343d9033..63fc27911 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt.c
+++ b/drivers/net/bnxt/rte_pmd_bnxt.c
@@ -67,7 +67,7 @@ int bnxt_rcv_msg_from_vf(struct bnxt *bp, uint16_t vf_id, void *msg)
 		true : false;
 }
 
-int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on)
+int rte_pmd_bnxt_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *eth_dev;
 	struct bnxt *bp;
@@ -108,7 +108,7 @@ rte_pmd_bnxt_set_all_queues_drop_en_cb(struct bnxt_vnic_info *vnic, void *onptr)
 	vnic->bd_stall = !(*on);
 }
 
-int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on)
+int rte_pmd_bnxt_set_all_queues_drop_en(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *eth_dev;
 	struct bnxt *bp;
@@ -159,7 +159,7 @@ int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_mac_addr(uint16_t port, uint16_t vf,
 				struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *dev;
@@ -191,7 +191,7 @@ int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk)
 {
 	struct rte_eth_dev *eth_dev;
@@ -241,7 +241,7 @@ int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
@@ -294,7 +294,7 @@ int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
@@ -350,7 +350,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq_cb(struct bnxt_vnic_info *vnic, void *onptr)
 }
 
 int
-rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_bnxt_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -385,7 +385,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rxmode(uint16_t port, uint16_t vf,
 				uint16_t rx_mask, uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -477,7 +477,7 @@ static int bnxt_set_vf_table(struct bnxt *bp, uint16_t vf)
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+int rte_pmd_bnxt_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				    uint64_t vf_mask, uint8_t vlan_on)
 {
 	struct bnxt_vlan_table_entry *ve;
@@ -570,7 +570,7 @@ int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
 	return rc;
 }
 
-int rte_pmd_bnxt_get_vf_stats(uint8_t port,
+int rte_pmd_bnxt_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats)
 {
@@ -598,7 +598,7 @@ int rte_pmd_bnxt_get_vf_stats(uint8_t port,
 	return bnxt_hwrm_func_qstats(bp, bp->pf.first_vf_id + vf_id, stats);
 }
 
-int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
+int rte_pmd_bnxt_reset_vf_stats(uint16_t port,
 				uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -625,7 +625,7 @@ int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
 	return bnxt_hwrm_func_clr_stats(bp, bp->pf.first_vf_id + vf_id);
 }
 
-int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id)
+int rte_pmd_bnxt_get_vf_rx_status(uint16_t port, uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -651,7 +651,7 @@ int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id)
 	return bnxt_vf_vnic_count(bp, vf_id);
 }
 
-int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
+int rte_pmd_bnxt_get_vf_tx_drop_count(uint16_t port, uint16_t vf_id,
 				      uint64_t *count)
 {
 	struct rte_eth_dev *dev;
@@ -679,7 +679,7 @@ int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
 					     count);
 }
 
-int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *addr,
+int rte_pmd_bnxt_mac_addr_add(uint16_t port, struct ether_addr *addr,
 				uint32_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -756,7 +756,7 @@ int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *addr,
 }
 
 int
-rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+rte_pmd_bnxt_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id)
 {
 	struct rte_eth_dev *dev;
@@ -793,7 +793,7 @@ rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
 	return rc;
 }
 
-int rte_pmd_bnxt_set_vf_persist_stats(uint8_t port, uint16_t vf, uint8_t on)
+int rte_pmd_bnxt_set_vf_persist_stats(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev;
diff --git a/drivers/net/bnxt/rte_pmd_bnxt.h b/drivers/net/bnxt/rte_pmd_bnxt.h
index c4c4770e3..f881d30d6 100644
--- a/drivers/net/bnxt/rte_pmd_bnxt.h
+++ b/drivers/net/bnxt/rte_pmd_bnxt.h
@@ -78,7 +78,7 @@ struct rte_pmd_bnxt_mb_event_param {
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Set the VF MAC address.
@@ -94,7 +94,7 @@ int rte_pmd_bnxt_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_mac_addr(uint16_t port, uint16_t vf,
 		struct ether_addr *mac_addr);
 
 /**
@@ -115,7 +115,7 @@ int rte_pmd_bnxt_set_vf_mac_addr(uint8_t port, uint16_t vf,
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_bnxt_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -134,7 +134,7 @@ rte_pmd_bnxt_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+rte_pmd_bnxt_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id);
 
 /**
@@ -156,7 +156,7 @@ rte_pmd_bnxt_set_vf_vlan_insert(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+int rte_pmd_bnxt_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				    uint64_t vf_mask, uint8_t vlan_on);
 
 /**
@@ -173,7 +173,7 @@ int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on);
+int rte_pmd_bnxt_set_tx_loopback(uint16_t port, uint8_t on);
 
 /**
  * set all queues drop enable bit
@@ -189,7 +189,7 @@ int rte_pmd_bnxt_set_tx_loopback(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on);
+int rte_pmd_bnxt_set_all_queues_drop_en(uint16_t port, uint8_t on);
 
 /**
  * Set the VF rate limit.
@@ -207,7 +207,7 @@ int rte_pmd_bnxt_set_all_queues_drop_en(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk);
 
 /**
@@ -226,7 +226,7 @@ int rte_pmd_bnxt_set_vf_rate_limit(uint8_t port, uint16_t vf,
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_bnxt_get_vf_stats(uint8_t port,
+int rte_pmd_bnxt_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats);
 
@@ -242,7 +242,7 @@ int rte_pmd_bnxt_get_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
+int rte_pmd_bnxt_reset_vf_stats(uint16_t port,
 				uint16_t vf_id);
 
 /**
@@ -261,7 +261,7 @@ int rte_pmd_bnxt_reset_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Set RX L2 Filtering mode of a VF of an Ethernet device.
@@ -280,7 +280,7 @@ int rte_pmd_bnxt_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
+int rte_pmd_bnxt_set_vf_rxmode(uint16_t port, uint16_t vf,
 				uint16_t rx_mask, uint8_t on);
 
 /**
@@ -297,7 +297,7 @@ int rte_pmd_bnxt_set_vf_rxmode(uint8_t port, uint16_t vf,
  *   - (-ENOMEM) on an allocation failure
  *   - (-1) firmware interface error
  */
-int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id);
+int rte_pmd_bnxt_get_vf_rx_status(uint16_t port, uint16_t vf_id);
 
 /**
  * Queries the TX drop counter for the function
@@ -313,7 +313,7 @@ int rte_pmd_bnxt_get_vf_rx_status(uint8_t port, uint16_t vf_id);
  *   - (-EINVAL) invalid vf_id specified.
  *   - (-ENOTSUP) Ethernet device is not a PF
  */
-int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
+int rte_pmd_bnxt_get_vf_tx_drop_count(uint16_t port, uint16_t vf_id,
 				      uint64_t *count);
 
 /**
@@ -331,7 +331,7 @@ int rte_pmd_bnxt_get_vf_tx_drop_count(uint8_t port, uint16_t vf_id,
  *   - (-ENOTSUP) Ethernet device is not a PF
  *   - (-ENOMEM) on an allocation failure
  */
-int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
+int rte_pmd_bnxt_mac_addr_add(uint16_t port, struct ether_addr *mac_addr,
 				uint32_t vf_id);
 
 /**
@@ -350,5 +350,5 @@ int rte_pmd_bnxt_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_bnxt_set_vf_persist_stats(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_bnxt_set_vf_persist_stats(uint16_t port, uint16_t vf, uint8_t on);
 #endif /* _PMD_BNXT_H_ */
diff --git a/drivers/net/bonding/Makefile b/drivers/net/bonding/Makefile
index 910c932da..ffc0c3cf7 100644
--- a/drivers/net/bonding/Makefile
+++ b/drivers/net/bonding/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/bonding/rte_eth_bond.h b/drivers/net/bonding/rte_eth_bond.h
index 8efbf0713..36b4e0643 100644
--- a/drivers/net/bonding/rte_eth_bond.h
+++ b/drivers/net/bonding/rte_eth_bond.h
@@ -151,7 +151,7 @@ rte_eth_bond_free(const char *name);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Remove a slave rte_eth_dev device from the bonded device
@@ -163,7 +163,7 @@ rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_slave_remove(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Set link bonding mode of bonded device
@@ -175,7 +175,7 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode);
+rte_eth_bond_mode_set(uint16_t bonded_port_id, uint8_t mode);
 
 /**
  * Get link bonding mode of bonded device
@@ -186,7 +186,7 @@ rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode);
  *	link bonding mode on success, negative value otherwise
  */
 int
-rte_eth_bond_mode_get(uint8_t bonded_port_id);
+rte_eth_bond_mode_get(uint16_t bonded_port_id);
 
 /**
  * Set slave rte_eth_dev as primary slave of bonded device
@@ -198,7 +198,7 @@ rte_eth_bond_mode_get(uint8_t bonded_port_id);
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id);
+rte_eth_bond_primary_set(uint16_t bonded_port_id, uint16_t slave_port_id);
 
 /**
  * Get primary slave of bonded device
@@ -209,7 +209,7 @@ rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id);
  *	Port Id of primary slave on success, -1 on failure
  */
 int
-rte_eth_bond_primary_get(uint8_t bonded_port_id);
+rte_eth_bond_primary_get(uint16_t bonded_port_id);
 
 /**
  * Populate an array with list of the slaves port id's of the bonded device
@@ -223,7 +223,8 @@ rte_eth_bond_primary_get(uint8_t bonded_port_id);
  *	negative value otherwise
  */
 int
-rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len);
+rte_eth_bond_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+			uint16_t len);
 
 /**
  * Populate an array with list of the active slaves port id's of the bonded
@@ -238,8 +239,8 @@ rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len);
  *	negative value otherwise
  */
 int
-rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
-		uint8_t len);
+rte_eth_bond_active_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+				uint16_t len);
 
 /**
  * Set explicit MAC address to use on bonded device and it's slaves.
@@ -252,7 +253,7 @@ rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
+rte_eth_bond_mac_address_set(uint16_t bonded_port_id,
 		struct ether_addr *mac_addr);
 
 /**
@@ -265,7 +266,7 @@ rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
  *	0 on success, negative value otherwise
  */
 int
-rte_eth_bond_mac_address_reset(uint8_t bonded_port_id);
+rte_eth_bond_mac_address_reset(uint16_t bonded_port_id);
 
 /**
  * Set the transmit policy for bonded device to use when it is operating in
@@ -279,7 +280,7 @@ rte_eth_bond_mac_address_reset(uint8_t bonded_port_id);
  *	0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy);
+rte_eth_bond_xmit_policy_set(uint16_t bonded_port_id, uint8_t policy);
 
 /**
  * Get the transmit policy set on bonded device for balance mode operation
@@ -290,7 +291,7 @@ rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy);
  *	Balance transmit policy on success, negative value otherwise.
  */
 int
-rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id);
+rte_eth_bond_xmit_policy_get(uint16_t bonded_port_id);
 
 /**
  * Set the link monitoring frequency (in ms) for monitoring the link status of
@@ -304,7 +305,7 @@ rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id);
  */
 
 int
-rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms);
+rte_eth_bond_link_monitoring_set(uint16_t bonded_port_id, uint32_t internal_ms);
 
 /**
  * Get the current link monitoring frequency (in ms) for monitoring of the link
@@ -316,8 +317,7 @@ rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms);
  *	Monitoring interval on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id);
-
+rte_eth_bond_link_monitoring_get(uint16_t bonded_port_id);
 
 /**
  * Set the period in milliseconds for delaying the disabling of a bonded link
@@ -330,7 +330,8 @@ rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id);
  *  0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
+rte_eth_bond_link_down_prop_delay_set(uint16_t bonded_port_id,
+				       uint32_t delay_ms);
 
 /**
  * Get the period in milliseconds set for delaying the disabling of a bonded
@@ -342,7 +343,7 @@ rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
  *  Delay period on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id);
+rte_eth_bond_link_down_prop_delay_get(uint16_t bonded_port_id);
 
 /**
  * Set the period in milliseconds for delaying the enabling of a bonded link
@@ -355,7 +356,8 @@ rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id);
  *  0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
+rte_eth_bond_link_up_prop_delay_set(uint16_t bonded_port_id,
+				    uint32_t delay_ms);
 
 /**
  * Get the period in milliseconds set for delaying the enabling of a bonded
@@ -367,7 +369,7 @@ rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
  *  Delay period on success, negative value otherwise.
  */
 int
-rte_eth_bond_link_up_prop_delay_get(uint8_t bonded_port_id);
+rte_eth_bond_link_up_prop_delay_get(uint16_t bonded_port_id);
 
 
 #ifdef __cplusplus
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index efb9c6e77..c0a0b6e21 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -209,7 +209,7 @@ set_warning_flags(struct port *port, uint16_t flags)
 }
 
 static void
-show_warnings(uint8_t slave_id)
+show_warnings(uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 	uint8_t warnings;
@@ -278,7 +278,7 @@ record_default(struct port *port)
  * @param port			Port on which LACPDU was received.
  */
 static void
-rx_machine(struct bond_dev_private *internals, uint8_t slave_id,
+rx_machine(struct bond_dev_private *internals, uint16_t slave_id,
 		struct lacpdu *lacp)
 {
 	struct port *agg, *port = &mode_8023ad_ports[slave_id];
@@ -399,7 +399,7 @@ rx_machine(struct bond_dev_private *internals, uint8_t slave_id,
  * @param port			Port to handle state machine.
  */
 static void
-periodic_machine(struct bond_dev_private *internals, uint8_t slave_id)
+periodic_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 	/* Calculate if either site is LACP enabled */
@@ -461,7 +461,7 @@ periodic_machine(struct bond_dev_private *internals, uint8_t slave_id)
  * @param port			Port to handle state machine.
  */
 static void
-mux_machine(struct bond_dev_private *internals, uint8_t slave_id)
+mux_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *port = &mode_8023ad_ports[slave_id];
 
@@ -564,7 +564,7 @@ mux_machine(struct bond_dev_private *internals, uint8_t slave_id)
  * @param port
  */
 static void
-tx_machine(struct bond_dev_private *internals, uint8_t slave_id)
+tx_machine(struct bond_dev_private *internals, uint16_t slave_id)
 {
 	struct port *agg, *port = &mode_8023ad_ports[slave_id];
 
@@ -688,11 +688,11 @@ static void
 selection_logic(struct bond_dev_private *internals, uint8_t slave_id)
 {
 	struct port *agg, *port;
-	uint8_t slaves_count, new_agg_id, i, j = 0;
-	uint8_t *slaves;
+	uint16_t slaves_count, new_agg_id, i, j = 0;
+	uint16_t *slaves;
 	uint64_t agg_bandwidth[8] = {0};
 	uint64_t agg_count[8] = {0};
-	uint8_t default_slave = 0;
+	uint16_t default_slave = 0;
 	uint8_t mode_count_id, mode_band_id;
 	struct rte_eth_link link_info;
 
@@ -923,7 +923,8 @@ bond_mode_8023ad_periodic_cb(void *arg)
 }
 
 void
-bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
+bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev,
+				uint16_t slave_id)
 {
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 
@@ -951,7 +952,7 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
 	memcpy(&port->actor, &initial, sizeof(struct port_params));
 	/* Standard requires that port ID must be grater than 0.
 	 * Add 1 do get corresponding port_number */
-	port->actor.port_number = rte_cpu_to_be_16((uint16_t)slave_id + 1);
+	port->actor.port_number = rte_cpu_to_be_16(slave_id + 1);
 
 	memcpy(&port->partner, &initial, sizeof(struct port_params));
 
@@ -1022,12 +1023,12 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, uint8_t slave_id)
 
 int
 bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *bond_dev,
-		uint8_t slave_id)
+				   uint16_t slave_id)
 {
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 	void *pkt = NULL;
 	struct port *port;
-	uint8_t i;
+	uint16_t i;
 
 	/* Given slave must be in active list */
 	RTE_ASSERT(find_slave_by_id(internals->active_slaves,
@@ -1066,7 +1067,7 @@ bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev)
 	struct bond_dev_private *internals = bond_dev->data->dev_private;
 	struct ether_addr slave_addr;
 	struct port *slave, *agg_slave;
-	uint8_t slave_id, i, j;
+	uint16_t slave_id, i, j;
 
 	bond_mode_8023ad_stop(bond_dev);
 
@@ -1224,7 +1225,7 @@ bond_mode_8023ad_stop(struct rte_eth_dev *bond_dev)
 
 void
 bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
-	uint8_t slave_id, struct rte_mbuf *pkt)
+				  uint16_t slave_id, struct rte_mbuf *pkt)
 {
 	struct mode8023ad_private *mode4 = &internals->mode4;
 	struct port *port = &mode_8023ad_ports[slave_id];
@@ -1305,7 +1306,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
 }
 
 int
-rte_eth_bond_8023ad_conf_get(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1322,7 +1323,7 @@ rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 }
 
 int
-rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
+rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id,
 		enum rte_bond_8023ad_agg_selection agg_selection)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1344,7 +1345,7 @@ rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
 	return 0;
 }
 
-int rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id)
+int rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id)
 {
 	struct rte_eth_dev *bond_dev;
 	struct bond_dev_private *internals;
@@ -1365,7 +1366,7 @@ int rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id)
 
 
 static int
-bond_8023ad_setup_validate(uint8_t port_id,
+bond_8023ad_setup_validate(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	if (valid_bonded_port_id(port_id) != 0)
@@ -1389,8 +1390,9 @@ bond_8023ad_setup_validate(uint8_t port_id,
 	return 0;
 }
 
+
 int
-rte_eth_bond_8023ad_setup(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1411,7 +1413,7 @@ rte_eth_bond_8023ad_setup(uint8_t port_id,
 
 
 int
-rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_slave_info(uint16_t port_id, uint16_t slave_id,
 		struct rte_eth_bond_8023ad_slave_info *info)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1444,7 +1446,7 @@ rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
 }
 
 static int
-bond_8023ad_ext_validate(uint8_t port_id, uint8_t slave_id)
+bond_8023ad_ext_validate(uint16_t port_id, uint16_t slave_id)
 {
 	struct rte_eth_dev *bond_dev;
 	struct bond_dev_private *internals;
@@ -1472,7 +1474,8 @@ bond_8023ad_ext_validate(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled)
+rte_eth_bond_8023ad_ext_collect(uint16_t port_id, uint16_t slave_id,
+				int enabled)
 {
 	struct port *port;
 	int res;
@@ -1492,7 +1495,8 @@ rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled)
 }
 
 int
-rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled)
+rte_eth_bond_8023ad_ext_distrib(uint16_t port_id, uint16_t slave_id,
+				int enabled)
 {
 	struct port *port;
 	int res;
@@ -1512,7 +1516,7 @@ rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled)
 }
 
 int
-rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id)
+rte_eth_bond_8023ad_ext_distrib_get(uint16_t port_id, uint16_t slave_id)
 {
 	struct port *port;
 	int err;
@@ -1526,7 +1530,7 @@ rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id)
+rte_eth_bond_8023ad_ext_collect_get(uint16_t port_id, uint16_t slave_id)
 {
 	struct port *port;
 	int err;
@@ -1540,7 +1544,7 @@ rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id)
 }
 
 int
-rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_ext_slowtx(uint16_t port_id, uint16_t slave_id,
 		struct rte_mbuf *lacp_pkt)
 {
 	struct port *port;
@@ -1601,7 +1605,7 @@ bond_mode_8023ad_ext_periodic_cb(void *arg)
 }
 
 int
-rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port)
+rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port)
 {
 	int retval = 0;
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
@@ -1625,7 +1629,7 @@ rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port)
 }
 
 int
-rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port)
+rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port)
 {
 	int retval = 0;
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h
index d609745e0..2874336d3 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.h
@@ -64,7 +64,7 @@ extern "C" {
 #define MARKER_TLV_TYPE_INFO                0x01
 #define MARKER_TLV_TYPE_RESP                0x02
 
-typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint8_t slave_id,
+typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint16_t slave_id,
 						  struct rte_mbuf *lacp_pkt);
 
 enum rte_bond_8023ad_selection {
@@ -176,7 +176,7 @@ struct rte_eth_bond_8023ad_slave_info {
 	struct port_params actor;
 	uint8_t partner_state;
 	struct port_params partner;
-	uint8_t agg_port_id;
+	uint16_t agg_port_id;
 };
 
 /**
@@ -192,7 +192,7 @@ struct rte_eth_bond_8023ad_slave_info {
  *   -EINVAL if conf is NULL
  */
 int
-rte_eth_bond_8023ad_conf_get(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
@@ -207,7 +207,7 @@ rte_eth_bond_8023ad_conf_get(uint8_t port_id,
  *   -EINVAL if configuration is invalid.
  */
 int
-rte_eth_bond_8023ad_setup(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
@@ -223,7 +223,7 @@ rte_eth_bond_8023ad_setup(uint8_t port_id,
  *       bonded device or is not inactive).
  */
 int
-rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_slave_info(uint16_t port_id, uint16_t slave_id,
 		struct rte_eth_bond_8023ad_slave_info *conf);
 
 #ifdef __cplusplus
@@ -241,7 +241,8 @@ rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled);
+rte_eth_bond_8023ad_ext_collect(uint16_t port_id, uint16_t slave_id,
+				int enabled);
 
 /**
  * Get COLLECTING flag from slave port actor state.
@@ -254,7 +255,7 @@ rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id);
+rte_eth_bond_8023ad_ext_collect_get(uint16_t port_id, uint16_t slave_id);
 
 /**
  * Configure a slave port to start distributing.
@@ -267,7 +268,8 @@ rte_eth_bond_8023ad_ext_collect_get(uint8_t port_id, uint8_t slave_id);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled);
+rte_eth_bond_8023ad_ext_distrib(uint16_t port_id, uint16_t slave_id,
+				int enabled);
 
 /**
  * Get DISTRIBUTING flag from slave port actor state.
@@ -280,7 +282,7 @@ rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled);
  *   -EINVAL if slave is not valid.
  */
 int
-rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id);
+rte_eth_bond_8023ad_ext_distrib_get(uint16_t port_id, uint16_t slave_id);
 
 /**
  * LACPDU transmit path for external 802.3ad state machine.  Caller retains
@@ -294,7 +296,7 @@ rte_eth_bond_8023ad_ext_distrib_get(uint8_t port_id, uint8_t slave_id);
  *   0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
+rte_eth_bond_8023ad_ext_slowtx(uint16_t port_id, uint16_t slave_id,
 		struct rte_mbuf *lacp_pkt);
 
 /**
@@ -320,7 +322,7 @@ rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,
  *   0 on success, negative value otherwise.
  */
 int
-rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port_id);
+rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port_id);
 
 /**
  * Disable slow queue on slaves
@@ -337,7 +339,7 @@ rte_eth_bond_8023ad_dedicated_queues_enable(uint8_t port_id);
  *
  */
 int
-rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port_id);
+rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port_id);
 
 /*
  * Get aggregator mode for 8023ad
@@ -347,7 +349,7 @@ rte_eth_bond_8023ad_dedicated_queues_disable(uint8_t port_id);
  *   agregator mode on success, negative value otherwise
  */
 int
-rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id);
+rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id);
 
 /**
  * Set aggregator mode for 8023ad
@@ -356,6 +358,6 @@ rte_eth_bond_8023ad_agg_selection_get(uint8_t port_id);
  *   0 on success, negative value otherwise
  */
 int
-rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
+rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id,
 		enum rte_bond_8023ad_agg_selection agg_selection);
 #endif /* RTE_ETH_BOND_8023AD_H_ */
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad_private.h b/drivers/net/bonding/rte_eth_bond_8023ad_private.h
index d46e44a84..9ee5ca23d 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad_private.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad_private.h
@@ -279,7 +279,7 @@ bond_mode_8023ad_stop(struct rte_eth_dev *dev);
  */
 void
 bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
-	uint8_t slave_id, struct rte_mbuf *pkt);
+				 uint16_t slave_id, struct rte_mbuf *pkt);
 
 /**
  * @internal
@@ -293,7 +293,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
  *  0 on success, negative value otherwise.
  */
 void
-bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint8_t port_id);
+bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint16_t port_id);
 
 /**
  * @internal
@@ -307,7 +307,7 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint8_t port_id);
  *  0 on success, negative value otherwise.
  */
 int
-bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *dev, uint8_t slave_pos);
+bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *dev, uint16_t slave_pos);
 
 /**
  * Updates state when MAC was changed on bonded device or one of its slaves.
@@ -318,12 +318,12 @@ bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev);
 
 int
 bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
-		uint8_t slave_port);
+				uint16_t slave_port);
 
 int
-bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint8_t slave_port);
+bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port);
 
 int
-bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id);
+bond_8023ad_slow_pkt_hw_filter_supported(uint16_t port_id);
 
 #endif /* RTE_ETH_BOND_8023AD_H_ */
diff --git a/drivers/net/bonding/rte_eth_bond_alb.c b/drivers/net/bonding/rte_eth_bond_alb.c
index d9d37495d..f7efbb78e 100644
--- a/drivers/net/bonding/rte_eth_bond_alb.c
+++ b/drivers/net/bonding/rte_eth_bond_alb.c
@@ -148,7 +148,7 @@ void bond_mode_alb_arp_recv(struct ether_hdr *eth_h, uint16_t offset,
 	rte_spinlock_unlock(&internals->mode6.lock);
 }
 
-uint8_t
+uint16_t
 bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 		struct bond_dev_private *internals)
 {
@@ -220,13 +220,13 @@ bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 	return internals->current_primary_port;
 }
 
-uint8_t
+uint16_t
 bond_mode_alb_arp_upd(struct client_data *client_info,
 		struct rte_mbuf *pkt, struct bond_dev_private *internals)
 {
 	struct ether_hdr *eth_h;
 	struct arp_hdr *arp_h;
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 
 	rte_spinlock_lock(&internals->mode6.lock);
 	eth_h = rte_pktmbuf_mtod(pkt, struct ether_hdr *);
diff --git a/drivers/net/bonding/rte_eth_bond_alb.h b/drivers/net/bonding/rte_eth_bond_alb.h
index fd7c3aeb4..9f17f7c85 100644
--- a/drivers/net/bonding/rte_eth_bond_alb.h
+++ b/drivers/net/bonding/rte_eth_bond_alb.h
@@ -51,7 +51,7 @@ struct client_data {
 	uint32_t cli_ip;
 	/**< Client IP address */
 
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 	/**< Index of slave on which we connect with that client */
 	uint8_t in_use;
 	/**< Flag indicating if entry in client table is currently used */
@@ -113,7 +113,7 @@ bond_mode_alb_arp_recv(struct ether_hdr *eth_h, uint16_t offset,
  * @return
  * Index of slave on which packet should be sent.
  */
-uint8_t
+uint16_t
 bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
 		struct bond_dev_private *internals);
 
@@ -127,7 +127,7 @@ bond_mode_alb_arp_xmit(struct ether_hdr *eth_h, uint16_t offset,
  * @return
  * Index of slawe on which packet should be sent.
  */
-uint8_t
+uint16_t
 bond_mode_alb_arp_upd(struct client_data *client_info,
 		struct rte_mbuf *pkt, struct bond_dev_private *internals);
 
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index de1d9e0db..957390f71 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -56,14 +56,14 @@ check_for_bonded_ethdev(const struct rte_eth_dev *eth_dev)
 }
 
 int
-valid_bonded_port_id(uint8_t port_id)
+valid_bonded_port_id(uint16_t port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 	return check_for_bonded_ethdev(&rte_eth_devices[port_id]);
 }
 
 int
-valid_slave_port_id(uint8_t port_id, uint8_t mode)
+valid_slave_port_id(uint16_t port_id, uint8_t mode)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 
@@ -80,7 +80,7 @@ valid_slave_port_id(uint8_t port_id, uint8_t mode)
 }
 
 void
-activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
+activate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id)
 {
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
 	uint8_t active_count = internals->active_slave_count;
@@ -107,11 +107,11 @@ activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
 }
 
 void
-deactivate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
+deactivate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id)
 {
-	uint8_t slave_pos;
+	uint16_t slave_pos;
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
-	uint8_t active_count = internals->active_slave_count;
+	uint16_t active_count = internals->active_slave_count;
 
 	if (internals->mode == BONDING_MODE_8023AD) {
 		bond_mode_8023ad_stop(eth_dev);
@@ -153,7 +153,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
 {
 	struct bond_dev_private *internals;
 	char devargs[52];
-	uint8_t port_id;
+	uint16_t port_id;
 	int ret;
 
 	if (name == NULL) {
@@ -193,7 +193,7 @@ rte_eth_bond_free(const char *name)
 }
 
 static int
-slave_vlan_filter_set(uint8_t bonded_port_id, uint8_t slave_port_id)
+slave_vlan_filter_set(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -233,7 +233,7 @@ slave_vlan_filter_set(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 static int
-__eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
+__eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev, *slave_eth_dev;
 	struct bond_dev_private *internals;
@@ -363,7 +363,7 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -387,7 +387,8 @@ rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 static int
-__eth_bond_slave_remove_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
+__eth_bond_slave_remove_lock_free(uint16_t bonded_port_id,
+				   uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -466,7 +467,7 @@ __eth_bond_slave_remove_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_slave_remove(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -488,7 +489,7 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode)
+rte_eth_bond_mode_set(uint16_t bonded_port_id, uint8_t mode)
 {
 	if (valid_bonded_port_id(bonded_port_id) != 0)
 		return -1;
@@ -497,7 +498,7 @@ rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode)
 }
 
 int
-rte_eth_bond_mode_get(uint8_t bonded_port_id)
+rte_eth_bond_mode_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -510,7 +511,7 @@ rte_eth_bond_mode_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id)
+rte_eth_bond_primary_set(uint16_t bonded_port_id, uint16_t slave_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -531,7 +532,7 @@ rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id)
 }
 
 int
-rte_eth_bond_primary_get(uint8_t bonded_port_id)
+rte_eth_bond_primary_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -547,7 +548,8 @@ rte_eth_bond_primary_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len)
+rte_eth_bond_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+			uint16_t len)
 {
 	struct bond_dev_private *internals;
 	uint8_t i;
@@ -570,8 +572,8 @@ rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len)
 }
 
 int
-rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
-		uint8_t len)
+rte_eth_bond_active_slaves_get(uint16_t bonded_port_id, uint16_t slaves[],
+				uint16_t len)
 {
 	struct bond_dev_private *internals;
 
@@ -586,13 +588,14 @@ rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
 	if (internals->active_slave_count > len)
 		return -1;
 
-	memcpy(slaves, internals->active_slaves, internals->active_slave_count);
+	memcpy(slaves, internals->active_slaves,
+	internals->active_slave_count * sizeof(internals->active_slaves[0]));
 
 	return internals->active_slave_count;
 }
 
 int
-rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
+rte_eth_bond_mac_address_set(uint16_t bonded_port_id,
 		struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *bonded_eth_dev;
@@ -618,7 +621,7 @@ rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
 }
 
 int
-rte_eth_bond_mac_address_reset(uint8_t bonded_port_id)
+rte_eth_bond_mac_address_reset(uint16_t bonded_port_id)
 {
 	struct rte_eth_dev *bonded_eth_dev;
 	struct bond_dev_private *internals;
@@ -647,7 +650,7 @@ rte_eth_bond_mac_address_reset(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy)
+rte_eth_bond_xmit_policy_set(uint16_t bonded_port_id, uint8_t policy)
 {
 	struct bond_dev_private *internals;
 
@@ -677,7 +680,7 @@ rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy)
 }
 
 int
-rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id)
+rte_eth_bond_xmit_policy_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -690,7 +693,7 @@ rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms)
+rte_eth_bond_link_monitoring_set(uint16_t bonded_port_id, uint32_t internal_ms)
 {
 	struct bond_dev_private *internals;
 
@@ -704,7 +707,7 @@ rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms)
 }
 
 int
-rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id)
+rte_eth_bond_link_monitoring_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -717,7 +720,8 @@ rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
+rte_eth_bond_link_down_prop_delay_set(uint16_t bonded_port_id,
+				       uint32_t delay_ms)
 
 {
 	struct bond_dev_private *internals;
@@ -732,7 +736,7 @@ rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
 }
 
 int
-rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id)
+rte_eth_bond_link_down_prop_delay_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
@@ -745,7 +749,7 @@ rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id)
 }
 
 int
-rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
+rte_eth_bond_link_up_prop_delay_set(uint16_t bonded_port_id, uint32_t delay_ms)
 
 {
 	struct bond_dev_private *internals;
@@ -760,7 +764,7 @@ rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms)
 }
 
 int
-rte_eth_bond_link_up_prop_delay_get(uint8_t bonded_port_id)
+rte_eth_bond_link_up_prop_delay_get(uint16_t bonded_port_id)
 {
 	struct bond_dev_private *internals;
 
diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c
index bb634c62e..04d1f4e8f 100644
--- a/drivers/net/bonding/rte_eth_bond_args.c
+++ b/drivers/net/bonding/rte_eth_bond_args.c
@@ -153,7 +153,7 @@ bond_ethdev_parse_slave_port_kvarg(const char *key,
 			return -1;
 		} else
 			slave_ports->slaves[slave_ports->slave_count++] =
-					(uint8_t)port_id;
+					port_id;
 	}
 	return 0;
 }
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 3ee70baa0..0566e25ba 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -174,7 +174,7 @@ const struct rte_flow_attr flow_attr_8023ad = {
 
 int
 bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
-		uint8_t slave_port) {
+				uint16_t slave_port) {
 	struct rte_flow_error error;
 	struct bond_dev_private *internals = (struct bond_dev_private *)
 			(bond_dev->data->dev_private);
@@ -202,12 +202,12 @@ bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
 }
 
 int
-bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id) {
+bond_8023ad_slow_pkt_hw_filter_supported(uint16_t port_id) {
 	struct rte_eth_dev *bond_dev = &rte_eth_devices[port_id];
 	struct bond_dev_private *internals = (struct bond_dev_private *)
 			(bond_dev->data->dev_private);
 	struct rte_eth_dev_info bond_info, slave_info;
-	uint8_t idx;
+	uint16_t idx;
 
 	/* Verify if all slaves in bonding supports flow director and */
 	if (internals->slave_count > 0) {
@@ -230,7 +230,7 @@ bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id) {
 }
 
 int
-bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint8_t slave_port) {
+bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port) {
 
 	struct rte_flow_error error;
 	struct bond_dev_private *internals = (struct bond_dev_private *)
@@ -270,10 +270,10 @@ bond_ethdev_rx_burst_8023ad_fast_queue(void *queue, struct rte_mbuf **bufs,
 	struct bond_rx_queue *bd_rx_q = (struct bond_rx_queue *)queue;
 	struct bond_dev_private *internals = bd_rx_q->dev_private;
 	uint16_t num_rx_total = 0;	/* Total number of received packets */
-	uint8_t slaves[RTE_MAX_ETHPORTS];
-	uint8_t slave_count;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slave_count;
 
-	uint8_t i, idx;
+	uint16_t i, idx;
 
 	/* Copy slave list to protect against slave up/down changes during tx
 	 * bursting */
@@ -302,8 +302,8 @@ bond_ethdev_tx_burst_8023ad_fast_queue(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 	 /* positions in slaves, not ID */
 	uint8_t distributing_offsets[RTE_MAX_ETHPORTS];
 	uint8_t distributing_count;
@@ -394,8 +394,8 @@ bond_ethdev_rx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
 
 	const uint16_t ether_type_slow_be = rte_be_to_cpu_16(ETHER_TYPE_SLOW);
 	uint16_t num_rx_total = 0;	/* Total number of received packets */
-	uint8_t slaves[RTE_MAX_ETHPORTS];
-	uint8_t slave_count, idx;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slave_count, idx;
 
 	uint8_t collecting;  /* current slave collecting status */
 	const uint8_t promisc = internals->promiscuous_en;
@@ -673,8 +673,8 @@ bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs,
 	struct rte_mbuf *slave_bufs[RTE_MAX_ETHPORTS][nb_pkts];
 	uint16_t slave_nb_pkts[RTE_MAX_ETHPORTS] = { 0 };
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t num_tx_total = 0, num_tx_slave;
 
@@ -904,7 +904,7 @@ bandwidth_cmp(const void *a, const void *b)
 }
 
 static void
-bandwidth_left(uint8_t port_id, uint64_t load, uint8_t update_idx,
+bandwidth_left(uint16_t port_id, uint64_t load, uint8_t update_idx,
 		struct bwg_slave *bwg_slave)
 {
 	struct rte_eth_link link_status;
@@ -970,10 +970,10 @@ bond_ethdev_tx_burst_tlb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 	struct rte_eth_dev *primary_port =
 			&rte_eth_devices[internals->primary_port];
 	uint16_t num_tx_total = 0;
-	uint8_t i, j;
+	uint16_t i, j;
 
-	uint8_t num_of_slaves = internals->active_slave_count;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves = internals->active_slave_count;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	struct ether_hdr *ether_hdr;
 	struct ether_addr primary_slave_addr;
@@ -1059,7 +1059,7 @@ bond_ethdev_tx_burst_alb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 
 	uint16_t num_send, num_not_send = 0;
 	uint16_t num_tx_total = 0;
-	uint8_t slave_idx;
+	uint16_t slave_idx;
 
 	int i, j;
 
@@ -1178,8 +1178,8 @@ bond_ethdev_tx_burst_balance(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t num_tx_total = 0, num_tx_slave = 0, tx_fail_total = 0;
 
@@ -1239,8 +1239,8 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
 	struct bond_dev_private *internals;
 	struct bond_tx_queue *bd_tx_q;
 
-	uint8_t num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t num_of_slaves;
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 	 /* positions in slaves, not ID */
 	uint8_t distributing_offsets[RTE_MAX_ETHPORTS];
 	uint8_t distributing_count;
@@ -1333,7 +1333,7 @@ bond_ethdev_tx_burst_broadcast(void *queue, struct rte_mbuf **bufs,
 	struct bond_tx_queue *bd_tx_q;
 
 	uint8_t tx_failed_flag = 0, num_of_slaves;
-	uint8_t slaves[RTE_MAX_ETHPORTS];
+	uint16_t slaves[RTE_MAX_ETHPORTS];
 
 	uint16_t max_nb_of_tx_pkts = 0;
 
@@ -1861,7 +1861,7 @@ slave_add(struct bond_dev_private *internals,
 
 void
 bond_ethdev_primary_set(struct bond_dev_private *internals,
-		uint8_t slave_port_id)
+			uint16_t slave_port_id)
 {
 	int i;
 
@@ -2125,7 +2125,7 @@ static int
 bond_ethdev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 {
 	int res;
-	uint8_t i;
+	uint16_t i;
 	struct bond_dev_private *internals = dev->data->dev_private;
 
 	/* don't do this while a slave is being added */
@@ -2137,7 +2137,7 @@ bond_ethdev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 		rte_bitmap_clear(internals->vlan_filter_bmp, vlan_id);
 
 	for (i = 0; i < internals->slave_count; i++) {
-		uint8_t port_id = internals->slaves[i].port_id;
+		uint16_t port_id = internals->slaves[i].port_id;
 
 		res = rte_eth_dev_vlan_filter(port_id, vlan_id, on);
 		if (res == ENOTSUP)
@@ -2277,7 +2277,7 @@ bond_ethdev_slave_link_status_change_monitor(void *cb_arg)
 static int
 bond_ethdev_link_update(struct rte_eth_dev *ethdev, int wait_to_complete)
 {
-	void (*link_update)(uint8_t port_id, struct rte_eth_link *eth_link);
+	void (*link_update)(uint16_t port_id, struct rte_eth_link *eth_link);
 
 	struct bond_dev_private *bond_ctx;
 	struct rte_eth_link slave_link;
@@ -2466,7 +2466,7 @@ bond_ethdev_delayed_lsc_propagation(void *arg)
 }
 
 int
-bond_ethdev_lsc_event_callback(uint8_t port_id, enum rte_eth_event_type type,
+bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type,
 		void *param, void *ret_param __rte_unused)
 {
 	struct rte_eth_dev *bonded_eth_dev;
@@ -2951,7 +2951,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 	struct bond_dev_private *internals = dev->data->dev_private;
 	struct rte_kvargs *kvlist = internals->kvlist;
 	int arg_count;
-	uint8_t port_id = dev - rte_eth_devices;
+	uint16_t port_id = dev - rte_eth_devices;
 	uint8_t agg_mode;
 
 	static const uint8_t default_rss_key[40] = {
@@ -3086,7 +3086,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 	/* Parse/set primary slave port id*/
 	arg_count = rte_kvargs_count(kvlist, PMD_BOND_PRIMARY_SLAVE_KVARG);
 	if (arg_count == 1) {
-		uint8_t primary_slave_port_id;
+		uint16_t primary_slave_port_id;
 
 		if (rte_kvargs_process(kvlist,
 				PMD_BOND_PRIMARY_SLAVE_KVARG,
@@ -3099,7 +3099,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
 		}
 
 		/* Set balance mode transmit policy*/
-		if (rte_eth_bond_primary_set(port_id, (uint8_t)primary_slave_port_id)
+		if (rte_eth_bond_primary_set(port_id, primary_slave_port_id)
 				!= 0) {
 			RTE_LOG(ERR, EAL,
 					"Failed to set primary slave port %d on bonded device %s\n",
diff --git a/drivers/net/bonding/rte_eth_bond_private.h b/drivers/net/bonding/rte_eth_bond_private.h
index 1fe6ff880..9362cffac 100644
--- a/drivers/net/bonding/rte_eth_bond_private.h
+++ b/drivers/net/bonding/rte_eth_bond_private.h
@@ -93,12 +93,12 @@ struct bond_tx_queue {
 
 /** Bonded slave devices structure */
 struct bond_ethdev_slave_ports {
-	uint8_t slaves[RTE_MAX_ETHPORTS];	/**< Slave port id array */
-	uint8_t slave_count;				/**< Number of slaves */
+	uint16_t slaves[RTE_MAX_ETHPORTS];	/**< Slave port id array */
+	uint16_t slave_count;				/**< Number of slaves */
 };
 
 struct bond_slave_details {
-	uint8_t port_id;
+	uint16_t port_id;
 
 	uint8_t link_status_poll_enabled;
 	uint8_t link_status_wait_to_complete;
@@ -114,14 +114,14 @@ typedef uint16_t (*xmit_hash_t)(const struct rte_mbuf *buf, uint8_t slave_count)
 
 /** Link Bonding PMD device private configuration Structure */
 struct bond_dev_private {
-	uint8_t port_id;					/**< Port Id of Bonded Port */
+	uint16_t port_id;			/**< Port Id of Bonded Port */
 	uint8_t mode;						/**< Link Bonding Mode */
 
 	rte_spinlock_t lock;
 
-	uint8_t primary_port;				/**< Primary Slave Port */
-	uint8_t current_primary_port;		/**< Primary Slave Port */
-	uint8_t user_defined_primary_port;
+	uint16_t primary_port;			/**< Primary Slave Port */
+	uint16_t current_primary_port;		/**< Primary Slave Port */
+	uint16_t user_defined_primary_port;
 	/**< Flag for whether primary port is user defined or not */
 
 	uint8_t balance_xmit_policy;
@@ -144,16 +144,17 @@ struct bond_dev_private {
 	uint16_t nb_rx_queues;			/**< Total number of rx queues */
 	uint16_t nb_tx_queues;			/**< Total number of tx queues*/
 
-	uint8_t active_slave;		/**< Next active_slave to poll */
-	uint8_t active_slave_count;		/**< Number of active slaves */
-	uint8_t active_slaves[RTE_MAX_ETHPORTS];	/**< Active slave list */
+	uint16_t active_slave;		/**< Next active_slave to poll */
+	uint16_t active_slave_count;		/**< Number of active slaves */
+	uint16_t active_slaves[RTE_MAX_ETHPORTS];    /**< Active slave list */
 
-	uint8_t slave_count;			/**< Number of bonded slaves */
+	uint16_t slave_count;			/**< Number of bonded slaves */
 	struct bond_slave_details slaves[RTE_MAX_ETHPORTS];
 	/**< Arary of bonded slaves details */
 
 	struct mode8023ad_private mode4;
-	uint8_t tlb_slaves_order[RTE_MAX_ETHPORTS]; /* TLB active slaves send order */
+	/**< TLB active slaves send order */
+	uint16_t tlb_slaves_order[RTE_MAX_ETHPORTS];
 	struct mode_alb_private mode6;
 
 	uint32_t rx_offload_capa;            /** Rx offload capability */
@@ -186,10 +187,10 @@ check_for_bonded_ethdev(const struct rte_eth_dev *eth_dev);
 
 /* Search given slave array to find position of given id.
  * Return slave pos or slaves_count if not found. */
-static inline uint8_t
-find_slave_by_id(uint8_t *slaves, uint8_t slaves_count, uint8_t slave_id) {
+static inline uint16_t
+find_slave_by_id(uint16_t *slaves, uint16_t slaves_count, uint16_t slave_id) {
 
-	uint8_t pos;
+	uint16_t pos;
 	for (pos = 0; pos < slaves_count; pos++) {
 		if (slave_id == slaves[pos])
 			break;
@@ -199,19 +200,19 @@ find_slave_by_id(uint8_t *slaves, uint8_t slaves_count, uint8_t slave_id) {
 }
 
 int
-valid_port_id(uint8_t port_id);
+valid_port_id(uint16_t port_id);
 
 int
-valid_bonded_port_id(uint8_t port_id);
+valid_bonded_port_id(uint16_t port_id);
 
 int
-valid_slave_port_id(uint8_t port_id, uint8_t mode);
+valid_slave_port_id(uint16_t port_id, uint8_t mode);
 
 void
-deactivate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id);
+deactivate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id);
 
 void
-activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id);
+activate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id);
 
 void
 link_properties_set(struct rte_eth_dev *bonded_eth_dev,
@@ -255,10 +256,10 @@ xmit_l34_hash(const struct rte_mbuf *buf, uint8_t slave_count);
 
 void
 bond_ethdev_primary_set(struct bond_dev_private *internals,
-		uint8_t slave_port_id);
+		uint16_t slave_port_id);
 
 int
-bond_ethdev_lsc_event_callback(uint8_t port_id, enum rte_eth_event_type type,
+bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type,
 		void *param, void *ret_param);
 
 int
diff --git a/drivers/net/e1000/Makefile b/drivers/net/e1000/Makefile
index ffdf36d37..a94ac7605 100644
--- a/drivers/net/e1000/Makefile
+++ b/drivers/net/e1000/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index 3d4ab9368..a59947d78 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -1624,7 +1624,7 @@ eth_em_interrupt_action(struct rte_eth_dev *dev,
 	rte_em_dev_atomic_read_link_status(dev, &link);
 	if (link.link_status) {
 		PMD_INIT_LOG(INFO, " Port %d: Link Up - speed %u Mbps - %s",
-			     dev->data->port_id, (unsigned)link.link_speed,
+			     dev->data->port_id, link.link_speed,
 			     link.link_duplex == ETH_LINK_FULL_DUPLEX ?
 			     "full-duplex" : "half-duplex");
 	} else {
diff --git a/drivers/net/e1000/em_rxtx.c b/drivers/net/e1000/em_rxtx.c
index 31819c5bd..06ba68e39 100644
--- a/drivers/net/e1000/em_rxtx.c
+++ b/drivers/net/e1000/em_rxtx.c
@@ -119,7 +119,7 @@ struct em_rx_queue {
 	uint16_t            nb_rx_hold; /**< number of held free RX desc. */
 	uint16_t            rx_free_thresh; /**< max free RX desc to hold. */
 	uint16_t            queue_id;   /**< RX queue index. */
-	uint8_t             port_id;    /**< Device port identifier. */
+	uint16_t            port_id;    /**< Device port identifier. */
 	uint8_t             pthresh;    /**< Prefetch threshold register. */
 	uint8_t             hthresh;    /**< Host threshold register. */
 	uint8_t             wthresh;    /**< Write-back threshold register. */
@@ -186,7 +186,7 @@ struct em_tx_queue {
 	/** Total number of TX descriptors ready to be allocated. */
 	uint16_t               nb_tx_free;
 	uint16_t               queue_id; /**< TX queue index. */
-	uint8_t                port_id;  /**< Device port identifier. */
+	uint16_t               port_id;  /**< Device port identifier. */
 	uint8_t                pthresh;  /**< Prefetch threshold register. */
 	uint8_t                hthresh;  /**< Host threshold register. */
 	uint8_t                wthresh;  /**< Write-back threshold register. */
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index 1c80a2a1b..a800d9c2b 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -122,7 +122,7 @@ struct igb_rx_queue {
 	uint16_t            rx_free_thresh; /**< max free RX desc to hold. */
 	uint16_t            queue_id;   /**< RX queue index. */
 	uint16_t            reg_idx;    /**< RX queue register index. */
-	uint8_t             port_id;    /**< Device port identifier. */
+	uint16_t            port_id;    /**< Device port identifier. */
 	uint8_t             pthresh;    /**< Prefetch threshold register. */
 	uint8_t             hthresh;    /**< Host threshold register. */
 	uint8_t             wthresh;    /**< Write-back threshold register. */
@@ -191,7 +191,7 @@ struct igb_tx_queue {
 	/**< Index of first used TX descriptor. */
 	uint16_t               queue_id; /**< TX queue index. */
 	uint16_t               reg_idx;  /**< TX queue register index. */
-	uint8_t                port_id;  /**< Device port identifier. */
+	uint16_t               port_id;  /**< Device port identifier. */
 	uint8_t                pthresh;  /**< Prefetch threshold register. */
 	uint8_t                hthresh;  /**< Host threshold register. */
 	uint8_t                wthresh;  /**< Write-back threshold register. */
diff --git a/drivers/net/failsafe/Makefile b/drivers/net/failsafe/Makefile
index d516d3621..e6bfad728 100644
--- a/drivers/net/failsafe/Makefile
+++ b/drivers/net/failsafe/Makefile
@@ -36,7 +36,7 @@ LIB = librte_pmd_failsafe.a
 
 EXPORT_MAP := rte_pmd_failsafe_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # Sources are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_FAILSAFE) += failsafe.c
diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c
index a3a8cce95..1c8a9337e 100644
--- a/drivers/net/failsafe/failsafe_ether.c
+++ b/drivers/net/failsafe/failsafe_ether.c
@@ -400,7 +400,7 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)
 }
 
 int
-failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused,
+failsafe_eth_rmv_event_callback(uint16_t port_id __rte_unused,
 				enum rte_eth_event_type event __rte_unused,
 				void *cb_arg, void *out __rte_unused)
 {
@@ -419,7 +419,7 @@ failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused,
 }
 
 int
-failsafe_eth_lsc_event_callback(uint8_t port_id __rte_unused,
+failsafe_eth_lsc_event_callback(uint16_t port_id __rte_unused,
 				enum rte_eth_event_type event __rte_unused,
 				void *cb_arg, void *out __rte_unused)
 {
diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h
index 0361cf434..4ae6e6c5f 100644
--- a/drivers/net/failsafe/failsafe_private.h
+++ b/drivers/net/failsafe/failsafe_private.h
@@ -180,10 +180,10 @@ int failsafe_eal_uninit(struct rte_eth_dev *dev);
 
 int failsafe_eth_dev_state_sync(struct rte_eth_dev *dev);
 void failsafe_dev_remove(struct rte_eth_dev *dev);
-int failsafe_eth_rmv_event_callback(uint8_t port_id,
+int failsafe_eth_rmv_event_callback(uint16_t port_id,
 				    enum rte_eth_event_type type,
 				    void *arg, void *out);
-int failsafe_eth_lsc_event_callback(uint8_t port_id,
+int failsafe_eth_lsc_event_callback(uint16_t port_id,
 				    enum rte_eth_event_type event,
 				    void *cb_arg, void *out);
 
diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile
index e0024f052..5034064e4 100644
--- a/drivers/net/fm10k/Makefile
+++ b/drivers/net/fm10k/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_fm10k_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
diff --git a/drivers/net/fm10k/fm10k.h b/drivers/net/fm10k/fm10k.h
index 8e1a95062..060982b10 100644
--- a/drivers/net/fm10k/fm10k.h
+++ b/drivers/net/fm10k/fm10k.h
@@ -204,7 +204,7 @@ struct fm10k_rx_queue {
 	uint16_t rxrearm_nb;     /* number of remaining to be re-armed */
 	uint16_t rxrearm_start;  /* the idx we start the re-arming from */
 	uint16_t rx_using_sse; /* indicates that vector RX is in use */
-	uint8_t port_id;
+	uint16_t port_id;
 	uint8_t drop_en;
 	uint8_t rx_deferred_start; /* don't start this queue in dev start. */
 	uint16_t rx_ftag_en; /* indicates FTAG RX supported */
@@ -241,7 +241,7 @@ struct fm10k_tx_queue {
 	volatile uint32_t *tail_ptr;
 	uint32_t txq_flags; /* Holds flags for this TXq */
 	uint16_t nb_desc;
-	uint8_t port_id;
+	uint16_t port_id;
 	uint8_t tx_deferred_start; /** don't start this queue in dev start. */
 	uint16_t queue_id;
 	uint16_t tx_ftag_en; /* indicates FTAG TX supported */
@@ -289,7 +289,7 @@ static inline uint16_t fifo_remove(struct fifo *fifo)
 }
 
 static inline void
-fm10k_pktmbuf_reset(struct rte_mbuf *mb, uint8_t in_port)
+fm10k_pktmbuf_reset(struct rte_mbuf *mb, uint16_t in_port)
 {
 	rte_mbuf_refcnt_set(mb, 1);
 	mb->next = NULL;
diff --git a/drivers/net/i40e/Makefile b/drivers/net/i40e/Makefile
index 55c79a60a..1290d7f32 100644
--- a/drivers/net/i40e/Makefile
+++ b/drivers/net/i40e/Makefile
@@ -42,7 +42,7 @@ CFLAGS += -DX722_A0_SUPPORT
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # Add extra flags for base driver files (also known as shared code)
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index f12aefa5d..c4c6aec1d 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -1920,8 +1920,9 @@ i40e_dev_start(struct rte_eth_dev *dev)
 	hw->adapter_stopped = 0;
 
 	if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
-		PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; autonegotiation disabled",
-			     dev->data->port_id);
+		PMD_INIT_LOG(ERR,
+		"Invalid link_speeds for port %u, autonegotiation disabled",
+			      dev->data->port_id);
 		return -EINVAL;
 	}
 
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index 20084d649..ff2ab8575 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -121,7 +121,7 @@ struct i40e_rx_queue {
 	uint16_t rxrearm_start;	/**< the idx we start the re-arming from */
 	uint64_t mbuf_initializer; /**< value to init mbufs */
 
-	uint8_t port_id; /**< device port ID */
+	uint16_t port_id; /**< device port ID */
 	uint8_t crc_len; /**< 0 if CRC stripped, 4 otherwise */
 	uint16_t queue_id; /**< RX queue index */
 	uint16_t reg_idx; /**< RX queue register index */
@@ -167,7 +167,7 @@ struct i40e_tx_queue {
 	uint8_t pthresh; /**< Prefetch threshold register. */
 	uint8_t hthresh; /**< Host threshold register. */
 	uint8_t wthresh; /**< Write-back threshold reg. */
-	uint8_t port_id; /**< Device port identifier. */
+	uint16_t port_id; /**< Device port identifier. */
 	uint16_t queue_id; /**< TX queue index. */
 	uint16_t reg_idx;
 	uint32_t txq_flags;
diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index f12b7f4a1..3728d39b9 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -41,7 +41,7 @@
 #include "rte_pmd_i40e.h"
 
 int
-rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf)
+rte_pmd_i40e_ping_vfs(uint16_t port, uint16_t vf)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -66,7 +66,7 @@ rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf)
 }
 
 int
-rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -170,7 +170,7 @@ i40e_add_rm_all_vlan_filter(struct i40e_vsi *vsi, uint8_t add)
 }
 
 int
-rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -430,7 +430,7 @@ i40e_vsi_set_tx_loopback(struct i40e_vsi *vsi, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_tx_loopback(uint8_t port, uint8_t on)
+rte_pmd_i40e_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -473,7 +473,7 @@ rte_pmd_i40e_set_tx_loopback(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_unicast_promisc(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -514,7 +514,7 @@ rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_multicast_promisc(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -555,7 +555,7 @@ rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
 }
 
 int
-rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_mac_addr(uint16_t port, uint16_t vf_id,
 			     struct ether_addr *mac_addr)
 {
 	struct i40e_mac_filter *f;
@@ -598,7 +598,7 @@ rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
 
 /* Set vlan strip on/off for specific VF from host */
 int
-rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf_id, uint8_t on)
+rte_pmd_i40e_set_vf_vlan_stripq(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -633,7 +633,7 @@ rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf_id, uint8_t on)
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_vlan_insert(uint16_t port, uint16_t vf_id,
 				    uint16_t vlan_id)
 {
 	struct rte_eth_dev *dev;
@@ -698,7 +698,7 @@ int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_broadcast(uint16_t port, uint16_t vf_id,
 				  uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -764,7 +764,7 @@ int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
 	return ret;
 }
 
-int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on)
+int rte_pmd_i40e_set_vf_vlan_tag(uint16_t port, uint16_t vf_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -858,7 +858,7 @@ i40e_vlan_filter_count(struct i40e_vsi *vsi)
 	return count;
 }
 
-int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
+int rte_pmd_i40e_set_vf_vlan_filter(uint16_t port, uint16_t vlan_id,
 				    uint64_t vf_mask, uint8_t on)
 {
 	struct rte_eth_dev *dev;
@@ -941,7 +941,7 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
 }
 
 int
-rte_pmd_i40e_get_vf_stats(uint8_t port,
+rte_pmd_i40e_get_vf_stats(uint16_t port,
 			  uint16_t vf_id,
 			  struct rte_eth_stats *stats)
 {
@@ -986,7 +986,7 @@ rte_pmd_i40e_get_vf_stats(uint8_t port,
 }
 
 int
-rte_pmd_i40e_reset_vf_stats(uint8_t port,
+rte_pmd_i40e_reset_vf_stats(uint16_t port,
 			    uint16_t vf_id)
 {
 	struct rte_eth_dev *dev;
@@ -1020,7 +1020,7 @@ rte_pmd_i40e_reset_vf_stats(uint8_t port,
 }
 
 int
-rte_pmd_i40e_set_vf_max_bw(uint8_t port, uint16_t vf_id, uint32_t bw)
+rte_pmd_i40e_set_vf_max_bw(uint16_t port, uint16_t vf_id, uint32_t bw)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -1109,7 +1109,7 @@ rte_pmd_i40e_set_vf_max_bw(uint8_t port, uint16_t vf_id, uint32_t bw)
 }
 
 int
-rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_tc_bw_alloc(uint16_t port, uint16_t vf_id,
 				uint8_t tc_num, uint8_t *bw_weight)
 {
 	struct rte_eth_dev *dev;
@@ -1223,7 +1223,7 @@ rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port, uint16_t vf_id,
 }
 
 int
-rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port, uint16_t vf_id,
+rte_pmd_i40e_set_vf_tc_max_bw(uint16_t port, uint16_t vf_id,
 			      uint8_t tc_no, uint32_t bw)
 {
 	struct rte_eth_dev *dev;
@@ -1341,7 +1341,7 @@ rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port, uint16_t vf_id,
 }
 
 int
-rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map)
+rte_pmd_i40e_set_tc_strict_prio(uint16_t port, uint8_t tc_map)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_pf *pf;
@@ -1513,7 +1513,7 @@ i40e_add_rm_profile_info(struct i40e_hw *hw, uint8_t *profile_info_sec)
 
 /* Check if the profile info exists */
 static int
-i40e_check_profile_info(uint8_t port, uint8_t *profile_info_sec)
+i40e_check_profile_info(uint16_t port, uint8_t *profile_info_sec)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port];
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1557,7 +1557,7 @@ i40e_check_profile_info(uint8_t port, uint8_t *profile_info_sec)
 }
 
 int
-rte_pmd_i40e_process_ddp_package(uint8_t port, uint8_t *buff,
+rte_pmd_i40e_process_ddp_package(uint16_t port, uint8_t *buff,
 				 uint32_t size,
 				 enum rte_pmd_i40e_package_op op)
 {
@@ -1863,7 +1863,7 @@ int rte_pmd_i40e_get_ddp_info(uint8_t *pkg_buff, uint32_t pkg_size,
 }
 
 int
-rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size)
+rte_pmd_i40e_get_ddp_list(uint16_t port, uint8_t *buff, uint32_t size)
 {
 	struct rte_eth_dev *dev;
 	struct i40e_hw *hw;
@@ -1991,7 +1991,7 @@ static int check_invalid_ptype_mapping(
 
 int
 rte_pmd_i40e_ptype_mapping_update(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t count,
 			uint8_t exclusive)
@@ -2027,7 +2027,7 @@ rte_pmd_i40e_ptype_mapping_update(
 	return 0;
 }
 
-int rte_pmd_i40e_ptype_mapping_reset(uint8_t port)
+int rte_pmd_i40e_ptype_mapping_reset(uint16_t port)
 {
 	struct rte_eth_dev *dev;
 
@@ -2044,7 +2044,7 @@ int rte_pmd_i40e_ptype_mapping_reset(uint8_t port)
 }
 
 int rte_pmd_i40e_ptype_mapping_get(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t size,
 			uint16_t *count,
@@ -2078,7 +2078,7 @@ int rte_pmd_i40e_ptype_mapping_get(
 	return 0;
 }
 
-int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
+int rte_pmd_i40e_ptype_mapping_replace(uint16_t port,
 				       uint32_t target,
 				       uint8_t mask,
 				       uint32_t pkt_type)
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 356fa89d7..7f32a59b1 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -157,7 +157,7 @@ struct rte_pmd_i40e_ptype_mapping {
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* invalid.
  */
-int rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf);
+int rte_pmd_i40e_ping_vfs(uint16_t port, uint16_t vf);
 
 /**
  * Enable/Disable VF MAC anti spoofing.
@@ -174,7 +174,7 @@ int rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port,
+int rte_pmd_i40e_set_vf_mac_anti_spoof(uint16_t port,
 				       uint16_t vf_id,
 				       uint8_t on);
 
@@ -193,7 +193,7 @@ int rte_pmd_i40e_set_vf_mac_anti_spoof(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port,
+int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port,
 					uint16_t vf_id,
 					uint8_t on);
 
@@ -210,7 +210,7 @@ int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_tx_loopback(uint8_t port,
+int rte_pmd_i40e_set_tx_loopback(uint16_t port,
 				 uint8_t on);
 
 /**
@@ -228,7 +228,7 @@ int rte_pmd_i40e_set_tx_loopback(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port,
+int rte_pmd_i40e_set_vf_unicast_promisc(uint16_t port,
 					uint16_t vf_id,
 					uint8_t on);
 
@@ -247,7 +247,7 @@ int rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port,
+int rte_pmd_i40e_set_vf_multicast_promisc(uint16_t port,
 					  uint16_t vf_id,
 					  uint8_t on);
 
@@ -271,7 +271,7 @@ int rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_mac_addr(uint16_t port, uint16_t vf_id,
 				 struct ether_addr *mac_addr);
 
 /**
@@ -291,7 +291,7 @@ int rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_i40e_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -309,7 +309,7 @@ rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_vlan_insert(uint16_t port, uint16_t vf_id,
 				    uint16_t vlan_id);
 
 /**
@@ -328,7 +328,7 @@ int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
+int rte_pmd_i40e_set_vf_broadcast(uint16_t port, uint16_t vf_id,
 				  uint8_t on);
 
 /**
@@ -347,7 +347,7 @@ int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on);
+int rte_pmd_i40e_set_vf_vlan_tag(uint16_t port, uint16_t vf_id, uint8_t on);
 
 /**
  * Enable/Disable VF VLAN filter
@@ -368,7 +368,7 @@ int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
+int rte_pmd_i40e_set_vf_vlan_filter(uint16_t port, uint16_t vlan_id,
 				    uint64_t vf_mask, uint8_t on);
 
 /**
@@ -393,7 +393,7 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_i40e_get_vf_stats(uint8_t port,
+int rte_pmd_i40e_get_vf_stats(uint16_t port,
 			      uint16_t vf_id,
 			      struct rte_eth_stats *stats);
 
@@ -409,7 +409,7 @@ int rte_pmd_i40e_get_vf_stats(uint8_t port,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_reset_vf_stats(uint8_t port,
+int rte_pmd_i40e_reset_vf_stats(uint16_t port,
 				uint16_t vf_id);
 
 /**
@@ -434,7 +434,7 @@ int rte_pmd_i40e_reset_vf_stats(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_max_bw(uint8_t port,
+int rte_pmd_i40e_set_vf_max_bw(uint16_t port,
 			       uint16_t vf_id,
 			       uint32_t bw);
 
@@ -459,7 +459,7 @@ int rte_pmd_i40e_set_vf_max_bw(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port,
+int rte_pmd_i40e_set_vf_tc_bw_alloc(uint16_t port,
 				    uint16_t vf_id,
 				    uint8_t tc_num,
 				    uint8_t *bw_weight);
@@ -484,7 +484,7 @@ int rte_pmd_i40e_set_vf_tc_bw_alloc(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port,
+int rte_pmd_i40e_set_vf_tc_max_bw(uint16_t port,
 				  uint16_t vf_id,
 				  uint8_t tc_no,
 				  uint32_t bw);
@@ -502,7 +502,7 @@ int rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map);
+int rte_pmd_i40e_set_tc_strict_prio(uint16_t port, uint8_t tc_map);
 
 /**
  * Load/Unload a ddp package
@@ -523,7 +523,7 @@ int rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map);
  *   - (-EACCES) if profile does not exist.
  *   - (-ENOTSUP) if operation not supported.
  */
-int rte_pmd_i40e_process_ddp_package(uint8_t port, uint8_t *buff,
+int rte_pmd_i40e_process_ddp_package(uint16_t port, uint8_t *buff,
 				     uint32_t size,
 				     enum rte_pmd_i40e_package_op op);
 
@@ -561,7 +561,7 @@ int rte_pmd_i40e_get_ddp_info(uint8_t *pkg, uint32_t pkg_size,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size);
+int rte_pmd_i40e_get_ddp_list(uint16_t port, uint8_t *buff, uint32_t size);
 
 /**
  * Update hardware defined ptype to software defined packet type
@@ -581,7 +581,7 @@ int rte_pmd_i40e_get_ddp_list(uint8_t port, uint8_t *buff, uint32_t size);
  *	set other PTYPEs maps to PTYPE_UNKNOWN.
  */
 int rte_pmd_i40e_ptype_mapping_update(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t count,
 			uint8_t exclusive);
@@ -593,7 +593,7 @@ int rte_pmd_i40e_ptype_mapping_update(
  * @param port
  *    pointer to port identifier of the device
  */
-int rte_pmd_i40e_ptype_mapping_reset(uint8_t port);
+int rte_pmd_i40e_ptype_mapping_reset(uint16_t port);
 
 /**
  * Get hardware defined ptype to software defined ptype
@@ -612,7 +612,7 @@ int rte_pmd_i40e_ptype_mapping_reset(uint8_t port);
  *    -(!0) only return mapping items which packet_type != RTE_PTYPE_UNKNOWN.
  */
 int rte_pmd_i40e_ptype_mapping_get(
-			uint8_t port,
+			uint16_t port,
 			struct rte_pmd_i40e_ptype_mapping *mapping_items,
 			uint16_t size,
 			uint16_t *count,
@@ -632,7 +632,7 @@ int rte_pmd_i40e_ptype_mapping_get(
  * @param pkt_type
  *    the new packet type to overwrite
  */
-int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
+int rte_pmd_i40e_ptype_mapping_replace(uint16_t port,
 				       uint32_t target,
 				       uint8_t mask,
 				       uint32_t pkt_type);
diff --git a/drivers/net/ixgbe/Makefile b/drivers/net/ixgbe/Makefile
index 5e57cb353..18ad4feca 100644
--- a/drivers/net/ixgbe/Makefile
+++ b/drivers/net/ixgbe/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 ifeq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 #
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 9ca5cbcd3..d873c409f 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2508,8 +2508,9 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	*    - fixed speed: TODO implement
 	*/
 	if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
-		PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; fix speed not supported",
-			     dev->data->port_id);
+		PMD_INIT_LOG(ERR,
+		"Invalid link_speeds for port %u, fix speed not supported",
+				dev->data->port_id);
 		return -EINVAL;
 	}
 
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.h b/drivers/net/ixgbe/ixgbe_rxtx.h
index 85feb0bdc..81c527fad 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.h
+++ b/drivers/net/ixgbe/ixgbe_rxtx.h
@@ -148,7 +148,7 @@ struct ixgbe_rx_queue {
 	uint16_t            queue_id; /**< RX queue index. */
 	uint16_t            reg_idx;  /**< RX queue register index. */
 	uint16_t            pkt_type_mask;  /**< Packet type mask for different NICs. */
-	uint8_t             port_id;  /**< Device port identifier. */
+	uint16_t            port_id;  /**< Device port identifier. */
 	uint8_t             crc_len;  /**< 0 if CRC stripped, 4 otherwise. */
 	uint8_t             drop_en;  /**< If not 0, set SRRCTL.Drop_En. */
 	uint8_t             rx_deferred_start; /**< not in global dev start. */
@@ -237,7 +237,7 @@ struct ixgbe_tx_queue {
 	uint16_t tx_next_rs; /**< next desc to set RS bit */
 	uint16_t            queue_id;      /**< TX queue index. */
 	uint16_t            reg_idx;       /**< TX queue register index. */
-	uint8_t             port_id;       /**< Device port identifier. */
+	uint16_t            port_id;       /**< Device port identifier. */
 	uint8_t             pthresh;       /**< Prefetch threshold register. */
 	uint8_t             hthresh;       /**< Host threshold register. */
 	uint8_t             wthresh;       /**< Write-back threshold reg. */
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.c b/drivers/net/ixgbe/rte_pmd_ixgbe.c
index 79897ff64..f12737857 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
@@ -38,7 +38,7 @@
 #include "rte_pmd_ixgbe.h"
 
 int
-rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_mac_addr(uint16_t port, uint16_t vf,
 			      struct ether_addr *mac_addr)
 {
 	struct ixgbe_hw *hw;
@@ -73,7 +73,7 @@ rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf)
+rte_pmd_ixgbe_ping_vf(uint16_t port, uint16_t vf)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_vf_info *vfinfo;
@@ -105,7 +105,7 @@ rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_mac_info *mac;
@@ -135,7 +135,7 @@ rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	struct ixgbe_mac_info *mac;
@@ -164,7 +164,7 @@ rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint16_t vlan_id)
+rte_pmd_ixgbe_set_vf_vlan_insert(uint16_t port, uint16_t vf, uint16_t vlan_id)
 {
 	struct ixgbe_hw *hw;
 	uint32_t ctrl;
@@ -200,7 +200,7 @@ rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint16_t vlan_id)
 }
 
 int
-rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on)
+rte_pmd_ixgbe_set_tx_loopback(uint16_t port, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t ctrl;
@@ -230,7 +230,7 @@ rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on)
+rte_pmd_ixgbe_set_all_queues_drop_en(uint16_t port, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t reg_value;
@@ -260,7 +260,7 @@ rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_split_drop_en(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct ixgbe_hw *hw;
 	uint32_t reg_value;
@@ -295,7 +295,7 @@ rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -342,7 +342,7 @@ rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_rxmode(uint16_t port, uint16_t vf,
 			    uint16_t rx_mask, uint8_t on)
 {
 	int val = 0;
@@ -389,7 +389,7 @@ rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_rx(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -439,7 +439,7 @@ rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on)
+rte_pmd_ixgbe_set_vf_tx(uint16_t port, uint16_t vf, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 	struct rte_pci_device *pci_dev;
@@ -489,7 +489,7 @@ rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on)
 }
 
 int
-rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
+rte_pmd_ixgbe_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
 				 uint64_t vf_mask, uint8_t vlan_on)
 {
 	struct rte_eth_dev *dev;
@@ -524,7 +524,7 @@ rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
 }
 
 int
-rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf,
+rte_pmd_ixgbe_set_vf_rate_limit(uint16_t port, uint16_t vf,
 				uint16_t tx_rate, uint64_t q_msk)
 {
 	struct rte_eth_dev *dev;
@@ -540,7 +540,7 @@ rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf,
 }
 
 int
-rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp)
+rte_pmd_ixgbe_macsec_enable(uint16_t port, uint8_t en, uint8_t rp)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -623,7 +623,7 @@ rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp)
 }
 
 int
-rte_pmd_ixgbe_macsec_disable(uint8_t port)
+rte_pmd_ixgbe_macsec_disable(uint16_t port)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -687,7 +687,7 @@ rte_pmd_ixgbe_macsec_disable(uint8_t port)
 }
 
 int
-rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac)
+rte_pmd_ixgbe_macsec_config_txsc(uint16_t port, uint8_t *mac)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -712,7 +712,7 @@ rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac)
 }
 
 int
-rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi)
+rte_pmd_ixgbe_macsec_config_rxsc(uint16_t port, uint8_t *mac, uint16_t pi)
 {
 	struct ixgbe_hw *hw;
 	struct rte_eth_dev *dev;
@@ -738,7 +738,7 @@ rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi)
 }
 
 int
-rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
+rte_pmd_ixgbe_macsec_select_txsa(uint16_t port, uint8_t idx, uint8_t an,
 				 uint32_t pn, uint8_t *key)
 {
 	struct ixgbe_hw *hw;
@@ -794,7 +794,7 @@ rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
 }
 
 int
-rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
+rte_pmd_ixgbe_macsec_select_rxsa(uint16_t port, uint8_t idx, uint8_t an,
 				 uint32_t pn, uint8_t *key)
 {
 	struct ixgbe_hw *hw;
@@ -837,7 +837,7 @@ rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
 }
 
 int
-rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
+rte_pmd_ixgbe_set_tc_bw_alloc(uint16_t port,
 			      uint8_t tc_num,
 			      uint8_t *bw_weight)
 {
@@ -911,7 +911,7 @@ rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
 
 #ifdef RTE_LIBRTE_IXGBE_BYPASS
 int
-rte_pmd_ixgbe_bypass_init(uint8_t port_id)
+rte_pmd_ixgbe_bypass_init(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -926,7 +926,7 @@ rte_pmd_ixgbe_bypass_init(uint8_t port_id)
 }
 
 int
-rte_pmd_ixgbe_bypass_state_show(uint8_t port_id, uint32_t *state)
+rte_pmd_ixgbe_bypass_state_show(uint16_t port_id, uint32_t *state)
 {
 	struct rte_eth_dev *dev;
 
@@ -940,7 +940,7 @@ rte_pmd_ixgbe_bypass_state_show(uint8_t port_id, uint32_t *state)
 }
 
 int
-rte_pmd_ixgbe_bypass_state_set(uint8_t port_id, uint32_t *new_state)
+rte_pmd_ixgbe_bypass_state_set(uint16_t port_id, uint32_t *new_state)
 {
 	struct rte_eth_dev *dev;
 
@@ -954,7 +954,7 @@ rte_pmd_ixgbe_bypass_state_set(uint8_t port_id, uint32_t *new_state)
 }
 
 int
-rte_pmd_ixgbe_bypass_event_show(uint8_t port_id,
+rte_pmd_ixgbe_bypass_event_show(uint16_t port_id,
 				uint32_t event,
 				uint32_t *state)
 {
@@ -970,7 +970,7 @@ rte_pmd_ixgbe_bypass_event_show(uint8_t port_id,
 }
 
 int
-rte_pmd_ixgbe_bypass_event_store(uint8_t port_id,
+rte_pmd_ixgbe_bypass_event_store(uint16_t port_id,
 				 uint32_t event,
 				 uint32_t state)
 {
@@ -986,7 +986,7 @@ rte_pmd_ixgbe_bypass_event_store(uint8_t port_id,
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port_id, uint32_t timeout)
+rte_pmd_ixgbe_bypass_wd_timeout_store(uint16_t port_id, uint32_t timeout)
 {
 	struct rte_eth_dev *dev;
 
@@ -1000,7 +1000,7 @@ rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port_id, uint32_t timeout)
 }
 
 int
-rte_pmd_ixgbe_bypass_ver_show(uint8_t port_id, uint32_t *ver)
+rte_pmd_ixgbe_bypass_ver_show(uint16_t port_id, uint32_t *ver)
 {
 	struct rte_eth_dev *dev;
 
@@ -1014,7 +1014,7 @@ rte_pmd_ixgbe_bypass_ver_show(uint8_t port_id, uint32_t *ver)
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port_id, uint32_t *wd_timeout)
+rte_pmd_ixgbe_bypass_wd_timeout_show(uint16_t port_id, uint32_t *wd_timeout)
 {
 	struct rte_eth_dev *dev;
 
@@ -1028,7 +1028,7 @@ rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port_id, uint32_t *wd_timeout)
 }
 
 int
-rte_pmd_ixgbe_bypass_wd_reset(uint8_t port_id)
+rte_pmd_ixgbe_bypass_wd_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
diff --git a/drivers/net/ixgbe/rte_pmd_ixgbe.h b/drivers/net/ixgbe/rte_pmd_ixgbe.h
index d33c285db..81b18f876 100644
--- a/drivers/net/ixgbe/rte_pmd_ixgbe.h
+++ b/drivers/net/ixgbe/rte_pmd_ixgbe.h
@@ -53,7 +53,7 @@
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* invalid.
  */
-int rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf);
+int rte_pmd_ixgbe_ping_vf(uint16_t port, uint16_t vf);
 
 /**
  * Set the VF MAC address.
@@ -69,7 +69,7 @@ int rte_pmd_ixgbe_ping_vf(uint8_t port, uint16_t vf);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
  */
-int rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
+int rte_pmd_ixgbe_set_vf_mac_addr(uint16_t port, uint16_t vf,
 		struct ether_addr *mac_addr);
 
 /**
@@ -87,7 +87,8 @@ int rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf,
+					 uint8_t on);
 
 /**
  * Enable/Disable VF MAC anti spoofing.
@@ -104,7 +105,7 @@ int rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan insert
@@ -122,7 +123,7 @@ int rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf,
+int rte_pmd_ixgbe_set_vf_vlan_insert(uint16_t port, uint16_t vf,
 		uint16_t vlan_id);
 
 /**
@@ -139,7 +140,7 @@ int rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on);
+int rte_pmd_ixgbe_set_tx_loopback(uint16_t port, uint8_t on);
 
 /**
  * set all queues drop enable bit
@@ -155,7 +156,7 @@ int rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on);
+int rte_pmd_ixgbe_set_all_queues_drop_en(uint16_t port, uint8_t on);
 
 /**
  * set drop enable bit in the VF split rx control register
@@ -174,7 +175,7 @@ int rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 
-int rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on);
+int rte_pmd_ixgbe_set_vf_split_drop_en(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable/Disable vf vlan strip for all queues in a pool
@@ -194,7 +195,7 @@ int rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-EINVAL) if bad parameter.
  */
 int
-rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_vlan_stripq(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
  * Enable MACsec offload.
@@ -212,7 +213,7 @@ rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp);
+int rte_pmd_ixgbe_macsec_enable(uint16_t port, uint8_t en, uint8_t rp);
 
 /**
  * Disable MACsec offload.
@@ -224,7 +225,7 @@ int rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_disable(uint8_t port);
+int rte_pmd_ixgbe_macsec_disable(uint16_t port);
 
 /**
  * Configure Tx SC (Secure Connection).
@@ -238,7 +239,7 @@ int rte_pmd_ixgbe_macsec_disable(uint8_t port);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac);
+int rte_pmd_ixgbe_macsec_config_txsc(uint16_t port, uint8_t *mac);
 
 /**
  * Configure Rx SC (Secure Connection).
@@ -254,7 +255,7 @@ int rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac);
  *   - (-ENODEV) if *port* invalid.
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  */
-int rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi);
+int rte_pmd_ixgbe_macsec_config_rxsc(uint16_t port, uint8_t *mac, uint16_t pi);
 
 /**
  * Enable Tx SA (Secure Association).
@@ -275,7 +276,7 @@ int rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi);
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
+int rte_pmd_ixgbe_macsec_select_txsa(uint16_t port, uint8_t idx, uint8_t an,
 		uint32_t pn, uint8_t *key);
 
 /**
@@ -297,7 +298,7 @@ int rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
  *   - (-ENOTSUP) if hardware doesn't support this feature.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
+int rte_pmd_ixgbe_macsec_select_rxsa(uint16_t port, uint8_t idx, uint8_t an,
 		uint32_t pn, uint8_t *key);
 
 /**
@@ -323,7 +324,8 @@ int rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf, uint16_t rx_mask, uint8_t on);
+rte_pmd_ixgbe_set_vf_rxmode(uint16_t port, uint16_t vf, uint16_t rx_mask,
+			     uint8_t on);
 
 /**
 * Enable or disable a VF traffic receive of an Ethernet device.
@@ -342,7 +344,7 @@ rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf, uint16_t rx_mask, uint8_t
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_rx(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
 * Enable or disable a VF traffic transmit of the Ethernet device.
@@ -361,7 +363,7 @@ rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on);
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on);
+rte_pmd_ixgbe_set_vf_tx(uint16_t port, uint16_t vf, uint8_t on);
 
 /**
 * Enable/Disable hardware VF VLAN filtering by an Ethernet device of
@@ -383,7 +385,8 @@ rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on);
 *   - (-EINVAL) if bad parameter.
 */
 int
-rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan, uint64_t vf_mask, uint8_t vlan_on);
+rte_pmd_ixgbe_set_vf_vlan_filter(uint16_t port, uint16_t vlan,
+				 uint64_t vf_mask, uint8_t vlan_on);
 
 /**
  * Set the rate limitation for a vf on an Ethernet device.
@@ -402,7 +405,8 @@ rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan, uint64_t vf_mask,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf, uint16_t tx_rate, uint64_t q_msk);
+int rte_pmd_ixgbe_set_vf_rate_limit(uint16_t port, uint16_t vf,
+				     uint16_t tx_rate, uint64_t q_msk);
 
 /**
  * Set all the TCs' bandwidth weight.
@@ -423,7 +427,7 @@ int rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf, uint16_t tx_rate,
  *   - (-EINVAL) if bad parameter.
  *   - (-ENOTSUP) not supported by firmware.
  */
-int rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
+int rte_pmd_ixgbe_set_tc_bw_alloc(uint16_t port,
 				  uint8_t tc_num,
 				  uint8_t *bw_weight);
 
@@ -439,7 +443,7 @@ int rte_pmd_ixgbe_set_tc_bw_alloc(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_init(uint8_t port);
+int rte_pmd_ixgbe_bypass_init(uint16_t port);
 
 /**
  * Return bypass state.
@@ -456,7 +460,7 @@ int rte_pmd_ixgbe_bypass_init(uint8_t port);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_state_show(uint8_t port, uint32_t *state);
+int rte_pmd_ixgbe_bypass_state_show(uint16_t port, uint32_t *state);
 
 /**
  * Set bypass state
@@ -473,7 +477,7 @@ int rte_pmd_ixgbe_bypass_state_show(uint8_t port, uint32_t *state);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_state_set(uint8_t port, uint32_t *new_state);
+int rte_pmd_ixgbe_bypass_state_set(uint16_t port, uint32_t *new_state);
 
 /**
  * Return bypass state when given event occurs.
@@ -497,7 +501,7 @@ int rte_pmd_ixgbe_bypass_state_set(uint8_t port, uint32_t *new_state);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_event_show(uint8_t port,
+int rte_pmd_ixgbe_bypass_event_show(uint16_t port,
 				    uint32_t event,
 				    uint32_t *state);
 
@@ -523,7 +527,7 @@ int rte_pmd_ixgbe_bypass_event_show(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_event_store(uint8_t port,
+int rte_pmd_ixgbe_bypass_event_store(uint16_t port,
 				     uint32_t event,
 				     uint32_t state);
 
@@ -547,7 +551,7 @@ int rte_pmd_ixgbe_bypass_event_store(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port, uint32_t timeout);
+int rte_pmd_ixgbe_bypass_wd_timeout_store(uint16_t port, uint32_t timeout);
 
 /**
  * Get bypass firmware version.
@@ -561,7 +565,7 @@ int rte_pmd_ixgbe_bypass_wd_timeout_store(uint8_t port, uint32_t timeout);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_ver_show(uint8_t port, uint32_t *ver);
+int rte_pmd_ixgbe_bypass_ver_show(uint16_t port, uint32_t *ver);
 
 /**
  * Return bypass watchdog timeout in seconds
@@ -583,7 +587,7 @@ int rte_pmd_ixgbe_bypass_ver_show(uint8_t port, uint32_t *ver);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port, uint32_t *wd_timeout);
+int rte_pmd_ixgbe_bypass_wd_timeout_show(uint16_t port, uint32_t *wd_timeout);
 
 /**
  * Reset bypass watchdog timer
@@ -595,7 +599,7 @@ int rte_pmd_ixgbe_bypass_wd_timeout_show(uint8_t port, uint32_t *wd_timeout);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_pmd_ixgbe_bypass_wd_reset(uint8_t port);
+int rte_pmd_ixgbe_bypass_wd_reset(uint16_t port);
 
 
 /**
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 7de1d1086..238a64f43 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -112,14 +112,14 @@ struct rxq {
 	unsigned int sges_n:2; /* Log 2 of SGEs (max buffers per packet). */
 	unsigned int cqe_n:4; /* Log 2 of CQ elements. */
 	unsigned int elts_n:4; /* Log 2 of Mbufs. */
-	unsigned int port_id:8;
 	unsigned int rss_hash:1; /* RSS hash result is enabled. */
 	unsigned int mark:1; /* Marked flow available on the queue. */
 	unsigned int pending_err:1; /* CQE error needs to be handled. */
 	unsigned int trim_elts:1; /* Whether elts needs clean-up. */
-	unsigned int :6; /* Remaining bits. */
+	unsigned int :14; /* Remaining bits. */
 	volatile uint32_t *rq_db;
 	volatile uint32_t *cq_db;
+	uint16_t port_id;
 	uint16_t rq_ci;
 	uint16_t rq_pi;
 	uint16_t cq_ci;
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 92b03c4cb..f1b968fc2 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -1240,12 +1240,12 @@ nfp_net_dev_link_status_print(struct rte_eth_dev *dev)
 	nfp_net_dev_atomic_read_link_status(dev, &link);
 	if (link.link_status)
 		RTE_LOG(INFO, PMD, "Port %d: Link Up - speed %u Mbps - %s\n",
-			(int)(dev->data->port_id), (unsigned)link.link_speed,
+			dev->data->port_id, link.link_speed,
 			link.link_duplex == ETH_LINK_FULL_DUPLEX
 			? "full-duplex" : "half-duplex");
 	else
 		RTE_LOG(INFO, PMD, " Port %d: Link Down\n",
-			(int)(dev->data->port_id));
+			dev->data->port_id);
 
 	RTE_LOG(INFO, PMD, "PCI Address: %04d:%02d:%02d:%d\n",
 		pci_dev->addr.domain, pci_dev->addr.bus,
@@ -1549,7 +1549,7 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 			"tx_free_thresh must be less than the number of TX "
 			"descriptors. (tx_free_thresh=%u port=%d "
 			"queue=%d)\n", (unsigned int)tx_free_thresh,
-			(int)dev->data->port_id, (int)queue_idx);
+			dev->data->port_id, (int)queue_idx);
 		return -(EINVAL);
 	}
 
@@ -1847,9 +1847,9 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		 */
 		new_mb = rte_pktmbuf_alloc(rxq->mem_pool);
 		if (unlikely(new_mb == NULL)) {
-			RTE_LOG_DP(DEBUG, PMD, "RX mbuf alloc failed port_id=%u "
-				"queue_id=%u\n", (unsigned)rxq->port_id,
-				(unsigned)rxq->qidx);
+			RTE_LOG_DP(DEBUG, PMD,
+			"RX mbuf alloc failed port_id=%u queue_id=%u\n",
+				rxq->port_id, (unsigned int)rxq->qidx);
 			nfp_net_mbuf_alloc_failed(rxq);
 			break;
 		}
@@ -1933,7 +1933,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		return nb_hold;
 
 	PMD_RX_LOG(DEBUG, "RX  port_id=%u queue_id=%u, %d packets received\n",
-		   (unsigned)rxq->port_id, (unsigned)rxq->qidx, nb_hold);
+		   rxq->port_id, (unsigned int)rxq->qidx, nb_hold);
 
 	nb_hold += rxq->nb_rx_hold;
 
@@ -1944,7 +1944,7 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 	rte_wmb();
 	if (nb_hold > rxq->rx_free_thresh) {
 		PMD_RX_LOG(DEBUG, "port=%u queue=%u nb_hold=%u avail=%u\n",
-			   (unsigned)rxq->port_id, (unsigned)rxq->qidx,
+			   rxq->port_id, (unsigned int)rxq->qidx,
 			   (unsigned)nb_hold, (unsigned)avail);
 		nfp_qcp_ptr_add(rxq->qcp_fl, NFP_QCP_WRITE_PTR, nb_hold);
 		nb_hold = 0;
diff --git a/drivers/net/nfp/nfp_net_pmd.h b/drivers/net/nfp/nfp_net_pmd.h
index eec56bc1c..828d0d35b 100644
--- a/drivers/net/nfp/nfp_net_pmd.h
+++ b/drivers/net/nfp/nfp_net_pmd.h
@@ -250,7 +250,7 @@ struct nfp_net_txq {
 	uint32_t tx_hthresh;   /* not used by now. Future? */
 	uint32_t tx_wthresh;   /* not used by now. Future? */
 	uint32_t txq_flags;    /* not used by now. Future? */
-	uint8_t  port_id;
+	uint16_t port_id;
 	int qidx;
 	int tx_qcidx;
 	__le64 dma;
diff --git a/drivers/net/null/Makefile b/drivers/net/null/Makefile
index 77810bced..fdd7c5813 100644
--- a/drivers/net/null/Makefile
+++ b/drivers/net/null/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_null_version.map
 
-LIBABIVER := 2
+LIBABIVER := 3
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c
index 5aef0591e..fa9313dec 100644
--- a/drivers/net/null/rte_eth_null.c
+++ b/drivers/net/null/rte_eth_null.c
@@ -68,7 +68,7 @@ struct null_queue {
 struct pmd_internals {
 	unsigned packet_size;
 	unsigned packet_copy;
-	uint8_t port_id;
+	uint16_t port_id;
 
 	struct null_queue rx_null_queues[RTE_MAX_QUEUES_PER_PORT];
 	struct null_queue tx_null_queues[RTE_MAX_QUEUES_PER_PORT];
diff --git a/drivers/net/pcap/Makefile b/drivers/net/pcap/Makefile
index 7ebd0bef2..f731b126e 100644
--- a/drivers/net/pcap/Makefile
+++ b/drivers/net/pcap/Makefile
@@ -43,7 +43,7 @@ LDLIBS += -lpcap
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index defb3b419..b51f16cbd 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -75,7 +75,7 @@ struct queue_stat {
 
 struct pcap_rx_queue {
 	pcap_t *pcap;
-	uint8_t in_port;
+	uint16_t in_port;
 	struct rte_mempool *mb_pool;
 	struct queue_stat rx_stat;
 	char name[PATH_MAX];
diff --git a/drivers/net/qede/qede_if.h b/drivers/net/qede/qede_if.h
index 9864bb448..96f0d351d 100644
--- a/drivers/net/qede/qede_if.h
+++ b/drivers/net/qede/qede_if.h
@@ -97,7 +97,7 @@ struct qed_link_output {
 	uint32_t speed;		/* In Mb/s */
 	uint32_t adv_speed;	/* Speed mask */
 	uint8_t duplex;		/* In DUPLEX defs */
-	uint8_t port;		/* In PORT defs */
+	uint16_t port;		/* In PORT defs */
 	bool autoneg;
 	uint32_t pause_config;
 };
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index 464d3d384..e3fa7b0e2 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -394,7 +394,7 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[],
 	};
 	char args_str[32] = { 0 };
 	char ring_name[32] = { 0 };
-	uint8_t port_id = RTE_MAX_ETHPORTS;
+	uint16_t port_id = RTE_MAX_ETHPORTS;
 	int ret;
 
 	/* do some parameter checking */
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 9c0d57cc1..d141acf0e 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -71,7 +71,7 @@
 struct szedata2_rx_queue {
 	struct szedata *sze;
 	uint8_t rx_channel;
-	uint8_t in_port;
+	uint16_t in_port;
 	struct rte_mempool *mb_pool;
 	volatile uint64_t rx_pkts;
 	volatile uint64_t rx_bytes;
diff --git a/drivers/net/thunderx/nicvf_struct.h b/drivers/net/thunderx/nicvf_struct.h
index 4ee6c3bb0..e54a96f8e 100644
--- a/drivers/net/thunderx/nicvf_struct.h
+++ b/drivers/net/thunderx/nicvf_struct.h
@@ -100,7 +100,7 @@ struct nicvf_rxq {
 	uint16_t queue_id;
 	uint16_t precharge_cnt;
 	uint8_t rx_drop_en;
-	uint8_t  port_id;
+	uint16_t port_id;
 	uint8_t  rbptr_offset;
 } __rte_cache_aligned;
 
diff --git a/drivers/net/vhost/Makefile b/drivers/net/vhost/Makefile
index 3ba8ad64f..258a917c7 100644
--- a/drivers/net/vhost/Makefile
+++ b/drivers/net/vhost/Makefile
@@ -43,7 +43,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_vhost_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 0dac5e60e..04179b4db 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -105,7 +105,7 @@ struct vhost_queue {
 	rte_atomic32_t while_queuing;
 	struct pmd_internal *internal;
 	struct rte_mempool *mb_pool;
-	uint8_t port;
+	uint16_t port;
 	uint16_t virtqueue_id;
 	struct vhost_stats stats;
 };
@@ -705,7 +705,7 @@ static struct vhost_device_ops vhost_ops = {
 };
 
 int
-rte_eth_vhost_get_queue_event(uint8_t port_id,
+rte_eth_vhost_get_queue_event(uint16_t port_id,
 		struct rte_eth_vhost_queue_event *event)
 {
 	struct rte_vhost_vring_state *state;
@@ -742,7 +742,7 @@ rte_eth_vhost_get_queue_event(uint8_t port_id,
 }
 
 int
-rte_eth_vhost_get_vid_from_port_id(uint8_t port_id)
+rte_eth_vhost_get_vid_from_port_id(uint16_t port_id)
 {
 	struct internal_list *list;
 	struct rte_eth_dev *eth_dev;
diff --git a/drivers/net/vhost/rte_eth_vhost.h b/drivers/net/vhost/rte_eth_vhost.h
index 39ca77197..948f3c810 100644
--- a/drivers/net/vhost/rte_eth_vhost.h
+++ b/drivers/net/vhost/rte_eth_vhost.h
@@ -69,7 +69,7 @@ struct rte_eth_vhost_queue_event {
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_vhost_get_queue_event(uint8_t port_id,
+int rte_eth_vhost_get_queue_event(uint16_t port_id,
 		struct rte_eth_vhost_queue_event *event);
 
 /**
@@ -79,7 +79,7 @@ int rte_eth_vhost_get_queue_event(uint8_t port_id,
  *  - On success, the 'vid' associated with 'port_id'.
  *  - On failure, a negative value.
  */
-int rte_eth_vhost_get_vid_from_port_id(uint8_t port_id);
+int rte_eth_vhost_get_vid_from_port_id(uint16_t port_id);
 
 #ifdef __cplusplus
 }
diff --git a/drivers/net/virtio/Makefile b/drivers/net/virtio/Makefile
index b21b87814..ad4b695a3 100644
--- a/drivers/net/virtio/Makefile
+++ b/drivers/net/virtio/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 #
 # all source are stored in SRCS-y
diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h
index 18caebdd7..330ee94be 100644
--- a/drivers/net/virtio/virtio_pci.h
+++ b/drivers/net/virtio/virtio_pci.h
@@ -260,7 +260,7 @@ struct virtio_hw {
 	uint8_t	    use_msix;
 	uint8_t     modern;
 	uint8_t     use_simple_rxtx;
-	uint8_t     port_id;
+	uint16_t    port_id;
 	uint8_t     mac_addr[ETHER_ADDR_LEN];
 	uint32_t    notify_off_multiplier;
 	uint8_t     *isr;
diff --git a/drivers/net/virtio/virtio_rxtx.h b/drivers/net/virtio/virtio_rxtx.h
index 28f82d6a8..198b2d8fb 100644
--- a/drivers/net/virtio/virtio_rxtx.h
+++ b/drivers/net/virtio/virtio_rxtx.h
@@ -54,7 +54,7 @@ struct virtnet_rx {
 	struct rte_mempool *mpool; /**< mempool for mbuf allocation */
 
 	uint16_t queue_id;   /**< DPDK queue index. */
-	uint8_t port_id;     /**< Device port identifier. */
+	uint16_t port_id;     /**< Device port identifier. */
 
 	/* Statistics */
 	struct virtnet_stats stats;
@@ -69,7 +69,7 @@ struct virtnet_tx {
 	phys_addr_t virtio_net_hdr_mem;  /**< hdr for each xmit packet */
 
 	uint16_t    queue_id;            /**< DPDK queue index. */
-	uint8_t     port_id;             /**< Device port identifier. */
+	uint16_t    port_id;             /**< Device port identifier. */
 
 	/* Statistics */
 	struct virtnet_stats stats;
@@ -82,7 +82,7 @@ struct virtnet_ctl {
 	/**< memzone to populate hdr. */
 	const struct rte_memzone *virtio_net_hdr_mz;
 	phys_addr_t virtio_net_hdr_mem; /**< hdr for each xmit packet */
-	uint8_t port_id;                /**< Device port identifier. */
+	uint16_t port_id;               /**< Device port identifier. */
 	const struct rte_memzone *mz;   /**< mem zone to populate RX ring. */
 };
 
diff --git a/drivers/net/vmxnet3/vmxnet3_ring.h b/drivers/net/vmxnet3/vmxnet3_ring.h
index d2e8323ba..a6fa93ac7 100644
--- a/drivers/net/vmxnet3/vmxnet3_ring.h
+++ b/drivers/net/vmxnet3/vmxnet3_ring.h
@@ -144,7 +144,7 @@ typedef struct vmxnet3_tx_queue {
 	const struct rte_memzone     *mz;
 	bool                         stopped;
 	uint16_t                     queue_id;      /**< Device TX queue index. */
-	uint8_t                      port_id;       /**< Device port identifier. */
+	uint16_t                     port_id;       /**< Device port identifier. */
 	uint16_t		     txdata_desc_size;
 } vmxnet3_tx_queue_t;
 
@@ -179,7 +179,7 @@ typedef struct vmxnet3_rx_queue {
 	const struct rte_memzone    *mz;
 	bool                        stopped;
 	uint16_t                    queue_id;      /**< Device RX queue index. */
-	uint8_t                     port_id;       /**< Device port identifier. */
+	uint16_t                    port_id;       /**< Device port identifier. */
 } vmxnet3_rx_queue_t;
 
 #endif /* _VMXNET3_RING_H_ */
diff --git a/lib/librte_bitratestats/Makefile b/lib/librte_bitratestats/Makefile
index 58a20ea09..a079cced7 100644
--- a/lib/librte_bitratestats/Makefile
+++ b/lib/librte_bitratestats/Makefile
@@ -38,7 +38,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_bitratestats_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_BITRATE) := rte_bitrate.c
diff --git a/lib/librte_bitratestats/rte_bitrate.c b/lib/librte_bitratestats/rte_bitrate.c
index 3ceb35166..f373697a7 100644
--- a/lib/librte_bitratestats/rte_bitrate.c
+++ b/lib/librte_bitratestats/rte_bitrate.c
@@ -84,7 +84,7 @@ rte_stats_bitrate_reg(struct rte_stats_bitrates *bitrate_data)
 
 int
 rte_stats_bitrate_calc(struct rte_stats_bitrates *bitrate_data,
-	uint8_t port_id)
+			uint16_t port_id)
 {
 	struct rte_stats_bitrate *port_data;
 	struct rte_eth_stats eth_stats;
diff --git a/lib/librte_bitratestats/rte_bitrate.h b/lib/librte_bitratestats/rte_bitrate.h
index 15fc270a3..16467221b 100644
--- a/lib/librte_bitratestats/rte_bitrate.h
+++ b/lib/librte_bitratestats/rte_bitrate.h
@@ -85,7 +85,7 @@ int rte_stats_bitrate_reg(struct rte_stats_bitrates *bitrate_data);
  *  - Negative value on error
  */
 int rte_stats_bitrate_calc(struct rte_stats_bitrates *bitrate_data,
-	uint8_t port_id);
+			   uint16_t port_id);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 27d9766a8..0bacc8b3f 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ethdev_version.map
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 SRCS-y += rte_ethdev.c
 SRCS-y += rte_flow.c
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index a88916f2a..e756dbc46 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -138,8 +138,8 @@ enum {
 	STAT_QMAP_RX
 };
 
-uint8_t
-rte_eth_find_next(uint8_t port_id)
+uint16_t
+rte_eth_find_next(uint16_t port_id)
 {
 	while (port_id < RTE_MAX_ETHPORTS &&
 	       rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED)
@@ -187,7 +187,7 @@ rte_eth_dev_allocated(const char *name)
 	return NULL;
 }
 
-static uint8_t
+static uint16_t
 rte_eth_dev_find_free_port(void)
 {
 	unsigned i;
@@ -200,7 +200,7 @@ rte_eth_dev_find_free_port(void)
 }
 
 static struct rte_eth_dev *
-eth_dev_get(uint8_t port_id)
+eth_dev_get(uint16_t port_id)
 {
 	struct rte_eth_dev *eth_dev = &rte_eth_devices[port_id];
 
@@ -216,7 +216,7 @@ eth_dev_get(uint8_t port_id)
 struct rte_eth_dev *
 rte_eth_dev_allocate(const char *name)
 {
-	uint8_t port_id;
+	uint16_t port_id;
 	struct rte_eth_dev *eth_dev;
 
 	port_id = rte_eth_dev_find_free_port();
@@ -251,7 +251,7 @@ rte_eth_dev_allocate(const char *name)
 struct rte_eth_dev *
 rte_eth_dev_attach_secondary(const char *name)
 {
-	uint8_t i;
+	uint16_t i;
 	struct rte_eth_dev *eth_dev;
 
 	if (rte_eth_dev_data == NULL)
@@ -285,7 +285,7 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
 }
 
 int
-rte_eth_dev_is_valid_port(uint8_t port_id)
+rte_eth_dev_is_valid_port(uint16_t port_id)
 {
 	if (port_id >= RTE_MAX_ETHPORTS ||
 	    (rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED &&
@@ -296,17 +296,17 @@ rte_eth_dev_is_valid_port(uint8_t port_id)
 }
 
 int
-rte_eth_dev_socket_id(uint8_t port_id)
+rte_eth_dev_socket_id(uint16_t port_id)
 {
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
 	return rte_eth_devices[port_id].data->numa_node;
 }
 
-uint8_t
+uint16_t
 rte_eth_dev_count(void)
 {
-	uint8_t p;
-	uint8_t count;
+	uint16_t p;
+	uint16_t count;
 
 	count = 0;
 
@@ -317,7 +317,7 @@ rte_eth_dev_count(void)
 }
 
 int
-rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
+rte_eth_dev_get_name_by_port(uint16_t port_id, char *name)
 {
 	const char *tmp;
 
@@ -336,7 +336,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
 }
 
 int
-rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
+rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)
 {
 	int ret;
 	int i;
@@ -361,7 +361,7 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
 }
 
 static int
-rte_eth_dev_is_detachable(uint8_t port_id)
+rte_eth_dev_is_detachable(uint16_t port_id)
 {
 	uint32_t dev_flags;
 
@@ -377,7 +377,7 @@ rte_eth_dev_is_detachable(uint8_t port_id)
 
 /* attach the new device, then store port_id of the device */
 int
-rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
+rte_eth_dev_attach(const char *devargs, uint16_t *port_id)
 {
 	int ret = -1;
 	int current = rte_eth_dev_count();
@@ -423,7 +423,7 @@ rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
 
 /* detach the device, then store the name of the device */
 int
-rte_eth_dev_detach(uint8_t port_id, char *name)
+rte_eth_dev_detach(uint16_t port_id, char *name)
 {
 	int ret = -1;
 
@@ -501,7 +501,7 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
 }
 
 int
-rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -527,7 +527,7 @@ rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -553,7 +553,7 @@ rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -579,7 +579,7 @@ rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -688,7 +688,7 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
 }
 
 int
-rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
+rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
 {
 	struct rte_eth_dev *dev;
@@ -839,7 +839,7 @@ _rte_eth_dev_reset(struct rte_eth_dev *dev)
 }
 
 static void
-rte_eth_dev_config_restore(uint8_t port_id)
+rte_eth_dev_config_restore(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -894,7 +894,7 @@ rte_eth_dev_config_restore(uint8_t port_id)
 }
 
 int
-rte_eth_dev_start(uint8_t port_id)
+rte_eth_dev_start(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int diag;
@@ -906,7 +906,7 @@ rte_eth_dev_start(uint8_t port_id)
 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_start, -ENOTSUP);
 
 	if (dev->data->dev_started != 0) {
-		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu8
+		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
 			" already started\n",
 			port_id);
 		return 0;
@@ -928,7 +928,7 @@ rte_eth_dev_start(uint8_t port_id)
 }
 
 void
-rte_eth_dev_stop(uint8_t port_id)
+rte_eth_dev_stop(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -938,7 +938,7 @@ rte_eth_dev_stop(uint8_t port_id)
 	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_stop);
 
 	if (dev->data->dev_started == 0) {
-		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu8
+		RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
 			" already stopped\n",
 			port_id);
 		return;
@@ -949,7 +949,7 @@ rte_eth_dev_stop(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_up(uint8_t port_id)
+rte_eth_dev_set_link_up(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -962,7 +962,7 @@ rte_eth_dev_set_link_up(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_down(uint8_t port_id)
+rte_eth_dev_set_link_down(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -975,7 +975,7 @@ rte_eth_dev_set_link_down(uint8_t port_id)
 }
 
 void
-rte_eth_dev_close(uint8_t port_id)
+rte_eth_dev_close(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -995,7 +995,7 @@ rte_eth_dev_close(uint8_t port_id)
 }
 
 int
-rte_eth_dev_reset(uint8_t port_id)
+rte_eth_dev_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int ret;
@@ -1012,7 +1012,7 @@ rte_eth_dev_reset(uint8_t port_id)
 }
 
 int
-rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 		       uint16_t nb_rx_desc, unsigned int socket_id,
 		       const struct rte_eth_rxconf *rx_conf,
 		       struct rte_mempool *mp)
@@ -1103,7 +1103,7 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
 }
 
 int
-rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 		       uint16_t nb_tx_desc, unsigned int socket_id,
 		       const struct rte_eth_txconf *tx_conf)
 {
@@ -1207,7 +1207,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size)
 }
 
 int
-rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt)
+rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 
@@ -1221,7 +1221,7 @@ rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt)
 }
 
 void
-rte_eth_promiscuous_enable(uint8_t port_id)
+rte_eth_promiscuous_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1234,7 +1234,7 @@ rte_eth_promiscuous_enable(uint8_t port_id)
 }
 
 void
-rte_eth_promiscuous_disable(uint8_t port_id)
+rte_eth_promiscuous_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1247,7 +1247,7 @@ rte_eth_promiscuous_disable(uint8_t port_id)
 }
 
 int
-rte_eth_promiscuous_get(uint8_t port_id)
+rte_eth_promiscuous_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1258,7 +1258,7 @@ rte_eth_promiscuous_get(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_enable(uint8_t port_id)
+rte_eth_allmulticast_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1271,7 +1271,7 @@ rte_eth_allmulticast_enable(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_disable(uint8_t port_id)
+rte_eth_allmulticast_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1284,7 +1284,7 @@ rte_eth_allmulticast_disable(uint8_t port_id)
 }
 
 int
-rte_eth_allmulticast_get(uint8_t port_id)
+rte_eth_allmulticast_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1309,7 +1309,7 @@ rte_eth_dev_atomic_read_link_status(struct rte_eth_dev *dev,
 }
 
 void
-rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get(uint16_t port_id, struct rte_eth_link *eth_link)
 {
 	struct rte_eth_dev *dev;
 
@@ -1326,7 +1326,7 @@ rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 void
-rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *eth_link)
 {
 	struct rte_eth_dev *dev;
 
@@ -1343,7 +1343,7 @@ rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 int
-rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
+rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
 {
 	struct rte_eth_dev *dev;
 
@@ -1359,7 +1359,7 @@ rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
 }
 
 void
-rte_eth_stats_reset(uint8_t port_id)
+rte_eth_stats_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1372,7 +1372,7 @@ rte_eth_stats_reset(uint8_t port_id)
 }
 
 static int
-get_xstats_count(uint8_t port_id)
+get_xstats_count(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int count;
@@ -1401,7 +1401,7 @@ get_xstats_count(uint8_t port_id)
 }
 
 int
-rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
+rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
 		uint64_t *id)
 {
 	int cnt_xstats, idx_xstat;
@@ -1445,7 +1445,7 @@ rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
 }
 
 int
-rte_eth_xstats_get_names_by_id(uint8_t port_id,
+rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names, unsigned int size,
 	uint64_t *ids)
 {
@@ -1562,7 +1562,7 @@ rte_eth_xstats_get_names_by_id(uint8_t port_id,
 }
 
 int
-rte_eth_xstats_get_names(uint8_t port_id,
+rte_eth_xstats_get_names(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names,
 	unsigned int size)
 {
@@ -1628,8 +1628,8 @@ rte_eth_xstats_get_names(uint8_t port_id,
 
 /* retrieve ethdev extended statistics */
 int
-rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids, uint64_t *values,
-	unsigned int n)
+rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
+			 uint64_t *values, unsigned int n)
 {
 	/* If need all xstats */
 	if (!ids) {
@@ -1754,7 +1754,7 @@ rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids, uint64_t *values,
 }
 
 int
-rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
+rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
 	unsigned int n)
 {
 	struct rte_eth_stats eth_stats;
@@ -1836,7 +1836,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
 
 /* reset ethdev extended statistics */
 void
-rte_eth_xstats_reset(uint8_t port_id)
+rte_eth_xstats_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1854,7 +1854,7 @@ rte_eth_xstats_reset(uint8_t port_id)
 }
 
 static int
-set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
+set_queue_stats_mapping(uint16_t port_id, uint16_t queue_id, uint8_t stat_idx,
 		uint8_t is_rx)
 {
 	struct rte_eth_dev *dev;
@@ -1870,7 +1870,7 @@ set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
 
 
 int
-rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t tx_queue_id,
 		uint8_t stat_idx)
 {
 	return set_queue_stats_mapping(port_id, tx_queue_id, stat_idx,
@@ -1879,7 +1879,7 @@ rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
 
 
 int
-rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t rx_queue_id,
 		uint8_t stat_idx)
 {
 	return set_queue_stats_mapping(port_id, rx_queue_id, stat_idx,
@@ -1887,7 +1887,7 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
 }
 
 int
-rte_eth_dev_fw_version_get(uint8_t port_id, char *fw_version, size_t fw_size)
+rte_eth_dev_fw_version_get(uint16_t port_id, char *fw_version, size_t fw_size)
 {
 	struct rte_eth_dev *dev;
 
@@ -1899,7 +1899,7 @@ rte_eth_dev_fw_version_get(uint8_t port_id, char *fw_version, size_t fw_size)
 }
 
 void
-rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
+rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)
 {
 	struct rte_eth_dev *dev;
 	const struct rte_eth_desc_lim lim = {
@@ -1923,7 +1923,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
 }
 
 int
-rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
+rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
 				 uint32_t *ptypes, int num)
 {
 	int i, j;
@@ -1949,7 +1949,7 @@ rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
 }
 
 void
-rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
+rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *dev;
 
@@ -1960,7 +1960,7 @@ rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
 
 
 int
-rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
+rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu)
 {
 	struct rte_eth_dev *dev;
 
@@ -1972,7 +1972,7 @@ rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
 }
 
 int
-rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
+rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
 {
 	int ret;
 	struct rte_eth_dev *dev;
@@ -1989,7 +1989,7 @@ rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
 }
 
 int
-rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
+rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on)
 {
 	struct rte_eth_dev *dev;
 	int ret;
@@ -2028,7 +2028,8 @@ rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
 }
 
 int
-rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int on)
+rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
+				    int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2046,7 +2047,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int o
 }
 
 int
-rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 				enum rte_vlan_type vlan_type,
 				uint16_t tpid)
 {
@@ -2060,7 +2061,7 @@ rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
 }
 
 int
-rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
+rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 {
 	struct rte_eth_dev *dev;
 	int ret = 0;
@@ -2103,7 +2104,7 @@ rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
 }
 
 int
-rte_eth_dev_get_vlan_offload(uint8_t port_id)
+rte_eth_dev_get_vlan_offload(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int ret = 0;
@@ -2124,7 +2125,7 @@ rte_eth_dev_get_vlan_offload(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
+rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2137,7 +2138,7 @@ rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
 }
 
 int
-rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2149,7 +2150,7 @@ rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2165,7 +2166,8 @@ rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id, struct rte_eth_pfc_conf *pfc_conf)
+rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
+				   struct rte_eth_pfc_conf *pfc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2231,7 +2233,7 @@ rte_eth_check_reta_entry(struct rte_eth_rss_reta_entry64 *reta_conf,
 }
 
 int
-rte_eth_dev_rss_reta_update(uint8_t port_id,
+rte_eth_dev_rss_reta_update(uint16_t port_id,
 			    struct rte_eth_rss_reta_entry64 *reta_conf,
 			    uint16_t reta_size)
 {
@@ -2257,7 +2259,7 @@ rte_eth_dev_rss_reta_update(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_reta_query(uint8_t port_id,
+rte_eth_dev_rss_reta_query(uint16_t port_id,
 			   struct rte_eth_rss_reta_entry64 *reta_conf,
 			   uint16_t reta_size)
 {
@@ -2277,7 +2279,8 @@ rte_eth_dev_rss_reta_query(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
+rte_eth_dev_rss_hash_update(uint16_t port_id,
+			    struct rte_eth_rss_conf *rss_conf)
 {
 	struct rte_eth_dev *dev;
 	uint16_t rss_hash_protos;
@@ -2296,7 +2299,7 @@ rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
 }
 
 int
-rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 			      struct rte_eth_rss_conf *rss_conf)
 {
 	struct rte_eth_dev *dev;
@@ -2308,7 +2311,7 @@ rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
 				struct rte_eth_udp_tunnel *udp_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -2330,7 +2333,7 @@ rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
 				   struct rte_eth_udp_tunnel *udp_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -2353,7 +2356,7 @@ rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
 }
 
 int
-rte_eth_led_on(uint8_t port_id)
+rte_eth_led_on(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2364,7 +2367,7 @@ rte_eth_led_on(uint8_t port_id)
 }
 
 int
-rte_eth_led_off(uint8_t port_id)
+rte_eth_led_off(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2379,7 +2382,7 @@ rte_eth_led_off(uint8_t port_id)
  * an empty spot.
  */
 static int
-get_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
+get_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2398,7 +2401,7 @@ get_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
 static const struct ether_addr null_mac_addr;
 
 int
-rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_mac_addr_add(uint16_t port_id, struct ether_addr *addr,
 			uint32_t pool)
 {
 	struct rte_eth_dev *dev;
@@ -2451,7 +2454,7 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_mac_addr_remove(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev *dev;
 	int index;
@@ -2480,7 +2483,7 @@ rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev *dev;
 
@@ -2506,7 +2509,7 @@ rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr *addr)
  * an empty spot.
  */
 static int
-get_hash_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
+get_hash_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2525,7 +2528,7 @@ get_hash_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct ether_addr *addr,
 				uint8_t on)
 {
 	int index;
@@ -2577,7 +2580,7 @@ rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
+rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2589,7 +2592,7 @@ rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
 	return (*dev->dev_ops->uc_all_hash_table_set)(dev, on);
 }
 
-int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 					uint16_t tx_rate)
 {
 	struct rte_eth_dev *dev;
@@ -2620,7 +2623,7 @@ int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
 }
 
 int
-rte_eth_mirror_rule_set(uint8_t port_id,
+rte_eth_mirror_rule_set(uint16_t port_id,
 			struct rte_eth_mirror_conf *mirror_conf,
 			uint8_t rule_id, uint8_t on)
 {
@@ -2658,7 +2661,7 @@ rte_eth_mirror_rule_set(uint8_t port_id,
 }
 
 int
-rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
+rte_eth_mirror_rule_reset(uint16_t port_id, uint8_t rule_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2671,7 +2674,7 @@ rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
 }
 
 int
-rte_eth_dev_callback_register(uint8_t port_id,
+rte_eth_dev_callback_register(uint16_t port_id,
 			enum rte_eth_event_type event,
 			rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2711,7 +2714,7 @@ rte_eth_dev_callback_register(uint8_t port_id,
 }
 
 int
-rte_eth_dev_callback_unregister(uint8_t port_id,
+rte_eth_dev_callback_unregister(uint16_t port_id,
 			enum rte_eth_event_type event,
 			rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2783,7 +2786,7 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 }
 
 int
-rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 {
 	uint32_t vec;
 	struct rte_eth_dev *dev;
@@ -2844,7 +2847,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
 }
 
 int
-rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			  int epfd, int op, void *data)
 {
 	uint32_t vec;
@@ -2884,7 +2887,7 @@ rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_dev_rx_intr_enable(uint8_t port_id,
+rte_eth_dev_rx_intr_enable(uint16_t port_id,
 			   uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
@@ -2898,7 +2901,7 @@ rte_eth_dev_rx_intr_enable(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rx_intr_disable(uint8_t port_id,
+rte_eth_dev_rx_intr_disable(uint16_t port_id,
 			    uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
@@ -2913,7 +2916,8 @@ rte_eth_dev_rx_intr_disable(uint8_t port_id,
 
 
 int
-rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
+rte_eth_dev_filter_supported(uint16_t port_id,
+			     enum rte_filter_type filter_type)
 {
 	struct rte_eth_dev *dev;
 
@@ -2926,7 +2930,7 @@ rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
 }
 
 int
-rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
+rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
 		       enum rte_filter_op filter_op, void *arg)
 {
 	struct rte_eth_dev *dev;
@@ -2939,7 +2943,7 @@ rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
 }
 
 void *
-rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -2981,7 +2985,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 void *
-rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3016,7 +3020,7 @@ rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 void *
-rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_tx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3059,7 +3063,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3093,7 +3097,7 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3127,7 +3131,7 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_rxq_info *qinfo)
 {
 	struct rte_eth_dev *dev;
@@ -3151,7 +3155,7 @@ rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_txq_info *qinfo)
 {
 	struct rte_eth_dev *dev;
@@ -3175,7 +3179,7 @@ rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_dev_set_mc_addr_list(uint8_t port_id,
+rte_eth_dev_set_mc_addr_list(uint16_t port_id,
 			     struct ether_addr *mc_addr_set,
 			     uint32_t nb_mc_addr)
 {
@@ -3189,7 +3193,7 @@ rte_eth_dev_set_mc_addr_list(uint8_t port_id,
 }
 
 int
-rte_eth_timesync_enable(uint8_t port_id)
+rte_eth_timesync_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3201,7 +3205,7 @@ rte_eth_timesync_enable(uint8_t port_id)
 }
 
 int
-rte_eth_timesync_disable(uint8_t port_id)
+rte_eth_timesync_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3213,7 +3217,7 @@ rte_eth_timesync_disable(uint8_t port_id)
 }
 
 int
-rte_eth_timesync_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp,
+rte_eth_timesync_read_rx_timestamp(uint16_t port_id, struct timespec *timestamp,
 				   uint32_t flags)
 {
 	struct rte_eth_dev *dev;
@@ -3226,7 +3230,8 @@ rte_eth_timesync_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp,
 }
 
 int
-rte_eth_timesync_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp)
+rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
+				   struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3238,7 +3243,7 @@ rte_eth_timesync_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp)
 }
 
 int
-rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta)
+rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta)
 {
 	struct rte_eth_dev *dev;
 
@@ -3250,7 +3255,7 @@ rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta)
 }
 
 int
-rte_eth_timesync_read_time(uint8_t port_id, struct timespec *timestamp)
+rte_eth_timesync_read_time(uint16_t port_id, struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3262,7 +3267,7 @@ rte_eth_timesync_read_time(uint8_t port_id, struct timespec *timestamp)
 }
 
 int
-rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
+rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp)
 {
 	struct rte_eth_dev *dev;
 
@@ -3274,7 +3279,7 @@ rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
 }
 
 int
-rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
+rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3286,7 +3291,7 @@ rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
 }
 
 int
-rte_eth_dev_get_eeprom_length(uint8_t port_id)
+rte_eth_dev_get_eeprom_length(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3298,7 +3303,7 @@ rte_eth_dev_get_eeprom_length(uint8_t port_id)
 }
 
 int
-rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
+rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3310,7 +3315,7 @@ rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
 }
 
 int
-rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
+rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
 	struct rte_eth_dev *dev;
 
@@ -3322,7 +3327,7 @@ rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
 }
 
 int
-rte_eth_dev_get_dcb_info(uint8_t port_id,
+rte_eth_dev_get_dcb_info(uint16_t port_id,
 			     struct rte_eth_dcb_info *dcb_info)
 {
 	struct rte_eth_dev *dev;
@@ -3337,7 +3342,7 @@ rte_eth_dev_get_dcb_info(uint8_t port_id,
 }
 
 int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
 				    struct rte_eth_l2_tunnel_conf *l2_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -3360,7 +3365,7 @@ rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
 }
 
 int
-rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
 				  struct rte_eth_l2_tunnel_conf *l2_tunnel,
 				  uint32_t mask,
 				  uint8_t en)
@@ -3404,7 +3409,7 @@ rte_eth_dev_adjust_nb_desc(uint16_t *nb_desc,
 }
 
 int
-rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
 				 uint16_t *nb_rx_desc,
 				 uint16_t *nb_tx_desc)
 {
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 99cdd54d4..34f729ab8 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1572,7 +1572,7 @@ struct eth_dev_ops {
  * @return
  *   The number of packets returned to the user.
  */
-typedef uint16_t (*rte_rx_callback_fn)(uint8_t port, uint16_t queue,
+typedef uint16_t (*rte_rx_callback_fn)(uint16_t port, uint16_t queue,
 	struct rte_mbuf *pkts[], uint16_t nb_pkts, uint16_t max_pkts,
 	void *user_param);
 
@@ -1596,7 +1596,7 @@ typedef uint16_t (*rte_rx_callback_fn)(uint8_t port, uint16_t queue,
  * @return
  *   The number of packets to be written to the NIC.
  */
-typedef uint16_t (*rte_tx_callback_fn)(uint8_t port, uint16_t queue,
+typedef uint16_t (*rte_tx_callback_fn)(uint16_t port, uint16_t queue,
 	struct rte_mbuf *pkts[], uint16_t nb_pkts, void *user_param);
 
 /**
@@ -1699,7 +1699,7 @@ struct rte_eth_dev_data {
 	/** bitmap array of associating Ethernet MAC addresses to pools */
 	struct ether_addr* hash_mac_addrs;
 	/** Device Ethernet MAC addresses of hash filtering. */
-	uint8_t port_id;           /**< Device [external] port identifier. */
+	uint16_t port_id;           /**< Device [external] port identifier. */
 	__extension__
 	uint8_t promiscuous   : 1, /**< RX promiscuous mode ON(1) / OFF(0). */
 		scattered_rx : 1,  /**< RX of scattered packets is ON(1) / OFF(0) */
@@ -1741,7 +1741,7 @@ extern struct rte_eth_dev rte_eth_devices[];
  * @return
  *   Next valid port id, RTE_MAX_ETHPORTS if there is none.
  */
-uint8_t rte_eth_find_next(uint8_t port_id);
+uint16_t rte_eth_find_next(uint16_t port_id);
 
 /**
  * Macro to iterate over all enabled ethdev ports.
@@ -1764,7 +1764,7 @@ uint8_t rte_eth_find_next(uint8_t port_id);
  * @return
  *   - The total number of usable Ethernet devices.
  */
-uint8_t rte_eth_dev_count(void);
+uint16_t rte_eth_dev_count(void);
 
 /**
  * @internal
@@ -1825,7 +1825,7 @@ int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev);
  * @return
  *  0 on success and port_id is filled, negative on error
  */
-int rte_eth_dev_attach(const char *devargs, uint8_t *port_id);
+int rte_eth_dev_attach(const char *devargs, uint16_t *port_id);
 
 /**
  * Detach a Ethernet device specified by port identifier.
@@ -1840,7 +1840,7 @@ int rte_eth_dev_attach(const char *devargs, uint8_t *port_id);
  * @return
  *  0 on success and devname is filled, negative on error
  */
-int rte_eth_dev_detach(uint8_t port_id, char *devname);
+int rte_eth_dev_detach(uint16_t port_id, char *devname);
 
 /**
  * Convert a numerical speed in Mbps to a bitmap flag that can be used in
@@ -1884,7 +1884,7 @@ uint32_t rte_eth_speed_bitflag(uint32_t speed, int duplex);
  *   - 0: Success, device configured.
  *   - <0: Error code returned by the driver configuration function.
  */
-int rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_queue,
+int rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_queue,
 		uint16_t nb_tx_queue, const struct rte_eth_conf *eth_conf);
 
 /**
@@ -1939,7 +1939,7 @@ void _rte_eth_dev_reset(struct rte_eth_dev *dev);
  *      allocate network memory buffers from the memory pool when
  *      initializing receive descriptors.
  */
-int rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
+int rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 		uint16_t nb_rx_desc, unsigned int socket_id,
 		const struct rte_eth_rxconf *rx_conf,
 		struct rte_mempool *mb_pool);
@@ -1987,7 +1987,7 @@ int rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
  *   - 0: Success, the transmit queue is correctly set up.
  *   - -ENOMEM: Unable to allocate the transmit ring descriptors.
  */
-int rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
+int rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 		uint16_t nb_tx_desc, unsigned int socket_id,
 		const struct rte_eth_txconf *tx_conf);
 
@@ -2001,7 +2001,7 @@ int rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
  *   a default of zero if the socket could not be determined.
  *   -1 is returned is the port_id value is out of range.
  */
-int rte_eth_dev_socket_id(uint8_t port_id);
+int rte_eth_dev_socket_id(uint16_t port_id);
 
 /**
  * Check if port_id of device is attached
@@ -2012,7 +2012,7 @@ int rte_eth_dev_socket_id(uint8_t port_id);
  *   - 0 if port is out of range or not attached
  *   - 1 if device is attached
  */
-int rte_eth_dev_is_valid_port(uint8_t port_id);
+int rte_eth_dev_is_valid_port(uint16_t port_id);
 
 /**
  * Start specified RX queue of a port. It is used when rx_deferred_start
@@ -2029,7 +2029,7 @@ int rte_eth_dev_is_valid_port(uint8_t port_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id);
+int rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id);
 
 /**
  * Stop specified RX queue of a port
@@ -2045,7 +2045,7 @@ int rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id);
+int rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id);
 
 /**
  * Start TX for specified queue of a port. It is used when tx_deferred_start
@@ -2062,7 +2062,7 @@ int rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id);
+int rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id);
 
 /**
  * Stop specified TX queue of a port
@@ -2078,7 +2078,7 @@ int rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id);
  *   - -EINVAL: The port_id or the queue_id out of range.
  *   - -ENOTSUP: The function not supported in PMD driver.
  */
-int rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id);
+int rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id);
 
 
 
@@ -2097,7 +2097,7 @@ int rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id);
  *   - 0: Success, Ethernet device started.
  *   - <0: Error code of the driver device start function.
  */
-int rte_eth_dev_start(uint8_t port_id);
+int rte_eth_dev_start(uint16_t port_id);
 
 /**
  * Stop an Ethernet device. The device can be restarted with a call to
@@ -2106,7 +2106,7 @@ int rte_eth_dev_start(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_dev_stop(uint8_t port_id);
+void rte_eth_dev_stop(uint16_t port_id);
 
 
 /**
@@ -2121,7 +2121,7 @@ void rte_eth_dev_stop(uint8_t port_id);
  *   - 0: Success, Ethernet device linked up.
  *   - <0: Error code of the driver device link up function.
  */
-int rte_eth_dev_set_link_up(uint8_t port_id);
+int rte_eth_dev_set_link_up(uint16_t port_id);
 
 /**
  * Link down an Ethernet device.
@@ -2132,7 +2132,7 @@ int rte_eth_dev_set_link_up(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-int rte_eth_dev_set_link_down(uint8_t port_id);
+int rte_eth_dev_set_link_down(uint16_t port_id);
 
 /**
  * Close a stopped Ethernet device. The device cannot be restarted!
@@ -2142,7 +2142,7 @@ int rte_eth_dev_set_link_down(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_dev_close(uint8_t port_id);
+void rte_eth_dev_close(uint16_t port_id);
 
 /**
  * Reset a Ethernet device and keep its port id.
@@ -2172,7 +2172,7 @@ void rte_eth_dev_close(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-int rte_eth_dev_reset(uint8_t port_id);
+int rte_eth_dev_reset(uint16_t port_id);
 
 /**
  * Enable receipt in promiscuous mode for an Ethernet device.
@@ -2180,7 +2180,7 @@ int rte_eth_dev_reset(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_promiscuous_enable(uint8_t port_id);
+void rte_eth_promiscuous_enable(uint16_t port_id);
 
 /**
  * Disable receipt in promiscuous mode for an Ethernet device.
@@ -2188,7 +2188,7 @@ void rte_eth_promiscuous_enable(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_promiscuous_disable(uint8_t port_id);
+void rte_eth_promiscuous_disable(uint16_t port_id);
 
 /**
  * Return the value of promiscuous mode for an Ethernet device.
@@ -2200,7 +2200,7 @@ void rte_eth_promiscuous_disable(uint8_t port_id);
  *   - (0) if promiscuous is disabled.
  *   - (-1) on error
  */
-int rte_eth_promiscuous_get(uint8_t port_id);
+int rte_eth_promiscuous_get(uint16_t port_id);
 
 /**
  * Enable the receipt of any multicast frame by an Ethernet device.
@@ -2208,7 +2208,7 @@ int rte_eth_promiscuous_get(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_allmulticast_enable(uint8_t port_id);
+void rte_eth_allmulticast_enable(uint16_t port_id);
 
 /**
  * Disable the receipt of all multicast frames by an Ethernet device.
@@ -2216,7 +2216,7 @@ void rte_eth_allmulticast_enable(uint8_t port_id);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_allmulticast_disable(uint8_t port_id);
+void rte_eth_allmulticast_disable(uint16_t port_id);
 
 /**
  * Return the value of allmulticast mode for an Ethernet device.
@@ -2228,7 +2228,7 @@ void rte_eth_allmulticast_disable(uint8_t port_id);
  *   - (0) if allmulticast is disabled.
  *   - (-1) on error
  */
-int rte_eth_allmulticast_get(uint8_t port_id);
+int rte_eth_allmulticast_get(uint16_t port_id);
 
 /**
  * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
@@ -2241,7 +2241,7 @@ int rte_eth_allmulticast_get(uint8_t port_id);
  *   A pointer to an *rte_eth_link* structure to be filled with
  *   the status, the speed and the mode of the Ethernet device link.
  */
-void rte_eth_link_get(uint8_t port_id, struct rte_eth_link *link);
+void rte_eth_link_get(uint16_t port_id, struct rte_eth_link *link);
 
 /**
  * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
@@ -2254,7 +2254,7 @@ void rte_eth_link_get(uint8_t port_id, struct rte_eth_link *link);
  *   A pointer to an *rte_eth_link* structure to be filled with
  *   the status, the speed and the mode of the Ethernet device link.
  */
-void rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *link);
+void rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *link);
 
 /**
  * Retrieve the general I/O statistics of an Ethernet device.
@@ -2273,7 +2273,7 @@ void rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *link);
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats);
+int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats);
 
 /**
  * Reset the general I/O statistics of an Ethernet device.
@@ -2281,7 +2281,7 @@ int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats);
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_stats_reset(uint8_t port_id);
+void rte_eth_stats_reset(uint16_t port_id);
 
 /**
  * Retrieve names of extended statistics of an Ethernet device.
@@ -2303,7 +2303,7 @@ void rte_eth_stats_reset(uint8_t port_id);
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get_names(uint8_t port_id,
+int rte_eth_xstats_get_names(uint16_t port_id,
 		struct rte_eth_xstat_name *xstats_names,
 		unsigned int size);
 
@@ -2329,7 +2329,7 @@ int rte_eth_xstats_get_names(uint8_t port_id,
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
+int rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
 		unsigned int n);
 
 /**
@@ -2355,7 +2355,7 @@ int rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
  *   - A negative value on error (invalid port id).
  */
 int
-rte_eth_xstats_get_names_by_id(uint8_t port_id,
+rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	struct rte_eth_xstat_name *xstats_names, unsigned int size,
 	uint64_t *ids);
 
@@ -2382,7 +2382,7 @@ rte_eth_xstats_get_names_by_id(uint8_t port_id,
  *     shall not be used by the caller.
  *   - A negative value on error (invalid port id).
  */
-int rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids,
+int rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 			     uint64_t *values, unsigned int n);
 
 /**
@@ -2402,7 +2402,7 @@ int rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids,
  *    -ENODEV for invalid port_id,
  *    -EINVAL if the xstat_name doesn't exist in port_id
  */
-int rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
+int rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
 		uint64_t *id);
 
 /**
@@ -2411,7 +2411,7 @@ int rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
  * @param port_id
  *   The port identifier of the Ethernet device.
  */
-void rte_eth_xstats_reset(uint8_t port_id);
+void rte_eth_xstats_reset(uint16_t port_id);
 
 /**
  *  Set a mapping for the specified transmit queue to the specified per-queue
@@ -2430,7 +2430,7 @@ void rte_eth_xstats_reset(uint8_t port_id);
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id,
+int rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id,
 		uint16_t tx_queue_id, uint8_t stat_idx);
 
 /**
@@ -2450,7 +2450,7 @@ int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id,
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
-int rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id,
+int rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id,
 					   uint16_t rx_queue_id,
 					   uint8_t stat_idx);
 
@@ -2463,7 +2463,7 @@ int rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id,
  *   A pointer to a structure of type *ether_addr* to be filled with
  *   the Ethernet address of the Ethernet device.
  */
-void rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr);
+void rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr);
 
 /**
  * Retrieve the contextual information of an Ethernet device.
@@ -2474,7 +2474,7 @@ void rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr);
  *   A pointer to a structure of type *rte_eth_dev_info* to be filled with
  *   the contextual information of the Ethernet device.
  */
-void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info);
+void rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info);
 
 /**
  * Retrieve the firmware version of a device.
@@ -2494,7 +2494,7 @@ void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info);
  *   - (>0) if *fw_size* is not enough to store firmware version, return
  *          the size of the non truncated string.
  */
-int rte_eth_dev_fw_version_get(uint8_t port_id,
+int rte_eth_dev_fw_version_get(uint16_t port_id,
 			       char *fw_version, size_t fw_size);
 
 /**
@@ -2535,7 +2535,7 @@ int rte_eth_dev_fw_version_get(uint8_t port_id,
  *           count of supported ptypes will be returned.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
+int rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
 				     uint32_t *ptypes, int num);
 
 /**
@@ -2549,7 +2549,7 @@ int rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
  *   - (0) if successful.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu);
+int rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu);
 
 /**
  * Change the MTU of an Ethernet device.
@@ -2565,7 +2565,7 @@ int rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu);
  *   - (-EINVAL) if *mtu* invalid.
  *   - (-EBUSY) if operation is not allowed when the port is running
  */
-int rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu);
+int rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu);
 
 /**
  * Enable/Disable hardware filtering by an Ethernet device of received
@@ -2585,7 +2585,7 @@ int rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu);
  *   - (-ENOSYS) if VLAN filtering on *port_id* disabled.
  *   - (-EINVAL) if *vlan_id* > 4095.
  */
-int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on);
+int rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on);
 
 /**
  * Enable/Disable hardware VLAN Strip by a rx queue of an Ethernet device.
@@ -2606,7 +2606,7 @@ int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if *rx_queue_id* invalid.
  */
-int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id,
+int rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
 		int on);
 
 /**
@@ -2625,7 +2625,7 @@ int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id,
  *   - (-ENOSUP) if hardware-assisted VLAN TPID setup is not supported.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+int rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 				    enum rte_vlan_type vlan_type,
 				    uint16_t tag_type);
 
@@ -2649,7 +2649,7 @@ int rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
  *   - (-ENOSUP) if hardware-assisted VLAN filtering not configured.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask);
+int rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask);
 
 /**
  * Read VLAN Offload configuration from an Ethernet device
@@ -2663,7 +2663,7 @@ int rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask);
  *       ETH_VLAN_EXTEND_OFFLOAD
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_get_vlan_offload(uint8_t port_id);
+int rte_eth_dev_get_vlan_offload(uint16_t port_id);
 
 /**
  * Set port based TX VLAN insertion on or off.
@@ -2679,7 +2679,7 @@ int rte_eth_dev_get_vlan_offload(uint8_t port_id);
  *   - (0) if successful.
  *   - negative if failed.
  */
-int rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on);
+int rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on);
 
 /**
  *
@@ -2764,7 +2764,7 @@ int rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on);
  *   *rx_pkts* array.
  */
 static inline uint16_t
-rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_burst(uint16_t port_id, uint16_t queue_id,
 		 struct rte_mbuf **rx_pkts, const uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2809,7 +2809,7 @@ rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
  *     (-ENOTSUP) if the device does not support this function
  */
 static inline int
-rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id)
+rte_eth_rx_queue_count(uint16_t port_id, uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2838,7 +2838,7 @@ rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id)
  *  - (-ENOTSUP) if the device does not support this function
  */
 static inline int
-rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset)
+rte_eth_rx_descriptor_done(uint16_t port_id, uint16_t queue_id, uint16_t offset)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
@@ -2885,7 +2885,7 @@ rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset)
  *  - (-ENODEV) bad port or queue (only if compiled with debug).
  */
 static inline int
-rte_eth_rx_descriptor_status(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_descriptor_status(uint16_t port_id, uint16_t queue_id,
 	uint16_t offset)
 {
 	struct rte_eth_dev *dev;
@@ -2942,7 +2942,7 @@ rte_eth_rx_descriptor_status(uint8_t port_id, uint16_t queue_id,
  *  - (-ENOTSUP) if the device does not support this function.
  *  - (-ENODEV) bad port or queue (only if compiled with debug).
  */
-static inline int rte_eth_tx_descriptor_status(uint8_t port_id,
+static inline int rte_eth_tx_descriptor_status(uint16_t port_id,
 	uint16_t queue_id, uint16_t offset)
 {
 	struct rte_eth_dev *dev;
@@ -3026,7 +3026,7 @@ static inline int rte_eth_tx_descriptor_status(uint8_t port_id,
  *   *tx_pkts* parameter when the transmit ring is full or has been filled up.
  */
 static inline uint16_t
-rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id,
 		 struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -3115,7 +3115,7 @@ rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
 #ifndef RTE_ETHDEV_TX_PREPARE_NOOP
 
 static inline uint16_t
-rte_eth_tx_prepare(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_prepare(uint16_t port_id, uint16_t queue_id,
 		struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev;
@@ -3157,7 +3157,8 @@ rte_eth_tx_prepare(uint8_t port_id, uint16_t queue_id,
  */
 
 static inline uint16_t
-rte_eth_tx_prepare(__rte_unused uint8_t port_id, __rte_unused uint16_t queue_id,
+rte_eth_tx_prepare(__rte_unused uint16_t port_id,
+		__rte_unused uint16_t queue_id,
 		__rte_unused struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	return nb_pkts;
@@ -3226,7 +3227,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size);
  *   callback is called for any packets which could not be sent.
  */
 static inline uint16_t
-rte_eth_tx_buffer_flush(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_buffer_flush(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_dev_tx_buffer *buffer)
 {
 	uint16_t sent;
@@ -3278,7 +3279,7 @@ rte_eth_tx_buffer_flush(uint8_t port_id, uint16_t queue_id,
  *     the rest.
  */
 static __rte_always_inline uint16_t
-rte_eth_tx_buffer(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_buffer(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_dev_tx_buffer *buffer, struct rte_mbuf *tx_pkt)
 {
 	buffer->pkts[buffer->length++] = tx_pkt;
@@ -3394,7 +3395,7 @@ rte_eth_tx_buffer_count_callback(struct rte_mbuf **pkts, uint16_t unsent,
  *     are in use.
  */
 int
-rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt);
+rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt);
 
 /**
  * The eth device event type for interrupt, and maybe others in the future.
@@ -3412,7 +3413,7 @@ enum rte_eth_event_type {
 	RTE_ETH_EVENT_MAX       /**< max value of this enum */
 };
 
-typedef int (*rte_eth_dev_cb_fn)(uint8_t port_id,
+typedef int (*rte_eth_dev_cb_fn)(uint16_t port_id,
 		enum rte_eth_event_type event, void *cb_arg, void *ret_param);
 /**< user application callback to be registered for interrupts */
 
@@ -3434,7 +3435,7 @@ typedef int (*rte_eth_dev_cb_fn)(uint8_t port_id,
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_dev_callback_register(uint8_t port_id,
+int rte_eth_dev_callback_register(uint16_t port_id,
 			enum rte_eth_event_type event,
 		rte_eth_dev_cb_fn cb_fn, void *cb_arg);
 
@@ -3455,7 +3456,7 @@ int rte_eth_dev_callback_register(uint8_t port_id,
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-int rte_eth_dev_callback_unregister(uint8_t port_id,
+int rte_eth_dev_callback_unregister(uint16_t port_id,
 			enum rte_eth_event_type event,
 		rte_eth_dev_cb_fn cb_fn, void *cb_arg);
 
@@ -3501,7 +3502,7 @@ int _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id);
+int rte_eth_dev_rx_intr_enable(uint16_t port_id, uint16_t queue_id);
 
 /**
  * When lcore wakes up from rx interrupt indicating packet coming, disable rx
@@ -3522,7 +3523,7 @@ int rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id);
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id);
+int rte_eth_dev_rx_intr_disable(uint16_t port_id, uint16_t queue_id);
 
 /**
  * RX Interrupt control per port.
@@ -3541,7 +3542,7 @@ int rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id);
  *   - On success, zero.
  *   - On failure, a negative value.
  */
-int rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data);
+int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
 
 /**
  * RX Interrupt control per queue.
@@ -3564,7 +3565,7 @@ int rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data);
  *   - On success, zero.
  *   - On failure, a negative value.
  */
-int rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			      int epfd, int op, void *data);
 
 /**
@@ -3579,7 +3580,7 @@ int rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int  rte_eth_led_on(uint8_t port_id);
+int  rte_eth_led_on(uint16_t port_id);
 
 /**
  * Turn off the LED on the Ethernet device.
@@ -3593,7 +3594,7 @@ int  rte_eth_led_on(uint8_t port_id);
  *     that operation.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int  rte_eth_led_off(uint8_t port_id);
+int  rte_eth_led_off(uint16_t port_id);
 
 /**
  * Get current status of the Ethernet link flow control for Ethernet device
@@ -3607,7 +3608,7 @@ int  rte_eth_led_off(uint8_t port_id);
  *   - (-ENOTSUP) if hardware doesn't support flow control.
  *   - (-ENODEV)  if *port_id* invalid.
  */
-int rte_eth_dev_flow_ctrl_get(uint8_t port_id,
+int rte_eth_dev_flow_ctrl_get(uint16_t port_id,
 			      struct rte_eth_fc_conf *fc_conf);
 
 /**
@@ -3624,7 +3625,7 @@ int rte_eth_dev_flow_ctrl_get(uint8_t port_id,
  *   - (-EINVAL)  if bad parameter
  *   - (-EIO)     if flow control setup failure
  */
-int rte_eth_dev_flow_ctrl_set(uint8_t port_id,
+int rte_eth_dev_flow_ctrl_set(uint16_t port_id,
 			      struct rte_eth_fc_conf *fc_conf);
 
 /**
@@ -3642,7 +3643,7 @@ int rte_eth_dev_flow_ctrl_set(uint8_t port_id,
  *   - (-EINVAL)  if bad parameter
  *   - (-EIO)     if flow control setup failure
  */
-int rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id,
+int rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
 				struct rte_eth_pfc_conf *pfc_conf);
 
 /**
@@ -3663,7 +3664,7 @@ int rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id,
  *   - (-ENOSPC) if no more MAC addresses can be added.
  *   - (-EINVAL) if MAC address is invalid.
  */
-int rte_eth_dev_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
+int rte_eth_dev_mac_addr_add(uint16_t port, struct ether_addr *mac_addr,
 				uint32_t pool);
 
 /**
@@ -3679,7 +3680,7 @@ int rte_eth_dev_mac_addr_add(uint8_t port, struct ether_addr *mac_addr,
  *   - (-ENODEV) if *port* invalid.
  *   - (-EADDRINUSE) if attempting to remove the default MAC address
  */
-int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr);
+int rte_eth_dev_mac_addr_remove(uint16_t port, struct ether_addr *mac_addr);
 
 /**
  * Set the default MAC address.
@@ -3694,8 +3695,8 @@ int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr);
  *   - (-ENODEV) if *port* invalid.
  *   - (-EINVAL) if MAC address is invalid.
  */
-int rte_eth_dev_default_mac_addr_set(uint8_t port, struct ether_addr *mac_addr);
-
+int rte_eth_dev_default_mac_addr_set(uint16_t port,
+		struct ether_addr *mac_addr);
 
 /**
  * Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
@@ -3712,7 +3713,7 @@ int rte_eth_dev_default_mac_addr_set(uint8_t port, struct ether_addr *mac_addr);
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_reta_update(uint8_t port,
+int rte_eth_dev_rss_reta_update(uint16_t port,
 				struct rte_eth_rss_reta_entry64 *reta_conf,
 				uint16_t reta_size);
 
@@ -3731,7 +3732,7 @@ int rte_eth_dev_rss_reta_update(uint8_t port,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_reta_query(uint8_t port,
+int rte_eth_dev_rss_reta_query(uint16_t port,
 			       struct rte_eth_rss_reta_entry64 *reta_conf,
 			       uint16_t reta_size);
 
@@ -3753,8 +3754,8 @@ int rte_eth_dev_rss_reta_query(uint8_t port,
   *  - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_uc_hash_table_set(uint8_t port,struct ether_addr *addr,
-					uint8_t on);
+int rte_eth_dev_uc_hash_table_set(uint16_t port, struct ether_addr *addr,
+				  uint8_t on);
 
  /**
  * Updates all unicast hash bitmaps for receiving packet with any Unicast
@@ -3773,7 +3774,7 @@ int rte_eth_dev_uc_hash_table_set(uint8_t port,struct ether_addr *addr,
   *  - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_uc_all_hash_table_set(uint8_t port,uint8_t on);
+int rte_eth_dev_uc_all_hash_table_set(uint16_t port, uint8_t on);
 
 /**
  * Set a traffic mirroring rule on an Ethernet device
@@ -3796,7 +3797,7 @@ int rte_eth_dev_uc_all_hash_table_set(uint8_t port,uint8_t on);
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if the mr_conf information is not correct.
  */
-int rte_eth_mirror_rule_set(uint8_t port_id,
+int rte_eth_mirror_rule_set(uint16_t port_id,
 			struct rte_eth_mirror_conf *mirror_conf,
 			uint8_t rule_id,
 			uint8_t on);
@@ -3814,7 +3815,7 @@ int rte_eth_mirror_rule_set(uint8_t port_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_mirror_rule_reset(uint8_t port_id,
+int rte_eth_mirror_rule_reset(uint16_t port_id,
 					 uint8_t rule_id);
 
 /**
@@ -3832,7 +3833,7 @@ int rte_eth_mirror_rule_reset(uint8_t port_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 			uint16_t tx_rate);
 
  /**
@@ -3848,7 +3849,7 @@ int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
-int rte_eth_dev_rss_hash_update(uint8_t port_id,
+int rte_eth_dev_rss_hash_update(uint16_t port_id,
 				struct rte_eth_rss_conf *rss_conf);
 
  /**
@@ -3865,7 +3866,7 @@ int rte_eth_dev_rss_hash_update(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support RSS.
  */
 int
-rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 			      struct rte_eth_rss_conf *rss_conf);
 
  /**
@@ -3886,7 +3887,7 @@ rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
 				struct rte_eth_udp_tunnel *tunnel_udp);
 
  /**
@@ -3908,7 +3909,7 @@ rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
 				   struct rte_eth_udp_tunnel *tunnel_udp);
 
 /**
@@ -3924,7 +3925,8 @@ rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support this filter type.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type);
+int rte_eth_dev_filter_supported(uint16_t port_id,
+		enum rte_filter_type filter_type);
 
 /**
  * Take operations to assigned filter type on an Ethernet device.
@@ -3944,7 +3946,7 @@ int rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_ty
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
+int rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op, void *arg);
 
 /**
@@ -3959,7 +3961,7 @@ int rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
  *   - (-ENODEV) if port identifier is invalid.
  *   - (-ENOTSUP) if hardware doesn't support.
  */
-int rte_eth_dev_get_dcb_info(uint8_t port_id,
+int rte_eth_dev_get_dcb_info(uint16_t port_id,
 			     struct rte_eth_dcb_info *dcb_info);
 
 /**
@@ -3986,7 +3988,7 @@ int rte_eth_dev_get_dcb_info(uint8_t port_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param);
 
 /**
@@ -4014,7 +4016,7 @@ void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_rx_callback_fn fn, void *user_param);
 
 /**
@@ -4041,7 +4043,7 @@ void *rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   NULL on error.
  *   On success, a pointer value which can later be used to remove the callback.
  */
-void *rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
+void *rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
 		rte_tx_callback_fn fn, void *user_param);
 
 /**
@@ -4074,7 +4076,7 @@ void *rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -EINVAL:  The port_id or the queue_id is out of range, or the callback
  *               is NULL or not found for the port/queue.
  */
-int rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
+int rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb);
 
 /**
@@ -4107,7 +4109,7 @@ int rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -EINVAL:  The port_id or the queue_id is out of range, or the callback
  *               is NULL or not found for the port/queue.
  */
-int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
+int rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb);
 
 /**
@@ -4127,7 +4129,7 @@ int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
  *   - -ENOTSUP: routine is not supported by the device PMD.
  *   - -EINVAL:  The port_id or the queue_id is out of range.
  */
-int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+int rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_rxq_info *qinfo);
 
 /**
@@ -4147,7 +4149,7 @@ int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
  *   - -ENOTSUP: routine is not supported by the device PMD.
  *   - -EINVAL:  The port_id or the queue_id is out of range.
  */
-int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+int rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_txq_info *qinfo);
 
 /**
@@ -4166,7 +4168,7 @@ int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info);
+int rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info);
 
 /**
  * Retrieve size of device EEPROM
@@ -4179,7 +4181,7 @@ int rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_eeprom_length(uint8_t port_id);
+int rte_eth_dev_get_eeprom_length(uint16_t port_id);
 
 /**
  * Retrieve EEPROM and EEPROM attribute
@@ -4195,7 +4197,7 @@ int rte_eth_dev_get_eeprom_length(uint8_t port_id);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
+int rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info);
 
 /**
  * Program EEPROM with provided data
@@ -4211,7 +4213,7 @@ int rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
  *   - (-ENODEV) if *port_id* invalid.
  *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
+int rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info);
 
 /**
  * Set the list of multicast addresses to filter on an Ethernet device.
@@ -4230,7 +4232,7 @@ int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
  *   - (-ENOTSUP) if PMD of *port_id* doesn't support multicast filtering.
  *   - (-ENOSPC) if *port_id* has not enough multicast filtering resources.
  */
-int rte_eth_dev_set_mc_addr_list(uint8_t port_id,
+int rte_eth_dev_set_mc_addr_list(uint16_t port_id,
 				 struct ether_addr *mc_addr_set,
 				 uint32_t nb_mc_addr);
 
@@ -4245,7 +4247,7 @@ int rte_eth_dev_set_mc_addr_list(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_enable(uint8_t port_id);
+int rte_eth_timesync_enable(uint16_t port_id);
 
 /**
  * Disable IEEE1588/802.1AS timestamping for an Ethernet device.
@@ -4258,7 +4260,7 @@ int rte_eth_timesync_enable(uint8_t port_id);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_disable(uint8_t port_id);
+int rte_eth_timesync_disable(uint16_t port_id);
 
 /**
  * Read an IEEE1588/802.1AS RX timestamp from an Ethernet device.
@@ -4277,7 +4279,7 @@ int rte_eth_timesync_disable(uint8_t port_id);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
+int rte_eth_timesync_read_rx_timestamp(uint16_t port_id,
 		struct timespec *timestamp, uint32_t flags);
 
 /**
@@ -4294,7 +4296,7 @@ int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
+int rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
 		struct timespec *timestamp);
 
 /**
@@ -4313,7 +4315,7 @@ int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta);
+int rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta);
 
 /**
  * Read the time from the timesync clock on an Ethernet device.
@@ -4329,7 +4331,7 @@ int rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta);
  * @return
  *   - 0: Success.
  */
-int rte_eth_timesync_read_time(uint8_t port_id, struct timespec *time);
+int rte_eth_timesync_read_time(uint16_t port_id, struct timespec *time);
 
 /**
  * Set the time of the timesync clock on an Ethernet device.
@@ -4348,7 +4350,7 @@ int rte_eth_timesync_read_time(uint8_t port_id, struct timespec *time);
  *   - -ENODEV: The port ID is invalid.
  *   - -ENOTSUP: The function is not supported by the Ethernet driver.
  */
-int rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *time);
+int rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *time);
 
 /**
  * Create memzone for HW rings.
@@ -4389,7 +4391,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
 				    struct rte_eth_l2_tunnel_conf *l2_tunnel);
 
 /**
@@ -4416,7 +4418,7 @@ rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
  *   - (-ENOTSUP) if hardware doesn't support tunnel type.
  */
 int
-rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
 				  struct rte_eth_l2_tunnel_conf *l2_tunnel,
 				  uint32_t mask,
 				  uint8_t en);
@@ -4434,7 +4436,7 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
 *   - (-ENODEV or -EINVAL) on failure.
 */
 int
-rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id);
+rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id);
 
 /**
 * Get the device name from port id
@@ -4448,7 +4450,7 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id);
 *   - (-EINVAL) on failure.
 */
 int
-rte_eth_dev_get_name_by_port(uint8_t port_id, char *name);
+rte_eth_dev_get_name_by_port(uint16_t port_id, char *name);
 
 /**
  * Check that numbers of Rx and Tx descriptors satisfy descriptors limits from
@@ -4466,7 +4468,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name);
  *   - (0) if successful.
  *   - (-ENOTSUP, -ENODEV or -EINVAL) on failure.
  */
-int rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+int rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
 				     uint16_t *nb_rx_desc,
 				     uint16_t *nb_tx_desc);
 
diff --git a/lib/librte_ether/rte_flow.c b/lib/librte_ether/rte_flow.c
index 2001fbbf4..95d9ee007 100644
--- a/lib/librte_ether/rte_flow.c
+++ b/lib/librte_ether/rte_flow.c
@@ -108,7 +108,7 @@ static const struct rte_flow_desc_data rte_flow_desc_action[] = {
 
 /* Get generic flow operations structure from a port. */
 const struct rte_flow_ops *
-rte_flow_ops_get(uint8_t port_id, struct rte_flow_error *error)
+rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	const struct rte_flow_ops *ops;
diff --git a/lib/librte_ether/rte_flow_driver.h b/lib/librte_ether/rte_flow_driver.h
index 4d95391d8..8573cefa3 100644
--- a/lib/librte_ether/rte_flow_driver.h
+++ b/lib/librte_ether/rte_flow_driver.h
@@ -178,7 +178,7 @@ rte_flow_error_set(struct rte_flow_error *error,
  *   additional details.
  */
 const struct rte_flow_ops *
-rte_flow_ops_get(uint8_t port_id, struct rte_flow_error *error);
+rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_ether/rte_tm.c b/lib/librte_ether/rte_tm.c
index 71679650e..ceac34115 100644
--- a/lib/librte_ether/rte_tm.c
+++ b/lib/librte_ether/rte_tm.c
@@ -40,7 +40,7 @@
 
 /* Get generic traffic manager operations structure from a port. */
 const struct rte_tm_ops *
-rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error)
+rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	const struct rte_tm_ops *ops;
@@ -87,7 +87,7 @@ rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error)
 
 /* Get number of leaf nodes */
 int
-rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
+rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
 	uint32_t *n_leaf_nodes,
 	struct rte_tm_error *error)
 {
@@ -113,7 +113,7 @@ rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
 
 /* Check node type (leaf or non-leaf) */
 int
-rte_tm_node_type_get(uint8_t port_id,
+rte_tm_node_type_get(uint16_t port_id,
 	uint32_t node_id,
 	int *is_leaf,
 	struct rte_tm_error *error)
@@ -124,7 +124,7 @@ rte_tm_node_type_get(uint8_t port_id,
 }
 
 /* Get capabilities */
-int rte_tm_capabilities_get(uint8_t port_id,
+int rte_tm_capabilities_get(uint16_t port_id,
 	struct rte_tm_capabilities *cap,
 	struct rte_tm_error *error)
 {
@@ -134,7 +134,7 @@ int rte_tm_capabilities_get(uint8_t port_id,
 }
 
 /* Get level capabilities */
-int rte_tm_level_capabilities_get(uint8_t port_id,
+int rte_tm_level_capabilities_get(uint16_t port_id,
 	uint32_t level_id,
 	struct rte_tm_level_capabilities *cap,
 	struct rte_tm_error *error)
@@ -145,7 +145,7 @@ int rte_tm_level_capabilities_get(uint8_t port_id,
 }
 
 /* Get node capabilities */
-int rte_tm_node_capabilities_get(uint8_t port_id,
+int rte_tm_node_capabilities_get(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_capabilities *cap,
 	struct rte_tm_error *error)
@@ -156,7 +156,7 @@ int rte_tm_node_capabilities_get(uint8_t port_id,
 }
 
 /* Add WRED profile */
-int rte_tm_wred_profile_add(uint8_t port_id,
+int rte_tm_wred_profile_add(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_wred_params *profile,
 	struct rte_tm_error *error)
@@ -167,7 +167,7 @@ int rte_tm_wred_profile_add(uint8_t port_id,
 }
 
 /* Delete WRED profile */
-int rte_tm_wred_profile_delete(uint8_t port_id,
+int rte_tm_wred_profile_delete(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
 {
@@ -177,7 +177,7 @@ int rte_tm_wred_profile_delete(uint8_t port_id,
 }
 
 /* Add/update shared WRED context */
-int rte_tm_shared_wred_context_add_update(uint8_t port_id,
+int rte_tm_shared_wred_context_add_update(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
@@ -188,7 +188,7 @@ int rte_tm_shared_wred_context_add_update(uint8_t port_id,
 }
 
 /* Delete shared WRED context */
-int rte_tm_shared_wred_context_delete(uint8_t port_id,
+int rte_tm_shared_wred_context_delete(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	struct rte_tm_error *error)
 {
@@ -198,7 +198,7 @@ int rte_tm_shared_wred_context_delete(uint8_t port_id,
 }
 
 /* Add shaper profile */
-int rte_tm_shaper_profile_add(uint8_t port_id,
+int rte_tm_shaper_profile_add(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_shaper_params *profile,
 	struct rte_tm_error *error)
@@ -209,7 +209,7 @@ int rte_tm_shaper_profile_add(uint8_t port_id,
 }
 
 /* Delete WRED profile */
-int rte_tm_shaper_profile_delete(uint8_t port_id,
+int rte_tm_shaper_profile_delete(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
 {
@@ -219,7 +219,7 @@ int rte_tm_shaper_profile_delete(uint8_t port_id,
 }
 
 /* Add shared shaper */
-int rte_tm_shared_shaper_add_update(uint8_t port_id,
+int rte_tm_shared_shaper_add_update(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
@@ -230,7 +230,7 @@ int rte_tm_shared_shaper_add_update(uint8_t port_id,
 }
 
 /* Delete shared shaper */
-int rte_tm_shared_shaper_delete(uint8_t port_id,
+int rte_tm_shared_shaper_delete(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	struct rte_tm_error *error)
 {
@@ -240,7 +240,7 @@ int rte_tm_shared_shaper_delete(uint8_t port_id,
 }
 
 /* Add node to port traffic manager hierarchy */
-int rte_tm_node_add(uint8_t port_id,
+int rte_tm_node_add(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -256,7 +256,7 @@ int rte_tm_node_add(uint8_t port_id,
 }
 
 /* Delete node from traffic manager hierarchy */
-int rte_tm_node_delete(uint8_t port_id,
+int rte_tm_node_delete(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -266,7 +266,7 @@ int rte_tm_node_delete(uint8_t port_id,
 }
 
 /* Suspend node */
-int rte_tm_node_suspend(uint8_t port_id,
+int rte_tm_node_suspend(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -276,7 +276,7 @@ int rte_tm_node_suspend(uint8_t port_id,
 }
 
 /* Resume node */
-int rte_tm_node_resume(uint8_t port_id,
+int rte_tm_node_resume(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error)
 {
@@ -286,7 +286,7 @@ int rte_tm_node_resume(uint8_t port_id,
 }
 
 /* Commit the initial port traffic manager hierarchy */
-int rte_tm_hierarchy_commit(uint8_t port_id,
+int rte_tm_hierarchy_commit(uint16_t port_id,
 	int clear_on_fail,
 	struct rte_tm_error *error)
 {
@@ -296,7 +296,7 @@ int rte_tm_hierarchy_commit(uint8_t port_id,
 }
 
 /* Update node parent  */
-int rte_tm_node_parent_update(uint8_t port_id,
+int rte_tm_node_parent_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -309,7 +309,7 @@ int rte_tm_node_parent_update(uint8_t port_id,
 }
 
 /* Update node private shaper */
-int rte_tm_node_shaper_update(uint8_t port_id,
+int rte_tm_node_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error)
@@ -320,7 +320,7 @@ int rte_tm_node_shaper_update(uint8_t port_id,
 }
 
 /* Update node shared shapers */
-int rte_tm_node_shared_shaper_update(uint8_t port_id,
+int rte_tm_node_shared_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_shaper_id,
 	int add,
@@ -332,7 +332,7 @@ int rte_tm_node_shared_shaper_update(uint8_t port_id,
 }
 
 /* Update node stats */
-int rte_tm_node_stats_update(uint8_t port_id,
+int rte_tm_node_stats_update(uint16_t port_id,
 	uint32_t node_id,
 	uint64_t stats_mask,
 	struct rte_tm_error *error)
@@ -343,7 +343,7 @@ int rte_tm_node_stats_update(uint8_t port_id,
 }
 
 /* Update WFQ weight mode */
-int rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
+int rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
 	uint32_t node_id,
 	int *wfq_weight_mode,
 	uint32_t n_sp_priorities,
@@ -355,7 +355,7 @@ int rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
 }
 
 /* Update node congestion management mode */
-int rte_tm_node_cman_update(uint8_t port_id,
+int rte_tm_node_cman_update(uint16_t port_id,
 	uint32_t node_id,
 	enum rte_tm_cman_mode cman,
 	struct rte_tm_error *error)
@@ -366,7 +366,7 @@ int rte_tm_node_cman_update(uint8_t port_id,
 }
 
 /* Update node private WRED context */
-int rte_tm_node_wred_context_update(uint8_t port_id,
+int rte_tm_node_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error)
@@ -377,7 +377,7 @@ int rte_tm_node_wred_context_update(uint8_t port_id,
 }
 
 /* Update node shared WRED context */
-int rte_tm_node_shared_wred_context_update(uint8_t port_id,
+int rte_tm_node_shared_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_wred_context_id,
 	int add,
@@ -389,7 +389,7 @@ int rte_tm_node_shared_wred_context_update(uint8_t port_id,
 }
 
 /* Read and/or clear stats counters for specific node */
-int rte_tm_node_stats_read(uint8_t port_id,
+int rte_tm_node_stats_read(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_stats *stats,
 	uint64_t *stats_mask,
@@ -402,7 +402,7 @@ int rte_tm_node_stats_read(uint8_t port_id,
 }
 
 /* Packet marking - VLAN DEI */
-int rte_tm_mark_vlan_dei(uint8_t port_id,
+int rte_tm_mark_vlan_dei(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -414,7 +414,7 @@ int rte_tm_mark_vlan_dei(uint8_t port_id,
 }
 
 /* Packet marking - IPv4/IPv6 ECN */
-int rte_tm_mark_ip_ecn(uint8_t port_id,
+int rte_tm_mark_ip_ecn(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -426,7 +426,7 @@ int rte_tm_mark_ip_ecn(uint8_t port_id,
 }
 
 /* Packet marking - IPv4/IPv6 DSCP */
-int rte_tm_mark_ip_dscp(uint8_t port_id,
+int rte_tm_mark_ip_dscp(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
diff --git a/lib/librte_ether/rte_tm.h b/lib/librte_ether/rte_tm.h
index ebbfa1eec..2b25a8715 100644
--- a/lib/librte_ether/rte_tm.h
+++ b/lib/librte_ether/rte_tm.h
@@ -1040,7 +1040,7 @@ struct rte_tm_error {
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
+rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
 	uint32_t *n_leaf_nodes,
 	struct rte_tm_error *error);
 
@@ -1064,7 +1064,7 @@ rte_tm_get_number_of_leaf_nodes(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_node_type_get(uint8_t port_id,
+rte_tm_node_type_get(uint16_t port_id,
 	uint32_t node_id,
 	int *is_leaf,
 	struct rte_tm_error *error);
@@ -1082,7 +1082,7 @@ rte_tm_node_type_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_capabilities_get(uint8_t port_id,
+rte_tm_capabilities_get(uint16_t port_id,
 	struct rte_tm_capabilities *cap,
 	struct rte_tm_error *error);
 
@@ -1102,7 +1102,7 @@ rte_tm_capabilities_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_level_capabilities_get(uint8_t port_id,
+rte_tm_level_capabilities_get(uint16_t port_id,
 	uint32_t level_id,
 	struct rte_tm_level_capabilities *cap,
 	struct rte_tm_error *error);
@@ -1122,7 +1122,7 @@ rte_tm_level_capabilities_get(uint8_t port_id,
  *   0 on success, non-zero error code otherwise.
  */
 int
-rte_tm_node_capabilities_get(uint8_t port_id,
+rte_tm_node_capabilities_get(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_capabilities *cap,
 	struct rte_tm_error *error);
@@ -1147,7 +1147,7 @@ rte_tm_node_capabilities_get(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_n_max
  */
 int
-rte_tm_wred_profile_add(uint8_t port_id,
+rte_tm_wred_profile_add(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_wred_params *profile,
 	struct rte_tm_error *error);
@@ -1170,7 +1170,7 @@ rte_tm_wred_profile_add(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_n_max
  */
 int
-rte_tm_wred_profile_delete(uint8_t port_id,
+rte_tm_wred_profile_delete(uint16_t port_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
 
@@ -1201,7 +1201,7 @@ rte_tm_wred_profile_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_shared_wred_context_add_update(uint8_t port_id,
+rte_tm_shared_wred_context_add_update(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
@@ -1225,7 +1225,7 @@ rte_tm_shared_wred_context_add_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_shared_wred_context_delete(uint8_t port_id,
+rte_tm_shared_wred_context_delete(uint16_t port_id,
 	uint32_t shared_wred_context_id,
 	struct rte_tm_error *error);
 
@@ -1249,7 +1249,7 @@ rte_tm_shared_wred_context_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_n_max
  */
 int
-rte_tm_shaper_profile_add(uint8_t port_id,
+rte_tm_shaper_profile_add(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_shaper_params *profile,
 	struct rte_tm_error *error);
@@ -1272,7 +1272,7 @@ rte_tm_shaper_profile_add(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_n_max
  */
 int
-rte_tm_shaper_profile_delete(uint8_t port_id,
+rte_tm_shaper_profile_delete(uint16_t port_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
 
@@ -1301,7 +1301,7 @@ rte_tm_shaper_profile_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_shared_shaper_add_update(uint8_t port_id,
+rte_tm_shared_shaper_add_update(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
@@ -1324,7 +1324,7 @@ rte_tm_shared_shaper_add_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_shared_shaper_delete(uint8_t port_id,
+rte_tm_shared_shaper_delete(uint16_t port_id,
 	uint32_t shared_shaper_id,
 	struct rte_tm_error *error);
 
@@ -1392,7 +1392,7 @@ rte_tm_shared_shaper_delete(uint8_t port_id,
  * @see struct rte_tm_capabilities
  */
 int
-rte_tm_node_add(uint8_t port_id,
+rte_tm_node_add(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -1425,7 +1425,7 @@ rte_tm_node_add(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_ADD_DELETE
  */
 int
-rte_tm_node_delete(uint8_t port_id,
+rte_tm_node_delete(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1449,7 +1449,7 @@ rte_tm_node_delete(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
  */
 int
-rte_tm_node_suspend(uint8_t port_id,
+rte_tm_node_suspend(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1472,7 +1472,7 @@ rte_tm_node_suspend(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
  */
 int
-rte_tm_node_resume(uint8_t port_id,
+rte_tm_node_resume(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_error *error);
 
@@ -1513,7 +1513,7 @@ rte_tm_node_resume(uint8_t port_id,
  * @see rte_tm_node_delete()
  */
 int
-rte_tm_hierarchy_commit(uint8_t port_id,
+rte_tm_hierarchy_commit(uint16_t port_id,
 	int clear_on_fail,
 	struct rte_tm_error *error);
 
@@ -1549,7 +1549,7 @@ rte_tm_hierarchy_commit(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL
  */
 int
-rte_tm_node_parent_update(uint8_t port_id,
+rte_tm_node_parent_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t parent_node_id,
 	uint32_t priority,
@@ -1578,7 +1578,7 @@ rte_tm_node_parent_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_private_n_max
  */
 int
-rte_tm_node_shaper_update(uint8_t port_id,
+rte_tm_node_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shaper_profile_id,
 	struct rte_tm_error *error);
@@ -1605,7 +1605,7 @@ rte_tm_node_shaper_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::shaper_shared_n_max
  */
 int
-rte_tm_node_shared_shaper_update(uint8_t port_id,
+rte_tm_node_shared_shaper_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_shaper_id,
 	int add,
@@ -1632,7 +1632,7 @@ rte_tm_node_shared_shaper_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_STATS
  */
 int
-rte_tm_node_stats_update(uint8_t port_id,
+rte_tm_node_stats_update(uint16_t port_id,
 	uint32_t node_id,
 	uint64_t stats_mask,
 	struct rte_tm_error *error);
@@ -1660,7 +1660,7 @@ rte_tm_node_stats_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_N_SP_PRIORITIES
  */
 int
-rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
+rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
 	uint32_t node_id,
 	int *wfq_weight_mode,
 	uint32_t n_sp_priorities,
@@ -1683,7 +1683,7 @@ rte_tm_node_wfq_weight_mode_update(uint8_t port_id,
  * @see RTE_TM_UPDATE_NODE_CMAN
  */
 int
-rte_tm_node_cman_update(uint8_t port_id,
+rte_tm_node_cman_update(uint16_t port_id,
 	uint32_t node_id,
 	enum rte_tm_cman_mode cman,
 	struct rte_tm_error *error);
@@ -1707,7 +1707,7 @@ rte_tm_node_cman_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_private_n_max
 */
 int
-rte_tm_node_wred_context_update(uint8_t port_id,
+rte_tm_node_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t wred_profile_id,
 	struct rte_tm_error *error);
@@ -1732,7 +1732,7 @@ rte_tm_node_wred_context_update(uint8_t port_id,
  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
  */
 int
-rte_tm_node_shared_wred_context_update(uint8_t port_id,
+rte_tm_node_shared_wred_context_update(uint16_t port_id,
 	uint32_t node_id,
 	uint32_t shared_wred_context_id,
 	int add,
@@ -1764,7 +1764,7 @@ rte_tm_node_shared_wred_context_update(uint8_t port_id,
  * @see enum rte_tm_stats_type
  */
 int
-rte_tm_node_stats_read(uint8_t port_id,
+rte_tm_node_stats_read(uint16_t port_id,
 	uint32_t node_id,
 	struct rte_tm_node_stats *stats,
 	uint64_t *stats_mask,
@@ -1801,7 +1801,7 @@ rte_tm_node_stats_read(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_vlan_dei_supported
  */
 int
-rte_tm_mark_vlan_dei(uint8_t port_id,
+rte_tm_mark_vlan_dei(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -1851,7 +1851,7 @@ rte_tm_mark_vlan_dei(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_ip_ecn_sctp_supported
  */
 int
-rte_tm_mark_ip_ecn(uint8_t port_id,
+rte_tm_mark_ip_ecn(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
@@ -1899,7 +1899,7 @@ rte_tm_mark_ip_ecn(uint8_t port_id,
  * @see struct rte_tm_capabilities::mark_ip_dscp_supported
  */
 int
-rte_tm_mark_ip_dscp(uint8_t port_id,
+rte_tm_mark_ip_dscp(uint16_t port_id,
 	int mark_green,
 	int mark_yellow,
 	int mark_red,
diff --git a/lib/librte_ether/rte_tm_driver.h b/lib/librte_ether/rte_tm_driver.h
index a5b698fe0..b2e8ccf80 100644
--- a/lib/librte_ether/rte_tm_driver.h
+++ b/lib/librte_ether/rte_tm_driver.h
@@ -357,7 +357,7 @@ rte_tm_error_set(struct rte_tm_error *error,
  *   success, NULL otherwise.
  */
 const struct rte_tm_ops *
-rte_tm_ops_get(uint8_t port_id, struct rte_tm_error *error);
+rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 70f1ca8f6..43c115ddd 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,7 +38,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
-LIBABIVER := 2
+LIBABIVER := 3
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h
index 37deb4727..87812cd55 100644
--- a/lib/librte_kni/rte_kni.h
+++ b/lib/librte_kni/rte_kni.h
@@ -63,13 +63,13 @@ struct rte_mbuf;
  * Structure which has the function pointers for KNI interface.
  */
 struct rte_kni_ops {
-	uint8_t port_id; /* Port ID */
+	uint16_t port_id; /* Port ID */
 
 	/* Pointer to function of changing MTU */
-	int (*change_mtu)(uint8_t port_id, unsigned new_mtu);
+	int (*change_mtu)(uint16_t port_id, unsigned int new_mtu);
 
 	/* Pointer to function of configuring network interface */
-	int (*config_network_if)(uint8_t port_id, uint8_t if_up);
+	int (*config_network_if)(uint16_t port_id, uint8_t if_up);
 };
 
 /**
diff --git a/lib/librte_latencystats/rte_latencystats.c b/lib/librte_latencystats/rte_latencystats.c
index ce029a12c..d6ad13c4e 100644
--- a/lib/librte_latencystats/rte_latencystats.c
+++ b/lib/librte_latencystats/rte_latencystats.c
@@ -135,7 +135,7 @@ rte_latencystats_fill_values(struct rte_metric_value *values)
 }
 
 static uint16_t
-add_time_stamps(uint8_t pid __rte_unused,
+add_time_stamps(uint16_t pid __rte_unused,
 		uint16_t qid __rte_unused,
 		struct rte_mbuf **pkts,
 		uint16_t nb_pkts,
@@ -165,7 +165,7 @@ add_time_stamps(uint8_t pid __rte_unused,
 }
 
 static uint16_t
-calc_latency(uint8_t pid __rte_unused,
+calc_latency(uint16_t pid __rte_unused,
 		uint16_t qid __rte_unused,
 		struct rte_mbuf **pkts,
 		uint16_t nb_pkts,
@@ -226,10 +226,10 @@ rte_latencystats_init(uint64_t app_samp_intvl,
 		rte_latency_stats_flow_type_fn user_cb)
 {
 	unsigned int i;
-	uint8_t pid;
+	uint16_t pid;
 	uint16_t qid;
 	struct rxtx_cbs *cbs = NULL;
-	const uint8_t nb_ports = rte_eth_dev_count();
+	const uint16_t nb_ports = rte_eth_dev_count();
 	const char *ptr_strings[NUM_LATENCY_STATS] = {0};
 	const struct rte_memzone *mz = NULL;
 	const unsigned int flags = 0;
@@ -290,11 +290,11 @@ rte_latencystats_init(uint64_t app_samp_intvl,
 int
 rte_latencystats_uninit(void)
 {
-	uint8_t pid;
+	uint16_t pid;
 	uint16_t qid;
 	int ret = 0;
 	struct rxtx_cbs *cbs = NULL;
-	const uint8_t nb_ports = rte_eth_dev_count();
+	const uint16_t nb_ports = rte_eth_dev_count();
 
 	/** De register Rx/Tx callbacks */
 	for (pid = 0; pid < nb_ports; pid++) {
diff --git a/lib/librte_pdump/Makefile b/lib/librte_pdump/Makefile
index 1c03bcbb7..6b21c62e5 100644
--- a/lib/librte_pdump/Makefile
+++ b/lib/librte_pdump/Makefile
@@ -40,7 +40,7 @@ LDLIBS += -lpthread
 
 EXPORT_MAP := rte_pdump_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_PDUMP) := rte_pdump.c
diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c
index 729e79a36..e6182d35c 100644
--- a/lib/librte_pdump/rte_pdump.c
+++ b/lib/librte_pdump/rte_pdump.c
@@ -207,7 +207,7 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
 }
 
 static uint16_t
-pdump_rx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
+pdump_rx(uint16_t port __rte_unused, uint16_t qidx __rte_unused,
 	struct rte_mbuf **pkts, uint16_t nb_pkts,
 	uint16_t max_pkts __rte_unused,
 	void *user_params)
@@ -217,7 +217,7 @@ pdump_rx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
 }
 
 static uint16_t
-pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
+pdump_tx(uint16_t port __rte_unused, uint16_t qidx __rte_unused,
 		struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
 {
 	pdump_copy(pkts, nb_pkts, user_params);
@@ -225,7 +225,7 @@ pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused,
 }
 
 static int
-pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
+pdump_regitser_rx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
 				struct rte_ring *ring, struct rte_mempool *mp,
 				uint16_t operation)
 {
@@ -279,7 +279,7 @@ pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
 }
 
 static int
-pdump_regitser_tx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue,
+pdump_regitser_tx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue,
 				struct rte_ring *ring, struct rte_mempool *mp,
 				uint16_t operation)
 {
@@ -337,7 +337,7 @@ static int
 set_pdump_rxtx_cbs(struct pdump_request *p)
 {
 	uint16_t nb_rx_q = 0, nb_tx_q = 0, end_q, queue;
-	uint8_t port;
+	uint16_t port;
 	int ret = 0;
 	uint32_t flags;
 	uint16_t operation;
@@ -764,7 +764,7 @@ pdump_validate_flags(uint32_t flags)
 }
 
 static int
-pdump_validate_port(uint8_t port, char *name)
+pdump_validate_port(uint16_t port, char *name)
 {
 	int ret = 0;
 
@@ -828,7 +828,7 @@ pdump_prepare_client_request(char *device, uint16_t queue,
 }
 
 int
-rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
+rte_pdump_enable(uint16_t port, uint16_t queue, uint32_t flags,
 			struct rte_ring *ring,
 			struct rte_mempool *mp,
 			void *filter)
@@ -876,7 +876,7 @@ rte_pdump_enable_by_deviceid(char *device_id, uint16_t queue,
 }
 
 int
-rte_pdump_disable(uint8_t port, uint16_t queue, uint32_t flags)
+rte_pdump_disable(uint16_t port, uint16_t queue, uint32_t flags)
 {
 	int ret = 0;
 	char name[DEVICE_ID_SIZE];
diff --git a/lib/librte_pdump/rte_pdump.h b/lib/librte_pdump/rte_pdump.h
index ba6e39b09..4ec0a106f 100644
--- a/lib/librte_pdump/rte_pdump.h
+++ b/lib/librte_pdump/rte_pdump.h
@@ -113,7 +113,7 @@ rte_pdump_uninit(void);
  */
 
 int
-rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
+rte_pdump_enable(uint16_t port, uint16_t queue, uint32_t flags,
 		struct rte_ring *ring,
 		struct rte_mempool *mp,
 		void *filter);
@@ -136,7 +136,7 @@ rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags,
  */
 
 int
-rte_pdump_disable(uint8_t port, uint16_t queue, uint32_t flags);
+rte_pdump_disable(uint16_t port, uint16_t queue, uint32_t flags);
 
 /**
  * Enables packet capturing on given device id and queue.
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 76629a13a..c2b1b2ce4 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -44,7 +44,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
-LIBABIVER := 3
+LIBABIVER := 4
 
 #
 # all source are stored in SRCS-y
diff --git a/lib/librte_port/rte_port_ethdev.c b/lib/librte_port/rte_port_ethdev.c
index d5c5fba55..4ed10f276 100644
--- a/lib/librte_port/rte_port_ethdev.c
+++ b/lib/librte_port/rte_port_ethdev.c
@@ -60,7 +60,7 @@ struct rte_port_ethdev_reader {
 	struct rte_port_in_stats stats;
 
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
@@ -156,7 +156,7 @@ struct rte_port_ethdev_writer {
 	uint16_t tx_buf_count;
 	uint64_t bsz_mask;
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
@@ -337,7 +337,7 @@ struct rte_port_ethdev_writer_nodrop {
 	uint64_t bsz_mask;
 	uint64_t n_retries;
 	uint16_t queue_id;
-	uint8_t port_id;
+	uint16_t port_id;
 };
 
 static void *
diff --git a/lib/librte_port/rte_port_ethdev.h b/lib/librte_port/rte_port_ethdev.h
index 201a79e41..f5ed9ab2d 100644
--- a/lib/librte_port/rte_port_ethdev.h
+++ b/lib/librte_port/rte_port_ethdev.h
@@ -54,7 +54,7 @@ extern "C" {
 /** ethdev_reader port parameters */
 struct rte_port_ethdev_reader_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
@@ -66,7 +66,7 @@ extern struct rte_port_in_ops rte_port_ethdev_reader_ops;
 /** ethdev_writer port parameters */
 struct rte_port_ethdev_writer_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
@@ -82,7 +82,7 @@ extern struct rte_port_out_ops rte_port_ethdev_writer_ops;
 /** ethdev_writer_nodrop port parameters */
 struct rte_port_ethdev_writer_nodrop_params {
 	/** NIC RX port ID */
-	uint8_t port_id;
+	uint16_t port_id;
 
 	/** NIC RX queue ID */
 	uint16_t queue_id;
-- 
2.13.3

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI versioning
  2017-09-21  8:32  4%   ` [dpdk-dev] [PATCH v4 0/5] " Zhiyong Yang
@ 2017-09-21  8:32  8%     ` Zhiyong Yang
  2017-09-21 10:36  4%       ` Ferruh Yigit
  2017-09-21  8:32  1%     ` [dpdk-dev] [PATCH v4 2/5] ethdev: increase port_id range Zhiyong Yang
  2017-09-25  3:22  4%     ` [dpdk-dev] [PATCH v5 0/5] " Zhiyong Yang
  2 siblings, 1 reply; 200+ results
From: Zhiyong Yang @ 2017-09-21  8:32 UTC (permalink / raw)
  To: dev; +Cc: thomas, ferruh.yigit, Zhiyong Yang

There are two bonding APIs using ABI versioning, and both have
port_id as parameter. Since we are already breaking ABI, no need
to keep older versions of APIs.

Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
---
 drivers/net/bonding/rte_eth_bond_8023ad.c    | 139 +--------------------------
 drivers/net/bonding/rte_eth_bond_8023ad.h    |  18 ----
 drivers/net/bonding/rte_eth_bond_version.map |   4 -
 3 files changed, 2 insertions(+), 159 deletions(-)

diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index 20b5a8961..efb9c6e77 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -1114,17 +1114,6 @@ bond_mode_8023ad_conf_get(struct rte_eth_dev *dev,
 }
 
 static void
-bond_mode_8023ad_conf_get_v1607(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	bond_mode_8023ad_conf_get(dev, conf);
-	conf->slowrx_cb = mode4->slowrx_cb;
-}
-
-static void
 bond_mode_8023ad_conf_get_v1708(struct rte_eth_dev *dev,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
@@ -1171,27 +1160,6 @@ bond_mode_8023ad_conf_assign(struct mode8023ad_private *mode4,
 	mode4->dedicated_queues.tx_qid = UINT16_MAX;
 }
 
-static void
-bond_mode_8023ad_setup_v20(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_bond_8023ad_conf def_conf;
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	if (conf == NULL) {
-		conf = &def_conf;
-		bond_mode_8023ad_conf_get_default(conf);
-	}
-
-	bond_mode_8023ad_stop(dev);
-	bond_mode_8023ad_conf_assign(mode4, conf);
-
-	if (dev->data->dev_started)
-		bond_mode_8023ad_start(dev);
-}
-
-
 void
 bond_mode_8023ad_setup(struct rte_eth_dev *dev,
 		struct rte_eth_bond_8023ad_conf *conf)
@@ -1207,27 +1175,6 @@ bond_mode_8023ad_setup(struct rte_eth_dev *dev,
 
 	bond_mode_8023ad_stop(dev);
 	bond_mode_8023ad_conf_assign(mode4, conf);
-
-
-	if (dev->data->dev_started)
-		bond_mode_8023ad_start(dev);
-}
-
-static void
-bond_mode_8023ad_setup_v1708(struct rte_eth_dev *dev,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_bond_8023ad_conf def_conf;
-	struct bond_dev_private *internals = dev->data->dev_private;
-	struct mode8023ad_private *mode4 = &internals->mode4;
-
-	if (conf == NULL) {
-		conf = &def_conf;
-		bond_mode_8023ad_conf_get_default(conf);
-	}
-
-	bond_mode_8023ad_stop(dev);
-	bond_mode_8023ad_conf_assign(mode4, conf);
 	mode4->slowrx_cb = conf->slowrx_cb;
 	mode4->agg_selection = AGG_STABLE;
 
@@ -1358,43 +1305,7 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
 }
 
 int
-rte_eth_bond_8023ad_conf_get_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-
-	if (valid_bonded_port_id(port_id) != 0)
-		return -EINVAL;
-
-	if (conf == NULL)
-		return -EINVAL;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_conf_get(bond_dev, conf);
-	return 0;
-}
-VERSION_SYMBOL(rte_eth_bond_8023ad_conf_get, _v20, 2.0);
-
-int
-rte_eth_bond_8023ad_conf_get_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-
-	if (valid_bonded_port_id(port_id) != 0)
-		return -EINVAL;
-
-	if (conf == NULL)
-		return -EINVAL;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_conf_get_v1607(bond_dev, conf);
-	return 0;
-}
-VERSION_SYMBOL(rte_eth_bond_8023ad_conf_get, _v1607, 16.07);
-
-int
-rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
+rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1409,10 +1320,6 @@ rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
 	bond_mode_8023ad_conf_get_v1708(bond_dev, conf);
 	return 0;
 }
-MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_conf_get(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf),
-		rte_eth_bond_8023ad_conf_get_v1708);
-BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_conf_get, _v1708, 17.08);
 
 int
 rte_eth_bond_8023ad_agg_selection_set(uint8_t port_id,
@@ -1483,25 +1390,7 @@ bond_8023ad_setup_validate(uint8_t port_id,
 }
 
 int
-rte_eth_bond_8023ad_setup_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-	int err;
-
-	err = bond_8023ad_setup_validate(port_id, conf);
-	if (err != 0)
-		return err;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_setup_v20(bond_dev, conf);
-
-	return 0;
-}
-VERSION_SYMBOL(rte_eth_bond_8023ad_setup, _v20, 2.0);
-
-int
-rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
+rte_eth_bond_8023ad_setup(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
 	struct rte_eth_dev *bond_dev;
@@ -1516,30 +1405,6 @@ rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
 
 	return 0;
 }
-VERSION_SYMBOL(rte_eth_bond_8023ad_setup, _v1607, 16.07);
-
-
-int
-rte_eth_bond_8023ad_setup_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf)
-{
-	struct rte_eth_dev *bond_dev;
-	int err;
-
-	err = bond_8023ad_setup_validate(port_id, conf);
-	if (err != 0)
-		return err;
-
-	bond_dev = &rte_eth_devices[port_id];
-	bond_mode_8023ad_setup_v1708(bond_dev, conf);
-
-	return 0;
-}
-BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_setup, _v1708, 17.08);
-MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf),
-		rte_eth_bond_8023ad_setup_v1708);
-
 
 
 
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h
index 1d353c734..d609745e0 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.h
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.h
@@ -194,15 +194,6 @@ struct rte_eth_bond_8023ad_slave_info {
 int
 rte_eth_bond_8023ad_conf_get(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
  * @internal
@@ -218,15 +209,6 @@ rte_eth_bond_8023ad_conf_get_v1708(uint8_t port_id,
 int
 rte_eth_bond_8023ad_setup(uint8_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v20(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v1607(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
-int
-rte_eth_bond_8023ad_setup_v1708(uint8_t port_id,
-		struct rte_eth_bond_8023ad_conf *conf);
 
 /**
  * @internal
diff --git a/drivers/net/bonding/rte_eth_bond_version.map b/drivers/net/bonding/rte_eth_bond_version.map
index 0f4e847da..ec3374b0f 100644
--- a/drivers/net/bonding/rte_eth_bond_version.map
+++ b/drivers/net/bonding/rte_eth_bond_version.map
@@ -1,8 +1,6 @@
 DPDK_2.0 {
 	global:
 
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
 	rte_eth_bond_active_slaves_get;
 	rte_eth_bond_create;
 	rte_eth_bond_link_monitoring_set;
@@ -39,8 +37,6 @@ DPDK_16.07 {
 	rte_eth_bond_8023ad_ext_distrib;
 	rte_eth_bond_8023ad_ext_distrib_get;
 	rte_eth_bond_8023ad_ext_slowtx;
-	rte_eth_bond_8023ad_conf_get;
-	rte_eth_bond_8023ad_setup;
 
 } DPDK_16.04;
 
-- 
2.13.3

^ permalink raw reply	[relevance 8%]

* [dpdk-dev] [PATCH v4 0/5] increase port_id range
      @ 2017-09-21  8:32  4%   ` Zhiyong Yang
  2017-09-21  8:32  8%     ` [dpdk-dev] [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
                       ` (2 more replies)
  2 siblings, 3 replies; 200+ results
From: Zhiyong Yang @ 2017-09-21  8:32 UTC (permalink / raw)
  To: dev; +Cc: thomas, ferruh.yigit

port_id is currently defined as uint8_t, which is limited to the range
0 to 255. A larger range is required for vdev scalability.

It is necessary for a redefinition of port_id to extend it from
1 bytes to 2 bytes. All ethdev APIs and usages related to port_id will
be changed at the same time.

Discussion about port_id is the following thread.
http://www.dpdk.org/dev/patchwork/patch/23208/

Changes in V2:
1. cover more PMDs to increase port_id range.
2. cover more examples to increase port_id range.
3. add 17.11 release note.

Changes in V3:
1.  cover mlx4 and mlx5.
2.  add to increase port_id range in test code.
3.  The patch "librte_mbuf: modify port initialization value" is merged
    into the patchset.

Changes in V4:
1.  Add a patch to remove bonding APIs using ABI versioning according to
    Ferruh's comments.
2.  Unify to use typedef portid_t in testpmd code.
3.  Update release note and deprecation doc in 2/5
4.  Fix some issues according to comments.

Note: 3/5 and 4/5 patches' compilling depends on 2/5 patch since 2/5 patch
breaks lib/PMD API/ABI.

Zhiyong Yang (5):
  net/bonding: remove bonding APIs using ABI versioning
  ethdev: increase port_id range
  examples: increase port_id range
  test: increase port_id range
  librte_mbuf: modify port initialization value

 app/pdump/main.c                                   |   2 +-
 app/test-pmd/cmdline.c                             |   6 +-
 app/test-pmd/config.c                              |   4 +-
 app/test-pmd/ieee1588fwd.c                         |  26 +--
 app/test-pmd/parameters.c                          |   2 +-
 app/test-pmd/rxonly.c                              |   2 +-
 app/test-pmd/testpmd.c                             |  18 +-
 app/test-pmd/testpmd.h                             |   4 +-
 doc/guides/rel_notes/deprecation.rst               |   6 -
 doc/guides/rel_notes/release_17_11.rst             |  18 +-
 drivers/net/af_packet/Makefile                     |   2 +-
 drivers/net/af_packet/rte_eth_af_packet.c          |   2 +-
 drivers/net/ark/ark_ethdev.c                       |   2 +-
 drivers/net/avp/Makefile                           |   2 +-
 drivers/net/avp/avp_ethdev.c                       |   2 +-
 drivers/net/bnx2x/Makefile                         |   2 +-
 drivers/net/bnx2x/bnx2x_rxtx.h                     |   4 +-
 drivers/net/bnxt/Makefile                          |   2 +-
 drivers/net/bnxt/bnxt.h                            |   2 +-
 drivers/net/bnxt/bnxt_ethdev.c                     |   4 +-
 drivers/net/bnxt/bnxt_rxq.h                        |   2 +-
 drivers/net/bnxt/bnxt_txq.h                        |   2 +-
 drivers/net/bnxt/rte_pmd_bnxt.c                    |  32 +--
 drivers/net/bnxt/rte_pmd_bnxt.h                    |  32 +--
 drivers/net/bonding/Makefile                       |   2 +-
 drivers/net/bonding/rte_eth_bond.h                 |  42 ++--
 drivers/net/bonding/rte_eth_bond_8023ad.c          | 193 +++--------------
 drivers/net/bonding/rte_eth_bond_8023ad.h          |  48 ++--
 drivers/net/bonding/rte_eth_bond_8023ad_private.h  |  12 +-
 drivers/net/bonding/rte_eth_bond_alb.c             |   6 +-
 drivers/net/bonding/rte_eth_bond_alb.h             |   6 +-
 drivers/net/bonding/rte_eth_bond_api.c             |  64 +++---
 drivers/net/bonding/rte_eth_bond_args.c            |   2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c             |  62 +++---
 drivers/net/bonding/rte_eth_bond_private.h         |  45 ++--
 drivers/net/bonding/rte_eth_bond_version.map       |   4 -
 drivers/net/e1000/Makefile                         |   2 +-
 drivers/net/e1000/em_ethdev.c                      |   2 +-
 drivers/net/e1000/em_rxtx.c                        |   4 +-
 drivers/net/e1000/igb_rxtx.c                       |   4 +-
 drivers/net/failsafe/Makefile                      |   2 +-
 drivers/net/failsafe/failsafe_ether.c              |   4 +-
 drivers/net/failsafe/failsafe_private.h            |   4 +-
 drivers/net/fm10k/Makefile                         |   2 +-
 drivers/net/fm10k/fm10k.h                          |   6 +-
 drivers/net/i40e/Makefile                          |   2 +-
 drivers/net/i40e/i40e_ethdev.c                     |   5 +-
 drivers/net/i40e/i40e_rxtx.h                       |   4 +-
 drivers/net/i40e/rte_pmd_i40e.c                    |  50 ++---
 drivers/net/i40e/rte_pmd_i40e.h                    |  48 ++--
 drivers/net/ixgbe/Makefile                         |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c                   |   5 +-
 drivers/net/ixgbe/ixgbe_rxtx.h                     |   4 +-
 drivers/net/ixgbe/rte_pmd_ixgbe.c                  |  60 ++---
 drivers/net/ixgbe/rte_pmd_ixgbe.h                  |  64 +++---
 drivers/net/mlx5/mlx5_rxtx.h                       |   4 +-
 drivers/net/nfp/nfp_net.c                          |  16 +-
 drivers/net/nfp/nfp_net_pmd.h                      |   2 +-
 drivers/net/null/Makefile                          |   2 +-
 drivers/net/null/rte_eth_null.c                    |   2 +-
 drivers/net/pcap/Makefile                          |   2 +-
 drivers/net/pcap/rte_eth_pcap.c                    |   2 +-
 drivers/net/qede/qede_if.h                         |   2 +-
 drivers/net/ring/rte_eth_ring.c                    |   2 +-
 drivers/net/szedata2/rte_eth_szedata2.c            |   2 +-
 drivers/net/thunderx/nicvf_struct.h                |   2 +-
 drivers/net/vhost/Makefile                         |   2 +-
 drivers/net/vhost/rte_eth_vhost.c                  |   6 +-
 drivers/net/vhost/rte_eth_vhost.h                  |   4 +-
 drivers/net/virtio/Makefile                        |   2 +-
 drivers/net/virtio/virtio_pci.h                    |   2 +-
 drivers/net/virtio/virtio_rxtx.h                   |   6 +-
 drivers/net/vmxnet3/vmxnet3_ring.h                 |   4 +-
 examples/bond/main.c                               |  16 +-
 examples/distributor/main.c                        |  26 +--
 examples/exception_path/main.c                     |  35 ++-
 examples/ip_fragmentation/main.c                   |  33 +--
 examples/ip_pipeline/init.c                        |   4 +-
 examples/ip_reassembly/main.c                      |  34 +--
 examples/ipv4_multicast/main.c                     |  30 +--
 examples/kni/main.c                                |  30 +--
 examples/l2fwd-cat/l2fwd-cat.c                     |  12 +-
 examples/l2fwd-jobstats/main.c                     |  34 +--
 examples/l2fwd-keepalive/main.c                    |  50 ++---
 examples/l2fwd/main.c                              |  47 ++--
 examples/l3fwd-acl/main.c                          |   9 +-
 examples/l3fwd-power/main.c                        |  60 ++---
 examples/l3fwd-vf/main.c                           |  50 +++--
 examples/l3fwd/l3fwd.h                             |  10 +-
 examples/l3fwd/l3fwd_common.h                      |   2 +-
 examples/l3fwd/l3fwd_em.c                          |   2 +-
 examples/l3fwd/l3fwd_em.h                          |   6 +-
 examples/l3fwd/l3fwd_em_hlm.h                      |  14 +-
 examples/l3fwd/l3fwd_lpm.c                         |  15 +-
 examples/l3fwd/l3fwd_lpm.h                         |   4 +-
 examples/l3fwd/l3fwd_lpm_neon.h                    |   4 +-
 examples/l3fwd/l3fwd_lpm_sse.h                     |   4 +-
 examples/l3fwd/main.c                              |  30 +--
 examples/link_status_interrupt/main.c              |   9 +-
 examples/load_balancer/config.c                    |  14 +-
 examples/load_balancer/init.c                      |  34 ++-
 examples/load_balancer/main.h                      |  11 +-
 examples/load_balancer/runtime.c                   |  12 +-
 .../client_server_mp/mp_client/client.c            |  17 +-
 .../client_server_mp/mp_server/args.c              |   4 +-
 .../client_server_mp/mp_server/args.h              |   2 +-
 .../client_server_mp/mp_server/init.c              |  11 +-
 .../client_server_mp/mp_server/main.c              |   2 +-
 .../multi_process/client_server_mp/shared/common.h |   4 +-
 examples/multi_process/l2fwd_fork/main.c           |  23 +-
 examples/netmap_compat/lib/compat_netmap.c         |  52 +++--
 examples/netmap_compat/lib/compat_netmap.h         |   2 +-
 examples/packet_ordering/main.c                    |  19 +-
 examples/performance-thread/l3fwd-thread/main.c    | 143 ++++++------
 examples/ptpclient/ptpclient.c                     |   4 +-
 examples/qos_sched/args.c                          |  12 +-
 examples/qos_sched/init.c                          |  31 +--
 examples/qos_sched/main.c                          |  14 +-
 examples/qos_sched/main.h                          |  24 +-
 examples/qos_sched/stats.c                         |  16 +-
 examples/quota_watermark/qw/init.c                 |   4 +-
 examples/quota_watermark/qw/main.c                 |  10 +-
 examples/rxtx_callbacks/main.c                     |   8 +-
 examples/server_node_efd/server/main.c             |   2 +-
 examples/server_node_efd/shared/common.h           |   4 +-
 examples/skeleton/basicfwd.c                       |  12 +-
 examples/vhost/main.c                              |  10 +-
 lib/librte_bitratestats/Makefile                   |   2 +-
 lib/librte_bitratestats/rte_bitrate.c              |   2 +-
 lib/librte_bitratestats/rte_bitrate.h              |   2 +-
 lib/librte_ether/Makefile                          |   2 +-
 lib/librte_ether/rte_ethdev.c                      | 241 +++++++++++----------
 lib/librte_ether/rte_ethdev.h                      | 238 ++++++++++----------
 lib/librte_ether/rte_flow.c                        |   2 +-
 lib/librte_ether/rte_flow_driver.h                 |   2 +-
 lib/librte_ether/rte_tm.c                          |  62 +++---
 lib/librte_ether/rte_tm.h                          |  60 ++---
 lib/librte_ether/rte_tm_driver.h                   |   2 +-
 lib/librte_kni/Makefile                            |   2 +-
 lib/librte_kni/rte_kni.h                           |   6 +-
 lib/librte_latencystats/rte_latencystats.c         |  12 +-
 lib/librte_mbuf/rte_mbuf.c                         |   2 +-
 lib/librte_mbuf/rte_mbuf.h                         |   4 +-
 lib/librte_pdump/Makefile                          |   2 +-
 lib/librte_pdump/rte_pdump.c                       |  16 +-
 lib/librte_pdump/rte_pdump.h                       |   4 +-
 lib/librte_port/Makefile                           |   2 +-
 lib/librte_port/rte_port_ethdev.c                  |   6 +-
 lib/librte_port/rte_port_ethdev.h                  |   6 +-
 test/test/test_kni.c                               |  12 +-
 test/test/test_link_bonding.c                      |  40 ++--
 test/test/test_link_bonding_mode4.c                |  12 +-
 test/test/test_pmd_perf.c                          |  30 +--
 test/test/test_pmd_ring_perf.c                     |   2 +-
 test/test/virtual_pmd.c                            |  24 +-
 test/test/virtual_pmd.h                            |  28 +--
 156 files changed, 1402 insertions(+), 1498 deletions(-)

-- 
2.13.3

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5] ethdev: add return code to rte_eth_stats_reset()
  2017-09-20 14:01  0%     ` David Harton (dharton)
@ 2017-09-20 16:55  0%       ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-09-20 16:55 UTC (permalink / raw)
  To: David Harton (dharton), thomas; +Cc: dev

On 9/20/2017 3:01 PM, David Harton (dharton) wrote:
> 
> 
>> -----Original Message-----
>> From: Ferruh Yigit [mailto:ferruh.yigit@intel.com]
>>
>> On 9/1/2017 3:26 AM, David Harton wrote:
>>> Some devices do not support reset of eth stats.  An application may
>>> need to know not to clear shadow stats if the device cannot.
>>>
>>> rte_eth_stats_reset is updated to provide a return code to share
>>> whether the device supports reset or not.
>>>
>>> Signed-off-by: David Harton <dharton@cisco.com>
>>> ---
>>>
>>> v5:
>>> * squashed doc patch
>>> * moved rel_note change from ABI to API section
>>>
>>> v4:
>>> * commented return values
>>>
>>> v3:
>>> * overcame noob errors and figured out patch challenged
>>>
>>> v2:
>>> * fixed soft tab issue inserted while moving changes
>>>
>>>  doc/guides/rel_notes/release_17_11.rst | 13 +++++++++++++
>>>  lib/librte_ether/rte_ethdev.c          |  8 +++++---
>>>  lib/librte_ether/rte_ethdev.h          |  6 +++++-
>>>  3 files changed, 23 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/doc/guides/rel_notes/release_17_11.rst
>>> b/doc/guides/rel_notes/release_17_11.rst
>>> index 22df4fd..6282667 100644
>>> --- a/doc/guides/rel_notes/release_17_11.rst
>>> +++ b/doc/guides/rel_notes/release_17_11.rst
>>> @@ -110,6 +110,19 @@ API Changes
>>>     Also, make sure to start the actual text at the margin.
>>>     =========================================================
>>>
>>> +* **Modified the return type of rte_eth_stats_reset.**
>>> +
>>> +  Changed return type of ``rte_eth_stats_reset`` from ``void`` to
>>> + ``int``  so the caller may know whether a device supports the
>>> + operation or not  and if the operation was carried out.
>>> +
>>
>>> +* **Modified the vlan_offload_set_t function prototype in the ethdev
>>> +library.**
>>> +
>>> +  Changed the function prototype of ``vlan_offload_set_t``.  The
>>> + return value  has been changed from ``void`` to ``int`` so the
>>> + caller to knows whether  the backing device supports the operation
>>> + or if the operation was  successfully performed.
>>> +
>>
>> Is this addition to the document related to this patch?
> 
> Good catch.  No. :(
> 
> I must have mishandled the rebase I did to update this patch.  V6 coming.  
> Would be great if you could re-ACK afterwards so this one can move.

I think you can carry the previous Ack for this case. Since main part of
the patch that acked will not be changed...

> 
> Thanks,
> Dave

<...>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 3/6] net/i40e: implement dynamic mapping of sw flow types to hw pctypes
  @ 2017-09-20 14:33  4%   ` Kirill Rybalchenko
  2017-09-25  9:44  0%     ` Xing, Beilei
    1 sibling, 1 reply; 200+ results
From: Kirill Rybalchenko @ 2017-09-20 14:33 UTC (permalink / raw)
  To: dev; +Cc: kirill.rybalchenko, andrey.chilikin, beilei.xing, jingjing.wu

Implement dynamic mapping of software flow types to hardware pctypes.
This allows to add new flow types and pctypes for DDP without changing
API of the driver. The mapping table is located in private
data area for particular network adapter and can be individually
modified with set of appropriate functions.

v2:
Re-arrange patchset to avoid compillation errors.
Remove usage of statically defined flow types and pctypes.

v3:
Changed prototypes of some static functions.
Fixed bugs in i40e_pctype_to_flowtype and i40e_flowtype_to_pctype
functions.
Various small modifications after reviewing.

Signed-off-by: Kirill Rybalchenko <kirill.rybalchenko@intel.com>
---
 drivers/net/i40e/i40e_ethdev.c    | 343 ++++++++++++--------------------------
 drivers/net/i40e/i40e_ethdev.h    |  17 +-
 drivers/net/i40e/i40e_ethdev_vf.c |  16 +-
 drivers/net/i40e/i40e_fdir.c      |  54 +++---
 drivers/net/i40e/i40e_flow.c      |   5 +-
 drivers/net/i40e/i40e_rxtx.c      |  57 +++++++
 drivers/net/i40e/i40e_rxtx.h      |   1 +
 7 files changed, 208 insertions(+), 285 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 18eac07..e396f73 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -1064,6 +1064,7 @@ eth_i40e_dev_init(struct rte_eth_dev *dev)
 		return 0;
 	}
 	i40e_set_default_ptype_table(dev);
+	i40e_set_default_pctype_table(dev);
 	pci_dev = RTE_ETH_DEV_TO_PCI(dev);
 	intr_handle = &pci_dev->intr_handle;
 
@@ -3000,7 +3001,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
 						sizeof(uint32_t);
 	dev_info->reta_size = pf->hash_lut_size;
-	dev_info->flow_type_rss_offloads = I40E_RSS_OFFLOAD_ALL;
+	dev_info->flow_type_rss_offloads = pf->adapter->flow_types_mask;
 
 	dev_info->default_rxconf = (struct rte_eth_rxconf) {
 		.rx_thresh = {
@@ -6591,104 +6592,36 @@ i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct ether_addr *addr)
 
 /* Configure hash enable flags for RSS */
 uint64_t
-i40e_config_hena(uint64_t flags, enum i40e_mac_type type)
+i40e_config_hena(const struct i40e_adapter *adapter, uint64_t flags)
 {
 	uint64_t hena = 0;
+	int i;
 
 	if (!flags)
 		return hena;
 
-	if (flags & ETH_RSS_FRAG_IPV4)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4;
-	if (flags & ETH_RSS_NONFRAG_IPV4_TCP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV4_UDP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV4_SCTP)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP;
-	if (flags & ETH_RSS_NONFRAG_IPV4_OTHER)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER;
-	if (flags & ETH_RSS_FRAG_IPV6)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6;
-	if (flags & ETH_RSS_NONFRAG_IPV6_TCP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP;
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (flags & (1ULL << i))
+			hena |= adapter->pctypes_tbl[i];
 	}
-	if (flags & ETH_RSS_NONFRAG_IPV6_UDP) {
-		if (type == I40E_MAC_X722) {
-			hena |= (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) |
-			 (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP);
-		} else
-			hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP;
-	}
-	if (flags & ETH_RSS_NONFRAG_IPV6_SCTP)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP;
-	if (flags & ETH_RSS_NONFRAG_IPV6_OTHER)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER;
-	if (flags & ETH_RSS_L2_PAYLOAD)
-		hena |= 1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD;
 
 	return hena;
 }
 
 /* Parse the hash enable flags */
 uint64_t
-i40e_parse_hena(uint64_t flags)
+i40e_parse_hena(const struct i40e_adapter *adapter, uint64_t flags)
 {
 	uint64_t rss_hf = 0;
 
 	if (!flags)
 		return rss_hf;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4))
-		rss_hf |= ETH_RSS_FRAG_IPV4;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_SCTP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER))
-		rss_hf |= ETH_RSS_NONFRAG_IPV4_OTHER;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6))
-		rss_hf |= ETH_RSS_FRAG_IPV6;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_SCTP;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER))
-		rss_hf |= ETH_RSS_NONFRAG_IPV6_OTHER;
-	if (flags & (1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD))
-		rss_hf |= ETH_RSS_L2_PAYLOAD;
+	int i;
 
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (flags & adapter->pctypes_tbl[i])
+			rss_hf |= (1ULL << i);
+	}
 	return rss_hf;
 }
 
@@ -6779,7 +6712,7 @@ i40e_hw_rss_hash_set(struct i40e_pf *pf, struct rte_eth_rss_conf *rss_conf)
 	if (ret)
 		return ret;
 
-	hena = i40e_config_hena(rss_conf->rss_hf, hw->mac.type);
+	hena = i40e_config_hena(pf->adapter, rss_conf->rss_hf);
 	i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), (uint32_t)hena);
 	i40e_write_rx_ctl(hw, I40E_PFQF_HENA(1), (uint32_t)(hena >> 32));
 	I40E_WRITE_FLUSH(hw);
@@ -6793,14 +6726,13 @@ i40e_dev_rss_hash_update(struct rte_eth_dev *dev,
 {
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	uint64_t rss_hf = rss_conf->rss_hf & I40E_RSS_OFFLOAD_ALL;
+	uint64_t rss_hf = rss_conf->rss_hf & pf->adapter->flow_types_mask;
 	uint64_t hena;
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1))) << 32;
-	if (!(hena & ((hw->mac.type == I40E_MAC_X722)
-		 ? I40E_RSS_HENA_ALL_X722
-		 : I40E_RSS_HENA_ALL))) { /* RSS disabled */
+
+	if (!(hena & pf->adapter->pctypes_mask)) { /* RSS disabled */
 		if (rss_hf != 0) /* Enable RSS */
 			return -EINVAL;
 		return 0; /* Nothing to do */
@@ -6825,7 +6757,7 @@ i40e_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1))) << 32;
-	rss_conf->rss_hf = i40e_parse_hena(hena);
+	rss_conf->rss_hf = i40e_parse_hena(pf->adapter, hena);
 
 	return 0;
 }
@@ -7600,7 +7532,7 @@ i40e_pf_config_rss(struct i40e_pf *pf)
 	}
 
 	rss_conf = pf->dev_data->dev_conf.rx_adv_conf.rss_conf;
-	if ((rss_conf.rss_hf & I40E_RSS_OFFLOAD_ALL) == 0) {
+	if ((rss_conf.rss_hf & pf->adapter->flow_types_mask) == 0) {
 		i40e_pf_disable_rss(pf);
 		return 0;
 	}
@@ -7821,9 +7753,9 @@ static int
 i40e_get_hash_filter_global_config(struct i40e_hw *hw,
 				   struct rte_eth_hash_global_conf *g_cfg)
 {
-	uint32_t reg, mask = I40E_FLOW_TYPES;
-	uint16_t i;
-	enum i40e_filter_pctype pctype;
+	struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back;
+	uint32_t reg;
+	uint16_t i, j;
 
 	memset(g_cfg, 0, sizeof(*g_cfg));
 	reg = i40e_read_rx_ctl(hw, I40E_GLQF_CTL);
@@ -7834,29 +7766,37 @@ i40e_get_hash_filter_global_config(struct i40e_hw *hw,
 	PMD_DRV_LOG(DEBUG, "Hash function is %s",
 		(reg & I40E_GLQF_CTL_HTOEP_MASK) ? "Toeplitz" : "Simple XOR");
 
-	for (i = 0; mask && i < RTE_ETH_FLOW_MAX; i++) {
-		if (!(mask & (1UL << i)))
-			continue;
-		mask &= ~(1UL << i);
-		/* Bit set indicats the coresponding flow type is supported */
-		g_cfg->valid_bit_mask[0] |= (1UL << i);
-		/* if flowtype is invalid, continue */
-		if (!I40E_VALID_FLOW(i))
-			continue;
-		pctype = i40e_flowtype_to_pctype(i);
-		reg = i40e_read_rx_ctl(hw, I40E_GLQF_HSYM(pctype));
-		if (reg & I40E_GLQF_HSYM_SYMH_ENA_MASK)
-			g_cfg->sym_hash_enable_mask[0] |= (1UL << i);
+	/*
+	 * We work only with lowest 32 bits which is not correct, but to work
+	 * properly the valid_bit_mask size should be increased up to 64 bits
+	 * and this will brake ABI. This modification will be done in next release
+	 */
+	g_cfg->valid_bit_mask[0] = (uint32_t)adapter->flow_types_mask;
+
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < UINT32_BIT; i++) {
+		if (adapter->pctypes_tbl[i]) {
+			for (j = I40E_FILTER_PCTYPE_INVALID + 1;
+			     j < I40E_FILTER_PCTYPE_MAX; j++) {
+				if (adapter->pctypes_tbl[i] & (1ULL << j)) {
+					reg = i40e_read_rx_ctl(hw, I40E_GLQF_HSYM(j));
+					if (reg & I40E_GLQF_HSYM_SYMH_ENA_MASK) {
+						g_cfg->sym_hash_enable_mask[0] |=
+									(1UL << i);
+					}
+				}
+			}
+		}
 	}
 
 	return 0;
 }
 
 static int
-i40e_hash_global_config_check(struct rte_eth_hash_global_conf *g_cfg)
+i40e_hash_global_config_check(struct rte_eth_hash_global_conf *g_cfg,
+			      struct i40e_adapter *adapter)
 {
 	uint32_t i;
-	uint32_t mask0, i40e_mask = I40E_FLOW_TYPES;
+	uint32_t mask0, i40e_mask = adapter->flow_types_mask;
 
 	if (g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_TOEPLITZ &&
 		g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_SIMPLE_XOR &&
@@ -7899,64 +7839,32 @@ static int
 i40e_set_hash_filter_global_config(struct i40e_hw *hw,
 				   struct rte_eth_hash_global_conf *g_cfg)
 {
+	struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back;
 	int ret;
-	uint16_t i;
+	uint16_t i, j;
 	uint32_t reg;
-	uint32_t mask0 = g_cfg->valid_bit_mask[0];
-	enum i40e_filter_pctype pctype;
+	/*
+	 * We work only with lowest 32 bits which is not correct, but to work
+	 * properly the valid_bit_mask size should be increased up to 64 bits
+	 * and this will brake ABI. This modification will be done in next release
+	 */
+	uint32_t mask0 = g_cfg->valid_bit_mask[0] & (uint32_t)adapter->flow_types_mask;
 
 	/* Check the input parameters */
-	ret = i40e_hash_global_config_check(g_cfg);
+	ret = i40e_hash_global_config_check(g_cfg, adapter);
 	if (ret < 0)
 		return ret;
 
-	for (i = 0; mask0 && i < UINT32_BIT; i++) {
-		if (!(mask0 & (1UL << i)))
-			continue;
-		mask0 &= ~(1UL << i);
-		/* if flowtype is invalid, continue */
-		if (!I40E_VALID_FLOW(i))
-			continue;
-		pctype = i40e_flowtype_to_pctype(i);
-		reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
-				I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_UDP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP),
-				  reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_TCP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_TCP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_UDP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP),
-				  reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP),
-				  reg);
-			} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP) {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_TCP), reg);
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(
-				  I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK),
-				  reg);
-			} else {
-				i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype),
-				  reg);
+	for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < UINT32_BIT; i++) {
+		if (mask0 & (1UL << i)) {
+			reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
+					I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
+
+			for (j = I40E_FILTER_PCTYPE_INVALID + 1;
+			     j < I40E_FILTER_PCTYPE_MAX; j++) {
+				if (adapter->pctypes_tbl[i] & (1ULL << j))
+					i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(j), reg);
 			}
-		} else {
-			i40e_write_rx_ctl(hw, I40E_GLQF_HSYM(pctype), reg);
 		}
 	}
 
@@ -8581,13 +8489,10 @@ i40e_filter_input_set_init(struct i40e_pf *pf)
 
 	for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
 	     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) {
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722(pctype))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE(pctype))
-				continue;
-		}
+		uint16_t flow_type = i40e_pctype_to_flowtype(pf->adapter, pctype);
+
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
 
 		input_set = i40e_get_default_input_set(pctype);
 
@@ -8650,7 +8555,8 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 		return -EINVAL;
 	}
 
-	if (!I40E_VALID_FLOW(conf->flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, conf->flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
@@ -8658,10 +8564,8 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 	if (hw->mac.type == I40E_MAC_X722) {
 		/* get translated pctype value in fd pctype register */
 		pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(hw,
-			I40E_GLQF_FD_PCTYPES((int)i40e_flowtype_to_pctype(
-			conf->flow_type)));
-	} else
-		pctype = i40e_flowtype_to_pctype(conf->flow_type);
+			I40E_GLQF_FD_PCTYPES((int)pctype));
+	}
 
 	ret = i40e_parse_input_set(&input_set, pctype, conf->field,
 				   conf->inset_size);
@@ -8669,11 +8573,7 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw,
 		PMD_DRV_LOG(ERR, "Failed to parse input set");
 		return -EINVAL;
 	}
-	if (i40e_validate_input_set(pctype, RTE_ETH_FILTER_HASH,
-				    input_set) != 0) {
-		PMD_DRV_LOG(ERR, "Invalid input set");
-		return -EINVAL;
-	}
+
 	if (conf->op == RTE_ETH_INPUT_SET_ADD) {
 		/* get inset value in register */
 		inset_reg = i40e_read_rx_ctl(hw, I40E_GLQF_HASH_INSET(1, pctype));
@@ -8727,24 +8627,19 @@ i40e_fdir_filter_inset_select(struct i40e_pf *pf,
 		return -EINVAL;
 	}
 
-	if (!I40E_VALID_FLOW(conf->flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, conf->flow_type);
+
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
 
-	pctype = i40e_flowtype_to_pctype(conf->flow_type);
-
 	ret = i40e_parse_input_set(&input_set, pctype, conf->field,
 				   conf->inset_size);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "Failed to parse input set");
 		return -EINVAL;
 	}
-	if (i40e_validate_input_set(pctype, RTE_ETH_FILTER_FDIR,
-				    input_set) != 0) {
-		PMD_DRV_LOG(ERR, "Invalid input set");
-		return -EINVAL;
-	}
 
 	/* get inset value in register */
 	inset_reg = i40e_read_rx_ctl(hw, I40E_PRTQF_FD_INSET(pctype, 1));
@@ -9183,72 +9078,42 @@ i40e_hw_init(struct rte_eth_dev *dev)
 	i40e_set_symmetric_hash_enable_per_port(hw, 0);
 }
 
+/*
+ * For X722 it is possible to have multiple pctypes mapped to the same flowtype
+ * however this function will return only one highest pctype index,
+ * which is not quite correct. This is known problem of i40e driver
+ * and needs to be fixed later.
+ */
 enum i40e_filter_pctype
-i40e_flowtype_to_pctype(uint16_t flow_type)
-{
-	static const enum i40e_filter_pctype pctype_table[] = {
-		[RTE_ETH_FLOW_FRAG_IPV4] = I40E_FILTER_PCTYPE_FRAG_IPV4,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_UDP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_TCP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_SCTP] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_SCTP,
-		[RTE_ETH_FLOW_NONFRAG_IPV4_OTHER] =
-			I40E_FILTER_PCTYPE_NONF_IPV4_OTHER,
-		[RTE_ETH_FLOW_FRAG_IPV6] = I40E_FILTER_PCTYPE_FRAG_IPV6,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_UDP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_TCP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_SCTP] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_SCTP,
-		[RTE_ETH_FLOW_NONFRAG_IPV6_OTHER] =
-			I40E_FILTER_PCTYPE_NONF_IPV6_OTHER,
-		[RTE_ETH_FLOW_L2_PAYLOAD] = I40E_FILTER_PCTYPE_L2_PAYLOAD,
-	};
+i40e_flowtype_to_pctype(const struct i40e_adapter *adapter, uint16_t flow_type)
+{
+	int i;
+	uint64_t pctype_mask;
 
-	return pctype_table[flow_type];
+	if (flow_type < I40E_FLOW_TYPE_MAX) {
+		pctype_mask = adapter->pctypes_tbl[flow_type];
+		for (i = I40E_FILTER_PCTYPE_MAX - 1; i > 0; i--) {
+			if (pctype_mask & (1ULL << i))
+				return (enum i40e_filter_pctype)i;
+		}
+	}
+	return I40E_FILTER_PCTYPE_INVALID;
 }
 
 uint16_t
-i40e_pctype_to_flowtype(enum i40e_filter_pctype pctype)
+i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
+			enum i40e_filter_pctype pctype)
 {
-	static const uint16_t flowtype_table[] = {
-		[I40E_FILTER_PCTYPE_FRAG_IPV4] = RTE_ETH_FLOW_FRAG_IPV4,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_TCP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_SCTP] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_SCTP,
-		[I40E_FILTER_PCTYPE_NONF_IPV4_OTHER] =
-			RTE_ETH_FLOW_NONFRAG_IPV4_OTHER,
-		[I40E_FILTER_PCTYPE_FRAG_IPV6] = RTE_ETH_FLOW_FRAG_IPV6,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_UDP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_TCP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_TCP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_SCTP] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_SCTP,
-		[I40E_FILTER_PCTYPE_NONF_IPV6_OTHER] =
-			RTE_ETH_FLOW_NONFRAG_IPV6_OTHER,
-		[I40E_FILTER_PCTYPE_L2_PAYLOAD] = RTE_ETH_FLOW_L2_PAYLOAD,
-	};
+	uint16_t flowtype;
+	uint64_t pctype_mask = 1ULL << pctype;
+
+	for (flowtype = RTE_ETH_FLOW_UNKNOWN + 1; flowtype < I40E_FLOW_TYPE_MAX;
+	     flowtype++) {
+		if (adapter->pctypes_tbl[flowtype] & pctype_mask)
+			return flowtype;
+	}
 
-	return flowtype_table[pctype];
+	return RTE_ETH_FLOW_UNKNOWN;
 }
 
 /*
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index ad80f0f..e87f846 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -852,7 +852,8 @@ struct i40e_vf {
 	uint64_t flags;
 };
 
-#define I40E_MAX_PKT_TYPE 256
+#define I40E_MAX_PKT_TYPE  256
+#define I40E_FLOW_TYPE_MAX 64
 
 /*
  * Structure to store private data for each PF/VF instance.
@@ -881,6 +882,10 @@ struct i40e_adapter {
 
 	/* ptype mapping table */
 	uint32_t ptype_tbl[I40E_MAX_PKT_TYPE] __rte_cache_min_aligned;
+	/* flow type to pctype mapping table */
+	uint64_t pctypes_tbl[I40E_FLOW_TYPE_MAX] __rte_cache_min_aligned;
+	uint64_t flow_types_mask;
+	uint64_t pctypes_mask;
 };
 
 extern const struct rte_flow_ops i40e_flow_ops;
@@ -925,8 +930,8 @@ int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi,
 			   struct i40e_vsi_vlan_pvid_info *info);
 int i40e_vsi_config_vlan_stripping(struct i40e_vsi *vsi, bool on);
 int i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on);
-uint64_t i40e_config_hena(uint64_t flags, enum i40e_mac_type type);
-uint64_t i40e_parse_hena(uint64_t flags);
+uint64_t i40e_config_hena(const struct i40e_adapter *adapter, uint64_t flags);
+uint64_t i40e_parse_hena(const struct i40e_adapter *adapter, uint64_t flags);
 enum i40e_status_code i40e_fdir_setup_tx_resources(struct i40e_pf *pf);
 enum i40e_status_code i40e_fdir_setup_rx_resources(struct i40e_pf *pf);
 int i40e_fdir_setup(struct i40e_pf *pf);
@@ -935,8 +940,10 @@ const struct rte_memzone *i40e_memzone_reserve(const char *name,
 					int socket_id);
 int i40e_fdir_configure(struct rte_eth_dev *dev);
 void i40e_fdir_teardown(struct i40e_pf *pf);
-enum i40e_filter_pctype i40e_flowtype_to_pctype(uint16_t flow_type);
-uint16_t i40e_pctype_to_flowtype(enum i40e_filter_pctype pctype);
+enum i40e_filter_pctype  i40e_flowtype_to_pctype(const struct i40e_adapter *adapter,
+						 uint16_t flow_type);
+uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
+				 enum i40e_filter_pctype pctype);
 int i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
 			  enum rte_filter_op filter_op,
 			  void *arg);
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index f4ee424..1fd6f11 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -1398,6 +1398,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
 		return 0;
 	}
 	i40e_set_default_ptype_table(eth_dev);
+	i40e_set_default_pctype_table(eth_dev);
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 	eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
 
@@ -2133,7 +2134,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
 	dev_info->hash_key_size = (I40E_VFQF_HKEY_MAX_INDEX + 1) * sizeof(uint32_t);
 	dev_info->reta_size = ETH_RSS_RETA_SIZE_64;
-	dev_info->flow_type_rss_offloads = I40E_RSS_OFFLOAD_ALL;
+	dev_info->flow_type_rss_offloads = vf->adapter->flow_types_mask;
 	dev_info->max_mac_addrs = I40E_NUM_MACADDR_MAX;
 	dev_info->rx_offload_capa =
 		DEV_RX_OFFLOAD_VLAN_STRIP |
@@ -2443,7 +2444,7 @@ i40evf_hw_rss_hash_set(struct i40e_vf *vf, struct rte_eth_rss_conf *rss_conf)
 	if (ret)
 		return ret;
 
-	hena = i40e_config_hena(rss_conf->rss_hf, hw->mac.type);
+	hena = i40e_config_hena(vf->adapter, rss_conf->rss_hf);
 	i40e_write_rx_ctl(hw, I40E_VFQF_HENA(0), (uint32_t)hena);
 	i40e_write_rx_ctl(hw, I40E_VFQF_HENA(1), (uint32_t)(hena >> 32));
 	I40EVF_WRITE_FLUSH(hw);
@@ -2486,7 +2487,7 @@ i40evf_config_rss(struct i40e_vf *vf)
 	}
 
 	rss_conf = vf->dev_data->dev_conf.rx_adv_conf.rss_conf;
-	if ((rss_conf.rss_hf & I40E_RSS_OFFLOAD_ALL) == 0) {
+	if ((rss_conf.rss_hf & vf->adapter->flow_types_mask) == 0) {
 		i40evf_disable_rss(vf);
 		PMD_DRV_LOG(DEBUG, "No hash flag is set");
 		return 0;
@@ -2511,14 +2512,13 @@ i40evf_dev_rss_hash_update(struct rte_eth_dev *dev,
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	uint64_t rss_hf = rss_conf->rss_hf & I40E_RSS_OFFLOAD_ALL;
+	uint64_t rss_hf = rss_conf->rss_hf & vf->adapter->flow_types_mask;
 	uint64_t hena;
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(1))) << 32;
-	if (!(hena & ((hw->mac.type == I40E_MAC_X722)
-		 ? I40E_RSS_HENA_ALL_X722
-		 : I40E_RSS_HENA_ALL))) { /* RSS disabled */
+
+	if (!(hena & vf->adapter->pctypes_mask)) { /* RSS disabled */
 		if (rss_hf != 0) /* Enable RSS */
 			return -EINVAL;
 		return 0;
@@ -2544,7 +2544,7 @@ i40evf_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 
 	hena = (uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(0));
 	hena |= ((uint64_t)i40e_read_rx_ctl(hw, I40E_VFQF_HENA(1))) << 32;
-	rss_conf->rss_hf = i40e_parse_hena(hena);
+	rss_conf->rss_hf = i40e_parse_hena(vf->adapter, hena);
 
 	return 0;
 }
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index 84c0a1f..810d384 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -344,15 +344,10 @@ i40e_init_flx_pld(struct i40e_pf *pf)
 	/* initialize the masks */
 	for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
 	     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++) {
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722(
-				 (enum i40e_filter_pctype)pctype))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE(
-				 (enum i40e_filter_pctype)pctype))
-				continue;
-		}
+		uint16_t flow_type = i40e_pctype_to_flowtype(pf->adapter, pctype);
+
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
 		pf->fdir.flex_mask[pctype].word_mask = 0;
 		i40e_write_rx_ctl(hw, I40E_PRTQF_FD_FLXINSET(pctype), 0);
 		for (i = 0; i < I40E_FDIR_BITMASK_NUM_WORD; i++) {
@@ -449,7 +444,8 @@ i40e_check_fdir_flex_payload(const struct rte_eth_flex_payload_cfg *flex_cfg)
  * arguments are valid
  */
 static int
-i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
+i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf,
+			  const struct i40e_adapter *adapter)
 {
 	const struct rte_eth_flex_payload_cfg *flex_cfg;
 	const struct rte_eth_fdir_flex_mask *flex_mask;
@@ -486,8 +482,11 @@ i40e_check_fdir_flex_conf(const struct rte_eth_fdir_flex_conf *conf)
 		return -EINVAL;
 	}
 	for (i = 0; i < conf->nb_flexmasks; i++) {
+		enum i40e_filter_pctype pctype;
+
 		flex_mask = &conf->flex_mask[i];
-		if (!I40E_VALID_FLOW(flex_mask->flow_type)) {
+		pctype = i40e_flowtype_to_pctype(adapter, flex_mask->flow_type);
+		if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 			PMD_DRV_LOG(WARNING, "invalid flow type.");
 			return -EINVAL;
 		}
@@ -650,7 +649,7 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
 	i40e_init_flx_pld(pf); /* set flex config to default value */
 
 	conf = &dev->data->dev_conf.fdir_conf.flex_conf;
-	ret = i40e_check_fdir_flex_conf(conf);
+	ret = i40e_check_fdir_flex_conf(conf, pf->adapter);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, " invalid configuration arguments.");
 		return -EINVAL;
@@ -664,11 +663,11 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
 			/* get translated pctype value in fd pctype register */
 			pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(
 				hw, I40E_GLQF_FD_PCTYPES(
-				(int)i40e_flowtype_to_pctype(
+				(int)i40e_flowtype_to_pctype(pf->adapter,
 				conf->flex_mask[i].flow_type)));
 		} else
-			pctype = i40e_flowtype_to_pctype(
-				conf->flex_mask[i].flow_type);
+			pctype = i40e_flowtype_to_pctype(pf->adapter,
+							 conf->flex_mask[i].flow_type);
 
 		i40e_set_flex_mask_on_pctype(pf, pctype, &conf->flex_mask[i]);
 	}
@@ -1100,7 +1099,8 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
 		return -ENOTSUP;
 	}
 
-	if (!I40E_VALID_FLOW(filter->input.flow_type)) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, filter->input.flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
 	}
@@ -1141,12 +1141,8 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
 	if (hw->mac.type == I40E_MAC_X722) {
 		/* get translated pctype value in fd pctype register */
 		pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(
-			hw, I40E_GLQF_FD_PCTYPES(
-			(int)i40e_flowtype_to_pctype(
-			filter->input.flow_type)));
-	} else
-		pctype = i40e_flowtype_to_pctype(filter->input.flow_type);
-
+			hw, I40E_GLQF_FD_PCTYPES((int)pctype));
+	}
 	ret = i40e_fdir_filter_programming(pf, pctype, filter, add);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, "fdir programming fails for PCTYPE(%u).",
@@ -1384,7 +1380,6 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
 {
 	struct i40e_fdir_flex_mask *mask;
 	struct rte_eth_fdir_flex_mask *ptr = flex_mask;
-	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
 	uint16_t flow_type;
 	uint8_t i, j;
 	uint16_t off_bytes, mask_tmp;
@@ -1393,14 +1388,11 @@ i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,
 	     i <= I40E_FILTER_PCTYPE_L2_PAYLOAD;
 	     i++) {
 		mask =  &pf->fdir.flex_mask[i];
-		if (hw->mac.type == I40E_MAC_X722) {
-			if (!I40E_VALID_PCTYPE_X722((enum i40e_filter_pctype)i))
-				continue;
-		} else {
-			if (!I40E_VALID_PCTYPE((enum i40e_filter_pctype)i))
-				continue;
-		}
-		flow_type = i40e_pctype_to_flowtype((enum i40e_filter_pctype)i);
+		flow_type = i40e_pctype_to_flowtype(pf->adapter,
+						    (enum i40e_filter_pctype)i);
+		if (flow_type == RTE_ETH_FLOW_UNKNOWN)
+			continue;
+
 		for (j = 0; j < I40E_FDIR_MAX_FLEXWORD_NUM; j++) {
 			if (mask->word_mask & I40E_FLEX_WORD_MASK(j)) {
 				ptr->mask[j * sizeof(uint16_t)] = UINT8_MAX;
diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c
index b92719a..5d8afc6 100644
--- a/drivers/net/i40e/i40e_flow.c
+++ b/drivers/net/i40e/i40e_flow.c
@@ -2776,8 +2776,9 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev,
 		}
 	}
 
-	pctype = i40e_flowtype_to_pctype(flow_type);
-	if (pctype == 0 || pctype > I40E_FILTER_PCTYPE_L2_PAYLOAD) {
+	pctype = i40e_flowtype_to_pctype(pf->adapter, flow_type);
+	if (pctype == I40E_FILTER_PCTYPE_INVALID ||
+	    pctype > I40E_FILTER_PCTYPE_L2_PAYLOAD) {
 		rte_flow_error_set(error, EINVAL,
 				   RTE_FLOW_ERROR_TYPE_ITEM, item,
 				   "Unsupported flow type");
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 3a7b68e..0c8ad00 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -2943,6 +2943,63 @@ i40e_set_default_ptype_table(struct rte_eth_dev *dev)
 		ad->ptype_tbl[i] = i40e_get_default_pkt_type(i);
 }
 
+void __attribute__((cold))
+i40e_set_default_pctype_table(struct rte_eth_dev *dev)
+{
+	struct i40e_adapter *ad = I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	int i;
+
+	for (i = 0; i < I40E_FLOW_TYPE_MAX; i++)
+		ad->pctypes_tbl[i] = 0ULL;
+	ad->flow_types_mask = 0ULL;
+	ad->pctypes_mask = 0ULL;
+
+	ad->pctypes_tbl[RTE_ETH_FLOW_FRAG_IPV4] =
+				(1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_SCTP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_OTHER] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER);
+	ad->pctypes_tbl[RTE_ETH_FLOW_FRAG_IPV6] =
+				(1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_SCTP] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP);
+	ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_OTHER] =
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER);
+	ad->pctypes_tbl[RTE_ETH_FLOW_L2_PAYLOAD] =
+				(1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD);
+
+	if (hw->mac.type == I40E_MAC_X722) {
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_UDP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV4_TCP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_UDP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP);
+		ad->pctypes_tbl[RTE_ETH_FLOW_NONFRAG_IPV6_TCP] |=
+				(1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK);
+	}
+
+	for (i = 0; i < I40E_FLOW_TYPE_MAX; i++) {
+		if (ad->pctypes_tbl[i])
+			ad->flow_types_mask |= (1ULL << i);
+		ad->pctypes_mask |= ad->pctypes_tbl[i];
+	}
+}
+
 /* Stubs needed for linkage when CONFIG_RTE_I40E_INC_VECTOR is set to 'n' */
 int __attribute__((weak))
 i40e_rx_vec_dev_conf_condition_check(struct rte_eth_dev __rte_unused *dev)
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index 20084d6..2a58ced 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -255,6 +255,7 @@ void i40e_set_tx_function_flag(struct rte_eth_dev *dev,
 			       struct i40e_tx_queue *txq);
 void i40e_set_tx_function(struct rte_eth_dev *dev);
 void i40e_set_default_ptype_table(struct rte_eth_dev *dev);
+void i40e_set_default_pctype_table(struct rte_eth_dev *dev);
 
 /* For each value it means, datasheet of hardware can tell more details
  *
-- 
2.5.5

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v6] ethdev: add return code to rte_eth_stats_reset()
    2017-09-19 17:14  0%   ` Ferruh Yigit
@ 2017-09-20 14:11  3%   ` David C Harton
  1 sibling, 0 replies; 200+ results
From: David C Harton @ 2017-09-20 14:11 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, David Harton

From: David Harton <dharton@cisco.com>

Some devices do not support reset of eth stats.  An application may
need to know not to clear shadow stats if the device cannot.

rte_eth_stats_reset is updated to provide a return code to share
whether the device supports reset or not.

Signed-off-by: David Harton <dharton@cisco.com>
---

v6:
* removed duplicated entry on rel_notes

v5:
* squashed doc patch
* moved rel_note change from ABI to API section

v4:
* commented return values

v3:
* overcame noob errors and figured out patch challenged

v2:
* fixed soft tab issue inserted while moving changes

 doc/guides/rel_notes/release_17_11.rst | 6 ++++++
 lib/librte_ether/rte_ethdev.c          | 8 +++++---
 lib/librte_ether/rte_ethdev.h          | 6 +++++-
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 22df4fd..9b77c31 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -110,6 +110,12 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* **Modified the return type of rte_eth_stats_reset.**
+
+  Changed return type of ``rte_eth_stats_reset`` from ``void`` to ``int``
+  so the caller may know whether a device supports the operation or not
+  and if the operation was carried out.
+
 * **Modified the vlan_offload_set_t function prototype in the ethdev library.**
 
   Changed the function prototype of ``vlan_offload_set_t``.  The return value
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 05e52b8..f0f1775 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1341,17 +1341,19 @@ rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
 	return 0;
 }
 
-void
+int
 rte_eth_stats_reset(uint8_t port_id)
 {
 	struct rte_eth_dev *dev;
 
-	RTE_ETH_VALID_PORTID_OR_RET(port_id);
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	dev = &rte_eth_devices[port_id];
 
-	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->stats_reset);
+	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_reset, -ENOTSUP);
 	(*dev->dev_ops->stats_reset)(dev);
 	dev->data->rx_mbuf_alloc_failed = 0;
+
+	return 0;
 }
 
 static int
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 7254fd0..9110725 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -2246,8 +2246,12 @@ int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats);
  *
  * @param port_id
  *   The port identifier of the Ethernet device.
+ * @return
+ *   - (0) if device notified to reset stats.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-ENODEV) if *port_id* invalid.
  */
-void rte_eth_stats_reset(uint8_t port_id);
+int rte_eth_stats_reset(uint8_t port_id);
 
 /**
  * Retrieve names of extended statistics of an Ethernet device.
-- 
2.10.3.dirty

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v5] ethdev: add return code to rte_eth_stats_reset()
  2017-09-19 17:14  0%   ` Ferruh Yigit
@ 2017-09-20 14:01  0%     ` David Harton (dharton)
  2017-09-20 16:55  0%       ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: David Harton (dharton) @ 2017-09-20 14:01 UTC (permalink / raw)
  To: Ferruh Yigit, thomas; +Cc: dev



> -----Original Message-----
> From: Ferruh Yigit [mailto:ferruh.yigit@intel.com]
> 
> On 9/1/2017 3:26 AM, David Harton wrote:
> > Some devices do not support reset of eth stats.  An application may
> > need to know not to clear shadow stats if the device cannot.
> >
> > rte_eth_stats_reset is updated to provide a return code to share
> > whether the device supports reset or not.
> >
> > Signed-off-by: David Harton <dharton@cisco.com>
> > ---
> >
> > v5:
> > * squashed doc patch
> > * moved rel_note change from ABI to API section
> >
> > v4:
> > * commented return values
> >
> > v3:
> > * overcame noob errors and figured out patch challenged
> >
> > v2:
> > * fixed soft tab issue inserted while moving changes
> >
> >  doc/guides/rel_notes/release_17_11.rst | 13 +++++++++++++
> >  lib/librte_ether/rte_ethdev.c          |  8 +++++---
> >  lib/librte_ether/rte_ethdev.h          |  6 +++++-
> >  3 files changed, 23 insertions(+), 4 deletions(-)
> >
> > diff --git a/doc/guides/rel_notes/release_17_11.rst
> > b/doc/guides/rel_notes/release_17_11.rst
> > index 22df4fd..6282667 100644
> > --- a/doc/guides/rel_notes/release_17_11.rst
> > +++ b/doc/guides/rel_notes/release_17_11.rst
> > @@ -110,6 +110,19 @@ API Changes
> >     Also, make sure to start the actual text at the margin.
> >     =========================================================
> >
> > +* **Modified the return type of rte_eth_stats_reset.**
> > +
> > +  Changed return type of ``rte_eth_stats_reset`` from ``void`` to
> > + ``int``  so the caller may know whether a device supports the
> > + operation or not  and if the operation was carried out.
> > +
> 
> > +* **Modified the vlan_offload_set_t function prototype in the ethdev
> > +library.**
> > +
> > +  Changed the function prototype of ``vlan_offload_set_t``.  The
> > + return value  has been changed from ``void`` to ``int`` so the
> > + caller to knows whether  the backing device supports the operation
> > + or if the operation was  successfully performed.
> > +
> 
> Is this addition to the document related to this patch?

Good catch.  No. :(

I must have mishandled the rebase I did to update this patch.  V6 coming.  
Would be great if you could re-ACK afterwards so this one can move.

Thanks,
Dave

> 
> >  * **Modified the vlan_offload_set_t function prototype in the ethdev
> > library.**
> >
> >    Changed the function prototype of ``vlan_offload_set_t``.  The
> > return value diff --git a/lib/librte_ether/rte_ethdev.c
> > b/lib/librte_ether/rte_ethdev.c index 05e52b8..f0f1775 100644
> > --- a/lib/librte_ether/rte_ethdev.c
> > +++ b/lib/librte_ether/rte_ethdev.c
> > @@ -1341,17 +1341,19 @@ struct rte_eth_dev *
> >  	return 0;
> >  }
> >
> > -void
> > +int
> >  rte_eth_stats_reset(uint8_t port_id)
> >  {
> >  	struct rte_eth_dev *dev;
> >
> > -	RTE_ETH_VALID_PORTID_OR_RET(port_id);
> > +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> >  	dev = &rte_eth_devices[port_id];
> >
> > -	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->stats_reset);
> > +	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_reset, -ENOTSUP);
> >  	(*dev->dev_ops->stats_reset)(dev);
> >  	dev->data->rx_mbuf_alloc_failed = 0;
> > +
> > +	return 0;
> >  }
> >
> >  static int
> > diff --git a/lib/librte_ether/rte_ethdev.h
> > b/lib/librte_ether/rte_ethdev.h index 7254fd0..9110725 100644
> > --- a/lib/librte_ether/rte_ethdev.h
> > +++ b/lib/librte_ether/rte_ethdev.h
> > @@ -2246,8 +2246,12 @@ int rte_eth_tx_queue_setup(uint8_t port_id,
> uint16_t tx_queue_id,
> >   *
> >   * @param port_id
> >   *   The port identifier of the Ethernet device.
> > + * @return
> > + *   - (0) if device notified to reset stats.
> > + *   - (-ENOTSUP) if hardware doesn't support.
> > + *   - (-ENODEV) if *port_id* invalid.
> >   */
> > -void rte_eth_stats_reset(uint8_t port_id);
> > +int rte_eth_stats_reset(uint8_t port_id);
> >
> >  /**
> >   * Retrieve names of extended statistics of an Ethernet device.
> >


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 5/5] eventdev: bump library version
  2017-09-20 13:35  4%   ` [dpdk-dev] [PATCH v5 0/5] Harry van Haaren
  2017-09-20 13:36  3%     ` [dpdk-dev] [PATCH v5 4/5] eventdev: add device started attribute Harry van Haaren
@ 2017-09-20 13:36  4%     ` Harry van Haaren
  1 sibling, 0 replies; 200+ results
From: Harry van Haaren @ 2017-09-20 13:36 UTC (permalink / raw)
  To: dev; +Cc: jerin.jacob, Harry van Haaren

This commit bumps the library version to refect the ABI change
caused by removing the individual rte_event_port_count, queue_count,
and other get functions. These functions are superseded by the
get-attribute style API, which allows fetching values without API/ABI
changes.

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst | 2 +-
 lib/librte_eventdev/Makefile           | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 170f4f9..c09b1a1 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -152,7 +152,7 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_distributor.so.1
      librte_eal.so.5
      librte_ethdev.so.7
-     librte_eventdev.so.2
+   + librte_eventdev.so.3
      librte_gro.so.1
      librte_hash.so.2
      librte_ip_frag.so.1
diff --git a/lib/librte_eventdev/Makefile b/lib/librte_eventdev/Makefile
index 410578a..7d73ca9 100644
--- a/lib/librte_eventdev/Makefile
+++ b/lib/librte_eventdev/Makefile
@@ -34,7 +34,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
 LIB = librte_eventdev.a
 
 # library version
-LIBABIVER := 2
+LIBABIVER := 3
 
 # build flags
 CFLAGS += -O3
-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v5 4/5] eventdev: add device started attribute
  2017-09-20 13:35  4%   ` [dpdk-dev] [PATCH v5 0/5] Harry van Haaren
@ 2017-09-20 13:36  3%     ` Harry van Haaren
  2017-09-20 13:36  4%     ` [dpdk-dev] [PATCH v5 5/5] eventdev: bump library version Harry van Haaren
  1 sibling, 0 replies; 200+ results
From: Harry van Haaren @ 2017-09-20 13:36 UTC (permalink / raw)
  To: dev; +Cc: jerin.jacob, Harry van Haaren

This commit adds an attribute to the eventdev, allowing applications
to retrieve if the eventdev is running or stopped. Note that no API
or ABI changes were required in adding the statistic, and code changes
are minimal.

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
---
 lib/librte_eventdev/rte_eventdev.c | 3 +++
 lib/librte_eventdev/rte_eventdev.h | 4 ++++
 2 files changed, 7 insertions(+)

diff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/librte_eventdev/rte_eventdev.c
index 73e1df0..480b26e 100644
--- a/lib/librte_eventdev/rte_eventdev.c
+++ b/lib/librte_eventdev/rte_eventdev.c
@@ -740,6 +740,9 @@ rte_event_dev_attr_get(uint8_t dev_id, uint32_t attr_id,
 	case RTE_EVENT_DEV_ATTR_QUEUE_COUNT:
 		*attr_value = dev->data->nb_queues;
 		break;
+	case RTE_EVENT_DEV_ATTR_STARTED:
+		*attr_value = dev->data->dev_started;
+		break;
 	default:
 		return -EINVAL;
 	}
diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h
index 3fd447a..1b629fc 100644
--- a/lib/librte_eventdev/rte_eventdev.h
+++ b/lib/librte_eventdev/rte_eventdev.h
@@ -407,6 +407,10 @@ rte_event_dev_info_get(uint8_t dev_id, struct rte_event_dev_info *dev_info);
  * The count of queues.
  */
 #define RTE_EVENT_DEV_ATTR_QUEUE_COUNT 1
+/**
+ * The status of the device, zero for stopped, non-zero for started.
+ */
+#define RTE_EVENT_DEV_ATTR_STARTED 2
 
 /**
  * Get an attribute from a device.
-- 
2.7.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v5 0/5]
  2017-09-14 16:08  4% ` [dpdk-dev] [PATCH v4 " Harry van Haaren
                     ` (2 preceding siblings ...)
  2017-09-15 12:33  0%   ` Jerin Jacob
@ 2017-09-20 13:35  4%   ` Harry van Haaren
  2017-09-20 13:36  3%     ` [dpdk-dev] [PATCH v5 4/5] eventdev: add device started attribute Harry van Haaren
  2017-09-20 13:36  4%     ` [dpdk-dev] [PATCH v5 5/5] eventdev: bump library version Harry van Haaren
  3 siblings, 2 replies; 200+ results
From: Harry van Haaren @ 2017-09-20 13:35 UTC (permalink / raw)
  To: dev; +Cc: jerin.jacob, Harry van Haaren

This patchset refactors the eventdev API to be more flexible
and capable. In particular, the API is capable of returning an
error value if an invalid device, port or attribute ID is passed
in, which was not possible with the previous APIs.

The implementation of this patchset is based on a v1 patch[1],
and after some discussion this API was seen as the best solution.

In terms of flexibility, the attribute id allows addition of new
common eventdev layer attributes without breaking ABI or adding
new functions. Note that these attributes are not data-path, and
that PMDs should continue to use the xstats API for reporting any
unique PMD statistics that are available.

Regarding API/ABI compatibility, I have removed the functions from
the .map files - please review the .map file changes for ABI issues
carefully.

The last patch of this series adds a started attribute to the device,
allowing the application to query if a device is currently running.

-Harry

[1] http://dpdk.org/dev/patchwork/patch/27152/

---

v5:
- Bump library version of Eventdev (Jerin)
  - http://dpdk.org/ml/archives/dev/2017-September/075551.html

v4:
- Rework based on review by Jerin
  - default: cases into switches
  - Remove old functions from .map file
  - Remove /* out */ parameters
  - Rework header file definitions to match logical order
- Rework patch split
  - Cleaner removal of queue_count() function

v3:
- Fix checkpatch issues... somehow I broke my checkpatch script :/

v2:
- New APIs design based on discussion of initial patch.


Harry van Haaren (5):
  eventdev: add port attribute function
  eventdev: add dev attribute get function
  eventdev: add queue attribute function
  eventdev: add device started attribute
  eventdev: bump library version

 doc/guides/rel_notes/release_17_11.rst       |   2 +-
 lib/librte_eventdev/Makefile                 |   2 +-
 lib/librte_eventdev/rte_eventdev.c           |  97 ++++++++++++------
 lib/librte_eventdev/rte_eventdev.h           | 115 +++++++++++----------
 lib/librte_eventdev/rte_eventdev_version.map |  14 ++-
 test/test/test_eventdev.c                    | 132 +++++++++++++++++++------
 test/test/test_eventdev_octeontx.c           | 143 ++++++++++++++++++++-------
 7 files changed, 347 insertions(+), 158 deletions(-)

-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 05/11] lib/librte_mbuf: add security crypto flags and mbuf fields
  @ 2017-09-20  9:43  4%     ` Olivier MATZ
  0 siblings, 0 replies; 200+ results
From: Olivier MATZ @ 2017-09-20  9:43 UTC (permalink / raw)
  To: Boris Pismenny
  Cc: declan.doherty, pablo.de.lara.guarch, hemant.agrawal,
	radu.nicolau, Aviad Yehezkel, Thomas Monjalon, sandeep.malik,
	jerin.jacob, Akhil Goyal, dev, Nélio Laranjeiro

Hi Boris,

Some comments inline.

On Mon, Sep 18, 2017 at 07:54:03AM +0000, Boris Pismenny wrote:
> Hi Olivier,
> 
> On 9/14/2017 11:27 AM, Akhil Goyal wrote:
> > 
> > From: Boris Pismenny <borisp@mellanox.com>
> > 
> > add security crypto flags and update mbuf fields to support
> > IPsec crypto offload for transmitted packets, and to indicate
> > crypto result for received packets.
> > 
> > Signed-off-by: Aviad Yehezkel <aviadye@mellanox.com>
> > Signed-off-by: Boris Pismenny <borisp@mellanox.com>
> > Signed-off-by: Radu Nicolau <radu.nicolau@intel.com>
> > ---
> >  lib/librte_mbuf/rte_mbuf.c |  6 ++++++
> >  lib/librte_mbuf/rte_mbuf.h | 32 +++++++++++++++++++++++++++++---
> >  2 files changed, 35 insertions(+), 3 deletions(-)
> > 
> > diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
> > index 26a62b8..bbd42a6 100644
> > --- a/lib/librte_mbuf/rte_mbuf.c
> > +++ b/lib/librte_mbuf/rte_mbuf.c
> > @@ -323,6 +323,8 @@ const char *rte_get_rx_ol_flag_name(uint64_t mask)
> >  	case PKT_RX_QINQ_STRIPPED: return "PKT_RX_QINQ_STRIPPED";
> >  	case PKT_RX_LRO: return "PKT_RX_LRO";
> >  	case PKT_RX_TIMESTAMP: return "PKT_RX_TIMESTAMP";
> > +	case PKT_RX_SEC_OFFLOAD: return "PKT_RX_SECURITY_OFFLOAD";
> > +	case PKT_RX_SEC_OFFLOAD_FAILED: return
> > "PKT_RX_SECURITY_OFFLOAD_FAILED";

I think the string should be the same than the macro.
(SEC vs SECURITY)

> ...
> > +/**
> > + * Indicate that security offload processing was applied on the RX packet.
> > + */
> > +#define PKT_RX_SEC_OFFLOAD		(1ULL << 18)
> > +
> > +/**
> > + * Indicate that security offload processing failed on the RX packet.
> > + */
> > +#define PKT_RX_SEC_OFFLOAD_FAILED  (1ULL << 19)
> > +

If the presence of these flags implies that some fields are
valid (ex: inner_esp_next_proto), it should be specified in
the API comments.

> ...
> > @@ -456,8 +472,18 @@ struct rte_mbuf {
> >  			uint32_t l3_type:4; /**< (Outer) L3 type. */
> >  			uint32_t l4_type:4; /**< (Outer) L4 type. */
> >  			uint32_t tun_type:4; /**< Tunnel type. */
> > -			uint32_t inner_l2_type:4; /**< Inner L2 type. */
> > -			uint32_t inner_l3_type:4; /**< Inner L3 type. */
> > +			RTE_STD_C11
> > +			union {
> > +				uint8_t inner_esp_next_proto;
> > +
> > +				__extension__
> > +				struct {
> > +					uint8_t inner_l2_type:4;
> > +					/**< Inner L2 type. */
> > +					uint8_t inner_l3_type:4;
> > +					/**< Inner L3 type. */
> > +				};
> > +			};
> >  			uint32_t inner_l4_type:4; /**< Inner L4 type. */
> >  		};
> >  	};

The (quite useless) API comment is missing. I think we should
have it for consistency.

Can you please also detail in which conditions inner_esp_next_proto is
valid, and when inner_l2/l3_type is valid?

> What do you think about this change to mbuf?
> 
> It doesn't increase the mbuf size and it replaces some fields that have no meaning
> in IPsec encapsulations (inner L2 and L3) with a meaningful field of the correct
> size (inner_esp_next_proto - 8 bytes).
> 
> We later use this for IPsec offload on both Tx and Rx to indicate the packet format.
> 

Strangely, the abi-checker script finds an abi change. To me, it looks
like a false positive of abi-checker. The html output says:

  Field inner_l2_type has been removed from this type.
  Applications will access incorrect memory when attempting to access this field.

  Field inner_l3_type has been removed from this type.
  Applications will access incorrect memory when attempting to access this field.

  [−] affected symbols: 3 (15.8%)
  __rte_pktmbuf_read ( struct rte_mbuf const* m, uint32_t off, uint32_t len, void* buf ) @@ DPDK_16.11
  Field 'm.unnamed1.unnamed0' in 1st parameter 'm' (pointer) has type 'anon-struct-rte_mbuf.h-454'.
  rte_mbuf_sanity_check ( struct rte_mbuf const* m, int is_header ) @@ DPDK_2.0
  Field 'm.unnamed1.unnamed0' in 1st parameter 'm' (pointer) has type 'anon-struct-rte_mbuf.h-454'.
  rte_pktmbuf_dump ( FILE* f, struct rte_mbuf const* m, unsigned int dump_len ) @@ DPDK_2.0
  Field 'm.unnamed1.unnamed0' in 2nd parameter 'm' (pointer) has type 'anon-struct-rte_mbuf.h-454'.

If someone has a better explanation :)
You can reproduce it with the following patch:
http://dpdk.org/dev/patchwork/patch/28985/


However, with pahole, we can check that the sizes/offsets are
correct and also, the following test program behaves as expected:

  #include <stdio.h>
  #include <stdint.h>
  #include <string.h>
  #include <unistd.h>
  #include <sys/mman.h>
  
  struct mbuf1 {
  	union {
  		uint32_t           packet_type;
  		struct {
  			uint32_t   l2_type:4;
  			uint32_t   l3_type:4;
  			uint32_t   l4_type:4;
  			uint32_t   tun_type:4;
  			uint32_t   inner_l2_type:4;
  			uint32_t   inner_l3_type:4;
  			uint32_t   inner_l4_type:4;
  		};
  	};
  };
  
  struct mbuf2 {
  	union {
  		uint32_t           packet_type;
  		struct {
  			uint32_t   l2_type:4;
  			uint32_t   l3_type:4;
  			uint32_t   l4_type:4;
  			uint32_t   tun_type:4;
  			union {
  				uint8_t inner_esp_next_proto;
  				struct {
  					uint8_t inner_l2_type:4;
  					uint8_t inner_l3_type:4;
  				};
  			};
  			uint32_t   inner_l4_type:4;
  		};
  	};
  };
  
  int main(void)
  {
  	struct mbuf1 m1;
  	struct mbuf2 m2;
  
  	m1.l2_type = 0x1;
  	m1.l3_type = 0x2;
  	m1.l4_type = 0x3;
  	m1.tun_type = 0x4;
  	m1.inner_l2_type = 0x5;
  	m1.inner_l3_type = 0x6;
  	m1.inner_l4_type = 0x7;
  
  	printf("m1.l2_type=%x\n", m1.l2_type);
  	printf("m1.l3_type=%x\n", m1.l3_type);
  	printf("m1.l4_type=%x\n", m1.l4_type);
  	printf("m1.tun_type=%x\n", m1.tun_type);
  	printf("m1.inner_l2_type=%x\n", m1.inner_l2_type);
  	printf("m1.inner_l3_type=%x\n", m1.inner_l3_type);
  	printf("m1.inner_l4_type=%x\n", m1.inner_l4_type);
  
  	memcpy(&m2, &m1, sizeof(m2));
  
  	printf("m2.l2_type=%x\n", m2.l2_type);
  	printf("m2.l3_type=%x\n", m2.l3_type);
  	printf("m2.l4_type=%x\n", m2.l4_type);
  	printf("m2.tun_type=%x\n", m2.tun_type);
  	printf("m2.inner_l2_type=%x\n", m2.inner_l2_type);
  	printf("m2.inner_l3_type=%x\n", m2.inner_l3_type);
  	printf("m2.inner_l4_type=%x\n", m2.inner_l4_type);
  
  	return 0;
  }


Olivier

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v4] devtools: rework abi checker script
    2017-09-13 15:00  9%   ` Neil Horman
@ 2017-09-20  9:12 27%   ` Olivier Matz
  2017-09-21 15:40  7%     ` Neil Horman
  2017-10-05  7:53 27%     ` [dpdk-dev] [PATCH v5] " Olivier Matz
  1 sibling, 2 replies; 200+ results
From: Olivier Matz @ 2017-09-20  9:12 UTC (permalink / raw)
  To: dev, nhorman, bruce.richardson

The initial version of the script had some limitations:
- cannot work on a non-clean workspace
- environment variables are not documented
- no compilation log in case of failure
- return success even it abi is incompatible

This patch addresses these issues and rework the code.

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---

v3->v4:
- clarify logs on incompatible abi
- log when an error returned an error
- [really] fix the report path
- log the output of make config in the proper file

v2->v3:
- fix when not launched from dpdk root dir
- use "-Og -Wno-error" instead of "-O0"
- fix typo in commit log

v1->v2:
- use /usr/bin/env to find bash (which is required)
- fix displayed path to html reports
- reword help for -f option


 devtools/validate-abi.sh | 397 ++++++++++++++++++++++++-----------------------
 1 file changed, 205 insertions(+), 192 deletions(-)

diff --git a/devtools/validate-abi.sh b/devtools/validate-abi.sh
index 0accc99b1..8caf43e83 100755
--- a/devtools/validate-abi.sh
+++ b/devtools/validate-abi.sh
@@ -1,7 +1,8 @@
-#!/bin/sh
+#!/usr/bin/env bash
 #   BSD LICENSE
 #
 #   Copyright(c) 2015 Neil Horman. All rights reserved.
+#   Copyright(c) 2017 6WIND S.A.
 #   All rights reserved.
 #
 #   Redistribution and use in source and binary forms, with or without
@@ -27,236 +28,248 @@
 #   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-TAG1=$1
-TAG2=$2
-TARGET=$3
-ABI_DIR=`mktemp -d -p /tmp ABI.XXXXXX`
+set -e
 
-usage() {
-	echo "$0 <REV1> <REV2> <TARGET>"
-}
+abicheck=abi-compliance-checker
+abidump=abi-dumper
+default_dst=abi-check
+default_target=x86_64-native-linuxapp-gcc
 
-log() {
-	local level=$1
-	shift
-	echo "$*"
+# trap on error
+err_report() {
+    echo "$0: error at line $1"
 }
+trap 'err_report $LINENO' ERR
 
-validate_tags() {
+print_usage () {
+	cat <<- END_OF_HELP
+	$(basename $0) [options] <rev1> <rev2>
 
-	if [ -z "$HASH1" ]
-	then
-		echo "invalid revision: $TAG1"
-		return
-	fi
-	if [ -z "$HASH2" ]
-	then
-		echo "invalid revision: $TAG2"
-		return
-	fi
+	This script compares the ABI of 2 git revisions of the current
+	workspace. The output is a html report and a compilation log.
+
+	The objective is to make sure that applications built against
+	DSOs from the first revision can still run when executed using
+	the DSOs built from the second revision.
+
+	<rev1> and <rev2> are git commit id or tags.
+
+	Options:
+	  -h		show this help
+	  -j <num>	enable parallel compilation with <num> threads
+	  -v		show compilation logs on the console
+	  -d <dir>	change working directory (default is ${default_dst})
+	  -t <target>	the dpdk target to use (default is ${default_target})
+	  -f		overwrite existing files in destination directory
+
+	The script returns 0 on success, or the value of last failing
+	call of ${abicheck} (incompatible abi or the tool has run with errors).
+	The errors returned by ${abidump} are ignored.
+
+	END_OF_HELP
 }
 
-validate_args() {
-	if [ -z "$TAG1" ]
-	then
-		echo "Must Specify REV1"
-		return
-	fi
-	if [ -z "$TAG2" ]
-	then
-		echo "Must Specify REV2"
-		return
-	fi
-	if [ -z "$TARGET" ]
-	then
-		echo "Must Specify a build target"
+# log in the file, and on stdout if verbose
+# $1: level string
+# $2: string to be logged
+log() {
+	echo "$1: $2"
+	if [ "${verbose}" != "true" ]; then
+		echo "$1: $2" >&3
 	fi
 }
 
+# launch a command and log it, taking care of surrounding spaces with quotes
+cmd() {
+	local i s whitespace ret
+	s=""
+	whitespace="[[:space:]]"
+	for i in "$@"; do
+		if [[ $i =~ $whitespace ]]; then
+			i=\"$i\"
+		fi
+		if [ -z "$s" ]; then
+			s="$i"
+		else
+			s="$s $i"
+		fi
+	done
+
+	ret=0
+	log "CMD" "$s"
+	"$@" || ret=$?
+	if [ "$ret" != "0" ]; then
+		log "CMD" "previous command returned $ret"
+	fi
+
+	return $ret
+}
 
-cleanup_and_exit() {
-	rm -rf $ABI_DIR
-	git checkout $CURRENT_BRANCH
-	exit $1
+# redirect or copy stderr/stdout to a file
+# the syntax is unfamiliar, but it makes the rest of the
+# code easier to read, avoiding the use of pipes
+set_log_file() {
+	# save original stdout and stderr in fd 3 and 4
+	exec 3>&1
+	exec 4>&2
+	# create a new fd 5 that send to a file
+	exec 5> >(cat > $1)
+	# send stdout and stderr to fd 5
+	if [ "${verbose}" = "true" ]; then
+		exec 1> >(tee /dev/fd/5 >&3)
+		exec 2> >(tee /dev/fd/5 >&4)
+	else
+		exec 1>&5
+		exec 2>&5
+	fi
 }
 
 # Make sure we configure SHARED libraries
 # Also turn off IGB and KNI as those require kernel headers to build
 fixup_config() {
-	sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" config/defconfig_$TARGET
-	sed -i -e"$ a\CONFIG_RTE_NEXT_ABI=n" config/defconfig_$TARGET
-	sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET
-	sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" config/defconfig_$TARGET
-	sed -i -e"$ a\CONFIG_RTE_KNI_KMOD=n" config/defconfig_$TARGET
+	local conf=config/defconfig_$target
+	cmd sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" $conf
+	cmd sed -i -e"$ a\CONFIG_RTE_NEXT_ABI=n" $conf
+	cmd sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" $conf
+	cmd sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" $conf
+	cmd sed -i -e"$ a\CONFIG_RTE_KNI_KMOD=n" $conf
 }
 
-###########################################
-#START
-############################################
+# build dpdk for the given tag and dump abi
+# $1: hash of the revision
+gen_abi() {
+	local i
+
+	cmd git clone ${dpdkroot} ${dst}/${1}
+	cmd cd ${dst}/${1}
+
+	log "INFO" "Checking out version ${1} of the dpdk"
+	# Move to the old version of the tree
+	cmd git checkout ${1}
+
+	fixup_config
+
+	# Now configure the build
+	log "INFO" "Configuring DPDK ${1}"
+	cmd make config T=$target O=$target
+
+	# Checking abi compliance relies on using the dwarf information in
+	# the shared objects. Build with -g to include them.
+	log "INFO" "Building DPDK ${1}. This might take a moment"
+	cmd make -j$parallel O=$target V=1 EXTRA_CFLAGS="-g -Og -Wno-error" \
+	    EXTRA_LDFLAGS="-g" || log "INFO" "The build failed"
+
+	# Move to the lib directory
+	cmd cd ${PWD}/$target/lib
+	log "INFO" "Collecting ABI information for ${1}"
+	for i in *.so; do
+		[ -e "$i" ] || break
+		cmd $abidump ${i} -o $dst/${1}/${i}.dump -lver ${1} || true
+		# hack to ignore empty SymbolsInfo section (no public ABI)
+		if grep -q "'SymbolInfo' => {}," $dst/${1}/${i}.dump \
+				2> /dev/null; then
+			log "INFO" "${i} has no public ABI, remove dump file"
+			cmd rm -f $dst/${1}/${i}.dump
+		fi
+	done
+}
 
-#trap on ctrl-c to clean up
-trap cleanup_and_exit SIGINT
+verbose=false
+parallel=1
+dst=${default_dst}
+target=${default_target}
+force=0
+while getopts j:vd:t:fh ARG ; do
+	case $ARG in
+		j ) parallel=$OPTARG ;;
+		v ) verbose=true ;;
+		d ) dst=$OPTARG ;;
+		t ) target=$OPTARG ;;
+		f ) force=1 ;;
+		h ) print_usage ; exit 0 ;;
+		? ) print_usage ; exit 1 ;;
+	esac
+done
+shift $(($OPTIND - 1))
 
-if [ -z "$DPDK_MAKE_JOBS" ]
-then
-	# This counts the number of cpus on the system
-	if [ -e /usr/bin/lscpu ]
-	then
-		DPDK_MAKE_JOBS=`lscpu -p=cpu | grep -v "#" | wc -l`
-	else
-		DPDK_MAKE_JOBS=1
-	fi
+if [ $# != 2 ]; then
+	print_usage
+	exit 1
 fi
 
-#Save the current branch
-CURRENT_BRANCH=`git branch | grep \* | cut -d' ' -f2`
+tag1=$1
+tag2=$2
 
-if [ -z "$CURRENT_BRANCH" ]
-then
-	CURRENT_BRANCH=`git log --pretty=format:%H HEAD~1..HEAD`
-fi
+# convert path to absolute
+case "${dst}" in
+	/*) ;;
+	*) dst=${PWD}/${dst} ;;
+esac
+dpdkroot=$(readlink -e $(dirname $0)/..)
 
-if [ -n "$VERBOSE" ]
-then
-	export VERBOSE=/dev/stdout
-else
-	export VERBOSE=/dev/null
+if [ -e "${dst}" -a "$force" = 0 ]; then
+	echo "The ${dst} directory is not empty. Remove it, use another"
+	echo "one (-d <dir>), or force overriding (-f)"
+	exit 1
 fi
 
-# Validate that we have all the arguments we need
-res=$(validate_args)
-if [ -n "$res" ]
-then
-	echo $res
-	usage
-	cleanup_and_exit 1
-fi
+rm -rf ${dst}
+mkdir -p ${dst}
+set_log_file ${dst}/abi-check.log
+log "INFO" "Logs available in ${dst}/abi-check.log"
 
-HASH1=$(git show -s --format=%H "$TAG1" -- 2> /dev/null | tail -1)
-HASH2=$(git show -s --format=%H "$TAG2" -- 2> /dev/null | tail -1)
+command -v ${abicheck} || log "INFO" "Can't find ${abicheck} utility"
+command -v ${abidump} || log "INFO" "Can't find ${abidump} utility"
 
-# Make sure our tags exist
-res=$(validate_tags)
-if [ -n "$res" ]
-then
-	echo $res
-	cleanup_and_exit 1
-fi
+hash1=$(git show -s --format=%h "$tag1" -- 2> /dev/null | tail -1)
+hash2=$(git show -s --format=%h "$tag2" -- 2> /dev/null | tail -1)
 
 # Make hashes available in output for non-local reference
-TAG1="$TAG1 ($HASH1)"
-TAG2="$TAG2 ($HASH2)"
-
-ABICHECK=`which abi-compliance-checker 2>/dev/null`
-if [ $? -ne 0 ]
-then
-	log "INFO" "Can't find abi-compliance-checker utility"
-	cleanup_and_exit 1
-fi
-
-ABIDUMP=`which abi-dumper 2>/dev/null`
-if [ $? -ne 0 ]
-then
-	log "INFO" "Can't find abi-dumper utility"
-	cleanup_and_exit 1
-fi
+tag1="$tag1 ($hash1)"
+tag2="$tag2 ($hash2)"
 
-log "INFO" "We're going to check and make sure that applications built"
-log "INFO" "against DPDK DSOs from version $TAG1 will still run when executed"
-log "INFO" "against DPDK DSOs built from version $TAG2."
-log "INFO" ""
-
-# Check to make sure we have a clean tree
-git status | grep -q clean
-if [ $? -ne 0 ]
-then
-	log "WARN" "Working directory not clean, aborting"
-	cleanup_and_exit 1
+if [ "$hash1" = "$hash2" ]; then
+	log "ERROR" "$tag1 and $tag2 are the same revisions"
+	exit 1
 fi
 
-# Move to the root of the git tree
-cd $(dirname $0)/..
+cmd mkdir -p ${dst}
 
-log "INFO" "Checking out version $TAG1 of the dpdk"
-# Move to the old version of the tree
-git checkout $HASH1
+# dump abi for each revision
+gen_abi ${hash1}
+gen_abi ${hash2}
 
-fixup_config
+# compare the abi dumps
+cmd cd ${dst}
+ret=0
+list=""
+for i in ${hash2}/*.dump; do
+	name=`basename $i`
+	libname=${name%.dump}
 
-# Checking abi compliance relies on using the dwarf information in
-# The shared objects.  Thats only included in the DSO's if we build
-# with -g
-export EXTRA_CFLAGS="$EXTRA_CFLAGS -g -O0"
-export EXTRA_LDFLAGS="$EXTRA_LDFLAGS -g"
-
-# Now configure the build
-log "INFO" "Configuring DPDK $TAG1"
-make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
-
-log "INFO" "Building DPDK $TAG1. This might take a moment"
-make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1
-
-if [ $? -ne 0 ]
-then
-	log "INFO" "THE BUILD FAILED.  ABORTING"
-	cleanup_and_exit 1
-fi
+	if [ ! -f ${hash1}/$name ]; then
+		log "INFO" "$NAME does not exist in $tag1. skipping..."
+		continue
+	fi
 
-# Move to the lib directory
-cd $TARGET/lib
-log "INFO" "COLLECTING ABI INFORMATION FOR $TAG1"
-for i in `ls *.so`
-do
-	$ABIDUMP $i -o $ABI_DIR/$i-ABI-0.dump -lver $HASH1
+	local_ret=0
+	cmd $abicheck -l $libname \
+	    -old ${hash1}/$name -new ${hash2}/$name || local_ret=$?
+	if [ $local_ret != 0 ]; then
+		log "NOTICE" "$abicheck returned $local_ret"
+		ret=$local_ret
+		list="$list $libname"
+	fi
 done
-cd ../..
-
-# Now clean the tree, checkout the second tag, and rebuild
-git clean -f -d
-git reset --hard
-# Move to the new version of the tree
-log "INFO" "Checking out version $TAG2 of the dpdk"
-git checkout $HASH2
-
-fixup_config
-
-# Now configure the build
-log "INFO" "Configuring DPDK $TAG2"
-make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
-
-log "INFO" "Building DPDK $TAG2. This might take a moment"
-make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1
 
-if [ $? -ne 0 ]
-then
-	log "INFO" "THE BUILD FAILED.  ABORTING"
-	cleanup_and_exit 1
+if [ $ret != 0 ]; then
+	log "NOTICE" "ABI may be incompatible, check reports/logs for details."
+	log "NOTICE" "Incompatible list: $list"
+else
+	log "NOTICE" "No error detected, ABI is compatible."
 fi
 
-cd $TARGET/lib
-log "INFO" "COLLECTING ABI INFORMATION FOR $TAG2"
-for i in `ls *.so`
-do
-	$ABIDUMP $i -o $ABI_DIR/$i-ABI-1.dump -lver $HASH2
-done
-cd ../..
-
-# Start comparison of ABI dumps
-for i in `ls $ABI_DIR/*-1.dump`
-do
-	NEWNAME=`basename $i`
-	OLDNAME=`basename $i | sed -e"s/1.dump/0.dump/"`
-	LIBNAME=`basename $i | sed -e"s/-ABI-1.dump//"`
-
-	if [ ! -f $ABI_DIR/$OLDNAME ]
-	then
-		log "INFO" "$OLDNAME DOES NOT EXIST IN $TAG1. SKIPPING..."
-	fi
-
-	#compare the abi dumps
-	$ABICHECK -l $LIBNAME -old $ABI_DIR/$OLDNAME -new $ABI_DIR/$NEWNAME
-done
+log "INFO" "Logs are in ${dst}/abi-check.log"
+log "INFO" "HTML reports are in ${dst}/compat_reports directory"
 
-git reset --hard
-log "INFO" "ABI CHECK COMPLETE.  REPORTS ARE IN compat_report directory"
-cleanup_and_exit 0
+exit $ret
-- 
2.11.0

^ permalink raw reply	[relevance 27%]

* Re: [dpdk-dev] [PATCH v5] ethdev: add return code to rte_eth_stats_reset()
  @ 2017-09-19 17:14  0%   ` Ferruh Yigit
  2017-09-20 14:01  0%     ` David Harton (dharton)
  2017-09-20 14:11  3%   ` [dpdk-dev] [PATCH v6] " David C Harton
  1 sibling, 1 reply; 200+ results
From: Ferruh Yigit @ 2017-09-19 17:14 UTC (permalink / raw)
  To: David Harton, thomas; +Cc: dev

On 9/1/2017 3:26 AM, David Harton wrote:
> Some devices do not support reset of eth stats.  An application may
> need to know not to clear shadow stats if the device cannot.
> 
> rte_eth_stats_reset is updated to provide a return code to share
> whether the device supports reset or not.
> 
> Signed-off-by: David Harton <dharton@cisco.com>
> ---
> 
> v5:
> * squashed doc patch
> * moved rel_note change from ABI to API section
> 
> v4:
> * commented return values
> 
> v3:
> * overcame noob errors and figured out patch challenged
> 
> v2:
> * fixed soft tab issue inserted while moving changes
> 
>  doc/guides/rel_notes/release_17_11.rst | 13 +++++++++++++
>  lib/librte_ether/rte_ethdev.c          |  8 +++++---
>  lib/librte_ether/rte_ethdev.h          |  6 +++++-
>  3 files changed, 23 insertions(+), 4 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
> index 22df4fd..6282667 100644
> --- a/doc/guides/rel_notes/release_17_11.rst
> +++ b/doc/guides/rel_notes/release_17_11.rst
> @@ -110,6 +110,19 @@ API Changes
>     Also, make sure to start the actual text at the margin.
>     =========================================================
>  
> +* **Modified the return type of rte_eth_stats_reset.**
> +
> +  Changed return type of ``rte_eth_stats_reset`` from ``void`` to ``int``
> +  so the caller may know whether a device supports the operation or not
> +  and if the operation was carried out.
> +

> +* **Modified the vlan_offload_set_t function prototype in the ethdev library.**
> +
> +  Changed the function prototype of ``vlan_offload_set_t``.  The return value
> +  has been changed from ``void`` to ``int`` so the caller to knows whether
> +  the backing device supports the operation or if the operation was
> +  successfully performed.
> +

Is this addition to the document related to this patch?

>  * **Modified the vlan_offload_set_t function prototype in the ethdev library.**
>  
>    Changed the function prototype of ``vlan_offload_set_t``.  The return value
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index 05e52b8..f0f1775 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -1341,17 +1341,19 @@ struct rte_eth_dev *
>  	return 0;
>  }
>  
> -void
> +int
>  rte_eth_stats_reset(uint8_t port_id)
>  {
>  	struct rte_eth_dev *dev;
>  
> -	RTE_ETH_VALID_PORTID_OR_RET(port_id);
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>  	dev = &rte_eth_devices[port_id];
>  
> -	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->stats_reset);
> +	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_reset, -ENOTSUP);
>  	(*dev->dev_ops->stats_reset)(dev);
>  	dev->data->rx_mbuf_alloc_failed = 0;
> +
> +	return 0;
>  }
>  
>  static int
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> index 7254fd0..9110725 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -2246,8 +2246,12 @@ int rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
>   *
>   * @param port_id
>   *   The port identifier of the Ethernet device.
> + * @return
> + *   - (0) if device notified to reset stats.
> + *   - (-ENOTSUP) if hardware doesn't support.
> + *   - (-ENODEV) if *port_id* invalid.
>   */
> -void rte_eth_stats_reset(uint8_t port_id);
> +int rte_eth_stats_reset(uint8_t port_id);
>  
>  /**
>   * Retrieve names of extended statistics of an Ethernet device.
> 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v4 3/3] doc: update timer lib docs
  @ 2017-09-19 17:02  3%     ` Erik Gabriel Carrillo
  0 siblings, 0 replies; 200+ results
From: Erik Gabriel Carrillo @ 2017-09-19 17:02 UTC (permalink / raw)
  To: rsanford; +Cc: dev, john.mcnamara, Erik Carrillo

From: Erik Carrillo <erik.g.carrillo@intel.com>

This change updates the timer library documentation to
reflect a change to the organization of the skiplists
in the implementation.

Signed-off-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
v4:
* Made changes suggested by John Mcnamara[1].

[1] http://dpdk.org/ml/archives/dev/2017-September/075819.html

 doc/guides/prog_guide/timer_lib.rst    | 31 +++++++++++++++++++------------
 doc/guides/rel_notes/release_17_11.rst |  7 +++++++
 2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/doc/guides/prog_guide/timer_lib.rst b/doc/guides/prog_guide/timer_lib.rst
index f437417..e1f64ac 100644
--- a/doc/guides/prog_guide/timer_lib.rst
+++ b/doc/guides/prog_guide/timer_lib.rst
@@ -1,5 +1,5 @@
 ..  BSD LICENSE
-    Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+    Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
     All rights reserved.
 
     Redistribution and use in source and binary forms, with or without
@@ -53,16 +53,19 @@ Refer to the `callout manual <http://www.daemon-systems.org/man/callout.9.html>`
 Implementation Details
 ----------------------
 
-Timers are tracked on a per-lcore basis,
-with all pending timers for a core being maintained in order of timer expiry in a skiplist data structure.
-The skiplist used has ten levels and each entry in the table appears in each level with probability ¼^level.
+Timers are tracked on a per-lcore basis, with all pending timers for a core being maintained in order of timer
+expiry in either a single skiplist data structure or an array of skiplists, depending on whether
+the lcore has been configured for multiple pending lists. Multiple pending lists can be enabled when an
+application experiences contention for a single list for that lcore; skiplists corresponding to every other
+enabled lcore will be created.
+Each skiplist data structure has ten levels and each entry in the table appears in each level with probability 0.25^level.
 This means that all entries are present in level 0, 1 in every 4 entries is present at level 1,
 one in every 16 at level 2 and so on up to level 9.
 This means that adding and removing entries from the timer list for a core can be done in log(n) time,
 up to 4^10 entries, that is, approximately 1,000,000 timers per lcore.
 
 A timer structure contains a special field called status,
-which is a union of a timer state (stopped, pending, running, config) and an owner (lcore id).
+which is a union of a timer state (stopped, pending, running, config), an index (lcore id), and an owner (lcore id).
 Depending on the timer state, we know if a timer is present in a list or not:
 
 *   STOPPED: no owner, not in a list
@@ -75,19 +78,23 @@ Depending on the timer state, we know if a timer is present in a list or not:
 
 Resetting or stopping a timer while it is in a CONFIG or RUNNING state is not allowed.
 When modifying the state of a timer,
-a Compare And Swap instruction should be used to guarantee that the status (state+owner) is modified atomically.
-
-Inside the rte_timer_manage() function,
-the skiplist is used as a regular list by iterating along the level 0 list, which contains all timer entries,
-until an entry which has not yet expired has been encountered.
-To improve performance in the case where there are entries in the timer list but none of those timers have yet expired,
+a Compare And Swap instruction should be used to guarantee that the status (state+index+owner) is modified atomically.
+
+Inside the rte_timer_manage() function, the timer lists are processed.
+If multiple pending lists have been enabled for an lcore, then each skiplist will
+be traversed sequentially, and run lists will be broken out and then processed.
+If multiple pending lists are not enabled for an lcore, then only a single skiplist will be traversed.
+A skiplist is used as a regular list by iterating along the level
+0 list, which contains all timer entries, until an entry which has not yet expired has been encountered.
+To improve performance in the case where there are entries in a skiplist but none of those timers have yet expired,
 the expiry time of the first list entry is maintained within the per-core timer list structure itself.
 On 64-bit platforms, this value can be checked without the need to take a lock on the overall structure.
 (Since expiry times are maintained as 64-bit values,
 a check on the value cannot be done on 32-bit platforms without using either a compare-and-swap (CAS) instruction or using a lock,
 so this additional check is skipped in favor of checking as normal once the lock has been taken.)
 On both 64-bit and 32-bit platforms,
-a call to rte_timer_manage() returns without taking a lock in the case where the timer list for the calling core is empty.
+rte_timer_manage() can either return or continue on to an lcore's next skiplist without taking a lock in the case where a timer list is empty,
+depending on whether or not the lcore has multiple pending lists.
 
 Use Cases
 ---------
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 170f4f9..4683cbe 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -110,6 +110,13 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* **Updated timer library.**
+
+  The timer library has been updated; it can now support multiple timer lists
+  per lcore where it previously only had one.  This functionality is off by
+  default but can be enabled in cases where contention for a single list is
+  an issue with the new function ``rte_timer_subsystem_set_multi_pendlists()``.
+
 
 ABI Changes
 -----------
-- 
2.6.4

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2 5/5] doc: remove dpdk iova aware notice
  @ 2017-09-19 13:38  0%     ` Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2017-09-19 13:38 UTC (permalink / raw)
  To: Santosh Shukla, dev; +Cc: thomas, jerin.jacob, hemant.agrawal, olivier.matz



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Santosh Shukla
> Sent: Tuesday, September 5, 2017 11:31 AM
> To: dev@dpdk.org
> Cc: thomas@monjalon.net; jerin.jacob@caviumnetworks.com;
> hemant.agrawal@nxp.com; olivier.matz@6wind.com; Santosh Shukla
> <santosh.shukla@caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v2 5/5] doc: remove dpdk iova aware notice
> 
> Removed dpdk iova aware ABI deprecation notice, and updated ABI change
> details in release_17.11.rst.
> 
> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>

Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3] devtools: rework abi checker script
  2017-09-13 15:00  9%   ` Neil Horman
@ 2017-09-19  9:15  7%     ` Olivier MATZ
  0 siblings, 0 replies; 200+ results
From: Olivier MATZ @ 2017-09-19  9:15 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev, bruce.richardson

Hi Neil,

On Wed, Sep 13, 2017 at 11:00:13AM -0400, Neil Horman wrote:
> On Mon, Sep 11, 2017 at 10:46:35AM +0200, Olivier Matz wrote:
> > The initial version of the script had some limitations:
> > - cannot work on a non-clean workspace
> > - environment variables are not documented
> > - no compilation log in case of failure
> > - return success even it abi is incompatible
> > 
> > This patch addresses these issues and rework the code.
> > 
> > Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> > ---
> > 
> > v2->v3:
> > - fix when not launched from dpdk root dir
> > - use "-Og -Wno-error" instead of "-O0"
> > - fix typo in commit log
> > 
> > v1->v2:
> > - use /usr/bin/env to find bash (which is required)
> > - fix displayed path to html reports
> > - reword help for -f option
> > 
> >  devtools/validate-abi.sh | 392 ++++++++++++++++++++++++-----------------------
> >  1 file changed, 200 insertions(+), 192 deletions(-)
> > 
> 
> This is alot closer, I think theres just a little wierdness left.  When running
> this checker script, the end of the log shows this:
> 
> CMD: abi-compliance-checker -l librte_vhost.so -old /home/nhorman/git/dpdk/devtools/abi-check/222555480/librte_vhost.so.dump -new /home/nhorman/git/dpdk/devtools/abi-check/02657b4ad/librte_vhost.so.dump
> NOTICE: At least one call to abi-compliance-checker returned an error.
> NOTICE: ABI may be incompatible, please check logs for details.
> NOTICE: Incompatible list:  librte_cryptodev.so librte_eal.so librte_efd.so librte_ethdev.so librte_eventdev.so librte_hash.so librte_pdump.so librte_pmd_crypto_scheduler.so librte_pmd_ring.so librte_ring.so
> 
> Which I think is something of a false positive.  The line:
> NOTICE: At least one call to abi-compliance-checker returned an error.
>
> I think is emitted simply because abi-compilance-checker returns non-zero and
> reports that error if it finds any incompatibilities.  I'm not sure we want to
> flag that as an error per se.  It gives the impression something has gone wrong,
> rather than correctly identifying that there are incompatibilities.
> 
> Though on the other hand, maybe we do want to set that red flag so people look
> at what the incompatibilities are.  As I say it out loud, perhaps that
> preferable.

Yes, I can remove this line
"At least one call to abi-compliance-checker returned an error."
which does not give a lot of info anyway.

While reproducing the issue, I also realized that the report path
was not preoperly fixed. So I'm sending a v4 with these fixes.

Thanks,
Olivier

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH 04/12] vdev: move to drivers/bus
  2017-09-18 11:47  0%       ` De Lara Guarch, Pablo
@ 2017-09-19  6:01  0%         ` Tan, Jianfeng
  0 siblings, 0 replies; 200+ results
From: Tan, Jianfeng @ 2017-09-19  6:01 UTC (permalink / raw)
  To: De Lara Guarch, Pablo, Gaëtan Rivet
  Cc: dev, Richardson, Bruce, Ananyev, Konstantin, thomas, yliu,
	maxime.coquelin, mtetsuyah, Yigit, Ferruh

Hi Pablo

> -----Original Message-----
> From: De Lara Guarch, Pablo
> Sent: Monday, September 18, 2017 7:48 PM
> To: Tan, Jianfeng; Gaëtan Rivet
> Cc: dev@dpdk.org; Richardson, Bruce; Ananyev, Konstantin;
> thomas@monjalon.net; yliu@fridaylinux.org; maxime.coquelin@redhat.com;
> mtetsuyah@gmail.com; Yigit, Ferruh
> Subject: RE: [dpdk-dev] [PATCH 04/12] vdev: move to drivers/bus
> 
> 
...
> > > Let's say the cryptodev lib must be updated.
> > > I understand the need to move rte_cryptodev_vdev.h outside
> > > librte_cryptodev, but I guess this exposes the vdev bus to ABI / API
> > > instability due to a third-party subsystem?
> >
> > Thank you for bringing up this question. I really don't want to move
> > these crypto-specific files into bus/vdev/. It's just some helper
> > functions to be called by crypto vdev drivers. And what's more, the only
> > dependence on vdev is that the API rte_cryptodev_vdev_pmd_init() has a
> > parameter of struct rte_vdev_device, which is totally not necessary, as
> > it only needs a struct rte_device parameter.
> >
> > In all, I'd prefer to change this specific API and move those
> > crypto-specific files back to lib/librte_crypto (just like ether dev and
> > eventdev); but it needs API change announcement.
> >
> > Any thoughts?
> 
> I think we should keep this API in cryptodev. It looks strange to have some
> Crypto specific functions in a file like this that should contain generic vdev
> functions.

OK, I'll try to put those files back, see if possible to add a dependency on librte_bus_vdev in lib_cryptodev.

...
> 
> Btw, for future times, strip out all the text where there are no comments,
> so it is easier to review by others.

Thank you for the reminder.

Thanks,
Jianfeng 

> 
> Thanks,
> Pablo

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] net/nfp: remove firmware ABI check
  @ 2017-09-18 19:00  4% ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-09-18 19:00 UTC (permalink / raw)
  To: Alejandro Lucero, dev

On 9/11/2017 2:44 PM, Alejandro Lucero wrote:
> Link speed is not advertised in old firmwares. However, it is safe
> to remove the check because reading NFP_NET_CFG_STS returns 0 in
> those cases.
> 
> Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>

Applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v1 4/4] doc: remove dpdk iova aware notice
  @ 2017-09-18 18:44  0%   ` Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2017-09-18 18:44 UTC (permalink / raw)
  To: Santosh Shukla, dev; +Cc: olivier.matz, thomas, jerin.jacob, hemant.agrawal



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Santosh Shukla
> Sent: Monday, August 14, 2017 4:16 PM
> To: dev@dpdk.org
> Cc: olivier.matz@6wind.com; thomas@monjalon.net;
> jerin.jacob@caviumnetworks.com; hemant.agrawal@nxp.com; Santosh Shukla
> <santosh.shukla@caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v1 4/4] doc: remove dpdk iova aware notice
> 
> Removed dpdk iova aware ABI deprecation notice, and updated ABI change
> details in release_17.11.rst.
> 
> Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>

Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2] doc: add note on hardware support deprecation
  2017-09-15 13:41 21% [dpdk-dev] [PATCH] doc: add note on hardware support deprecation Bruce Richardson
  2017-09-18 13:49  0% ` Mcnamara, John
@ 2017-09-18 13:59 21% ` Bruce Richardson
  2017-10-13 20:46  0%   ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Bruce Richardson @ 2017-09-18 13:59 UTC (permalink / raw)
  To: john.mcnamara, dev; +Cc: Bruce Richardson

Following agreement at the DPDK Technical Board meeting [1], the policy
that hardware support deprecation should be treated as though it were an
ABI break needs to be documented in the contributors guide.

[1] http://dpdk.org/ml/archives/dev/2017-September/074613.html

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
V2: change HW abbreviation to "hardware" and reduce indentation of note to
    3 spaces only.

 doc/guides/contributing/versioning.rst | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/doc/guides/contributing/versioning.rst b/doc/guides/contributing/versioning.rst
index 8aaf370da..2ec561647 100644
--- a/doc/guides/contributing/versioning.rst
+++ b/doc/guides/contributing/versioning.rst
@@ -18,6 +18,8 @@ General Guidelines
 #. The modification of symbols can generally be managed with versioning
 #. The removal of symbols generally is an ABI break and requires bumping of the
    LIBABIVER macro
+#. Updates to the minimum hardware requirements, which drop support for hardware which
+   was previously supported, should be treated as an ABI change.
 
 What is an ABI
 --------------
@@ -77,6 +79,13 @@ for significant reasons, such as performance enhancements. ABI breakage due to
 changes such as reorganizing public structure fields for aesthetic or
 readability purposes should be avoided.
 
+.. note::
+
+   Updates to the minimum hardware requirements, which drop support for hardware
+   which was previously supported, should be treated as an ABI change, and
+   follow the relevant deprecation policy procedures as above: 3 acks and
+   announcement at least one release in advance.
+
 Examples of Deprecation Notices
 -------------------------------
 
-- 
2.13.5

^ permalink raw reply	[relevance 21%]

* Re: [dpdk-dev] [PATCH] doc: add note on hardware support deprecation
  2017-09-15 13:41 21% [dpdk-dev] [PATCH] doc: add note on hardware support deprecation Bruce Richardson
@ 2017-09-18 13:49  0% ` Mcnamara, John
  2017-09-18 13:59 21% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
  1 sibling, 0 replies; 200+ results
From: Mcnamara, John @ 2017-09-18 13:49 UTC (permalink / raw)
  To: Richardson, Bruce, dev; +Cc: Richardson, Bruce



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
> Sent: Friday, September 15, 2017 2:41 PM
> To: dev@dpdk.org
> Cc: Richardson, Bruce <bruce.richardson@intel.com>
> Subject: [dpdk-dev] [PATCH] doc: add note on hardware support deprecation
> 
> Following agreement at the DPDK Technical Board meeting [1], the policy
> that hardware support deprecation should be treated as though it were an
> ABI break needs to be documented in the contributors guide.
> 
> [1] http://dpdk.org/ml/archives/dev/2017-September/074613.html
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

> ...

> 
> +.. note::
> +
> +        Updates to the minimum HW requirements, which drop support for


s/HW/hardware

The next only needs to be indented 3 spaces to align with the directive.

Apart from that:

Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 04/12] vdev: move to drivers/bus
  @ 2017-09-18 11:47  0%       ` De Lara Guarch, Pablo
  2017-09-19  6:01  0%         ` Tan, Jianfeng
  0 siblings, 1 reply; 200+ results
From: De Lara Guarch, Pablo @ 2017-09-18 11:47 UTC (permalink / raw)
  To: Tan, Jianfeng, Gaëtan Rivet
  Cc: dev, Richardson, Bruce, Ananyev, Konstantin, thomas, yliu,
	maxime.coquelin, mtetsuyah, Yigit, Ferruh



> -----Original Message-----
> From: Tan, Jianfeng
> Sent: Tuesday, August 29, 2017 11:48 PM
> To: Gaëtan Rivet <gaetan.rivet@6wind.com>
> Cc: dev@dpdk.org; Richardson, Bruce <bruce.richardson@intel.com>;
> Ananyev, Konstantin <konstantin.ananyev@intel.com>; De Lara Guarch,
> Pablo <pablo.de.lara.guarch@intel.com>; thomas@monjalon.net;
> yliu@fridaylinux.org; maxime.coquelin@redhat.com;
> mtetsuyah@gmail.com; Yigit, Ferruh <ferruh.yigit@intel.com>
> Subject: Re: [dpdk-dev] [PATCH 04/12] vdev: move to drivers/bus
> 
> Hi Gaetan,
> 
> 
> On 8/29/2017 6:04 AM, Gaëtan Rivet wrote:
> > On Fri, Aug 25, 2017 at 09:40:44AM +0000, Jianfeng Tan wrote:
> >> Move the vdev bus from lib/librte_eal to drivers/bus.
> >>
> >> As the crypto vdev helper function refers to data structure
> >> in rte_vdev.h, so we move those helper function into drivers/bus
> >> too.
> >>
> >> Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
> >> ---
> >>   config/common_base                        |   5 +
> >>   drivers/bus/Makefile                      |   2 +
> >>   drivers/bus/vdev/Makefile                 |  57 +++++
> >>   drivers/bus/vdev/rte_bus_vdev_version.map |  10 +
> >>   drivers/bus/vdev/rte_cryptodev_vdev.c     | 154 ++++++++++++++
> >>   drivers/bus/vdev/rte_cryptodev_vdev.h     | 100 +++++++++
> >>   drivers/bus/vdev/rte_vdev.h               | 153 +++++++++++++
> >>   drivers/bus/vdev/vdev.c                   | 342
> ++++++++++++++++++++++++++++++
> >>   lib/librte_cryptodev/Makefile             |   2 -
> >>   lib/librte_cryptodev/rte_cryptodev_vdev.c | 154 --------------
> >>   lib/librte_cryptodev/rte_cryptodev_vdev.h | 100 ---------
> >>   lib/librte_eal/bsdapp/eal/Makefile        |   1 -
> >>   lib/librte_eal/common/Makefile            |   2 +-
> >>   lib/librte_eal/common/eal_common_vdev.c   | 342 --------------------------
> ----
> >>   lib/librte_eal/common/include/rte_dev.h   |  24 +--
> >>   lib/librte_eal/common/include/rte_vdev.h  | 131 ------------
> >>   lib/librte_eal/linuxapp/eal/Makefile      |   1 -
> >>   mk/rte.app.mk                             |   1 +
> >>   18 files changed, 826 insertions(+), 755 deletions(-)
> >>   create mode 100644 drivers/bus/vdev/Makefile
> >>   create mode 100644 drivers/bus/vdev/rte_bus_vdev_version.map
> >>   create mode 100644 drivers/bus/vdev/rte_cryptodev_vdev.c
> >>   create mode 100644 drivers/bus/vdev/rte_cryptodev_vdev.h
> >>   create mode 100644 drivers/bus/vdev/rte_vdev.h
> >>   create mode 100644 drivers/bus/vdev/vdev.c
> >>   delete mode 100644 lib/librte_cryptodev/rte_cryptodev_vdev.c
> >>   delete mode 100644 lib/librte_cryptodev/rte_cryptodev_vdev.h
> >>   delete mode 100644 lib/librte_eal/common/eal_common_vdev.c
> >>   delete mode 100644 lib/librte_eal/common/include/rte_vdev.h
> >>
> >> diff --git a/config/common_base b/config/common_base
> >> index 5e97a08..aca0994 100644
> >> --- a/config/common_base
> >> +++ b/config/common_base
> >> @@ -750,3 +750,8 @@ CONFIG_RTE_APP_CRYPTO_PERF=y
> >>   # Compile the eventdev application
> >>   #
> >>   CONFIG_RTE_APP_EVENTDEV=y
> >> +
> >> +#
> >> +# Compile the vdev bus
> >> +#
> >> +CONFIG_RTE_LIBRTE_VDEV=y
> > Why not CONFIG_RTE_LIBRTE_VDEV_BUS?
> > It would seem more consistent.
> 
> Was trying to be consistent with the directory name, drivers/bus/vdev.
> Do you think that directory should also be renamed?
> 
> >
> >> diff --git a/drivers/bus/Makefile b/drivers/bus/Makefile
> >> index 0224214..9b6d45e 100644
> >> --- a/drivers/bus/Makefile
> >> +++ b/drivers/bus/Makefile
> >> @@ -35,4 +35,6 @@ core-libs := librte_eal librte_mbuf librte_mempool
> librte_ring librte_ether
> >>   DIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc
> >>   DEPDIRS-fslmc = $(core-libs)
> >>
> >> +DIRS-$(CONFIG_RTE_LIBRTE_VDEV) += vdev
> >> +
> >>   include $(RTE_SDK)/mk/rte.subdir.mk
> >> diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile
> >> new file mode 100644
> >> index 0000000..30c4813
> >> --- /dev/null
> >> +++ b/drivers/bus/vdev/Makefile
> >> @@ -0,0 +1,57 @@
> >> +#   BSD LICENSE
> >> +#
> >> +#   Copyright(c) 2017 Intel Corporation. All rights reserved.
> >> +#   All rights reserved.
> >> +#
> >> +#   Redistribution and use in source and binary forms, with or without
> >> +#   modification, are permitted provided that the following conditions
> >> +#   are met:
> >> +#
> >> +#     * Redistributions of source code must retain the above copyright
> >> +#       notice, this list of conditions and the following disclaimer.
> >> +#     * Redistributions in binary form must reproduce the above
> copyright
> >> +#       notice, this list of conditions and the following disclaimer in
> >> +#       the documentation and/or other materials provided with the
> >> +#       distribution.
> >> +#     * Neither the name of Intel Corporation nor the names of its
> >> +#       contributors may be used to endorse or promote products
> derived
> >> +#       from this software without specific prior written permission.
> >> +#
> >> +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> >> +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
> BUT NOT
> >> +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS FOR
> >> +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> >> +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> >> +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> BUT NOT
> >> +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> LOSS OF USE,
> >> +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> AND ON ANY
> >> +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> TORT
> >> +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> OF THE USE
> >> +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> >> +
> >> +include $(RTE_SDK)/mk/rte.vars.mk
> >> +
> >> +#
> >> +# library name
> >> +#
> >> +LIB = librte_bus_vdev.a
> >> +
> >> +CFLAGS += -O3
> >> +CFLAGS += $(WERROR_FLAGS)
> >> +
> >> +# versioning export map
> >> +EXPORT_MAP := rte_bus_vdev_version.map
> >> +
> >> +# library version
> >> +LIBABIVER := 1
> >> +
> >> +SRCS-y += vdev.c
> >> +SRCS-y += rte_cryptodev_vdev.c
> >> +
> >> +#
> >> +# Export include files
> >> +#
> >> +SYMLINK-y-include += rte_vdev.h
> >> +SYMLINK-y-include += rte_cryptodev_vdev.h
> >> +
> > Let's say the cryptodev lib must be updated.
> > I understand the need to move rte_cryptodev_vdev.h outside
> > librte_cryptodev, but I guess this exposes the vdev bus to ABI / API
> > instability due to a third-party subsystem?
> 
> Thank you for bringing up this question. I really don't want to move
> these crypto-specific files into bus/vdev/. It's just some helper
> functions to be called by crypto vdev drivers. And what's more, the only
> dependence on vdev is that the API rte_cryptodev_vdev_pmd_init() has a
> parameter of struct rte_vdev_device, which is totally not necessary, as
> it only needs a struct rte_device parameter.
> 
> In all, I'd prefer to change this specific API and move those
> crypto-specific files back to lib/librte_crypto (just like ether dev and
> eventdev); but it needs API change announcement.
> 
> Any thoughts?

I think we should keep this API in cryptodev. It looks strange to have some
Crypto specific functions in a file like this that should contain generic vdev
functions.

> 
> >
> > I did something somewhat similar for PCI:
> > http://dpdk.org/ml/archives/dev/2017-August/073525.html
> 
> I prefer your way to move those things to specific dev folder.
> 
> >
> > I don't know which solution is best, but something certainly needs to be
> > done.
> >
> > ---
> >
> > Beside the `why`, about the `how`: shouldn't this file compilation and
> > symlink be conditioned to CONFIG_RTE_LIBRTE_CRYPTODEV=y?
> >
> > i.e.: SYMLINK-$(CONFIG_RTE_LIBRTE_CRYPTODEV)-include +=
> rte_cryptodev_vdev.h
> 
> Yes, make sense.
> 
> Thanks,
> Jianfeng
> 
> 

Btw, for future times, strip out all the text where there are no comments,
so it is easier to review by others.

Thanks,
Pablo

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2 14/14] doc: add notes on EAL PCI API update
  @ 2017-09-18  9:31  4%   ` Gaetan Rivet
    1 sibling, 0 replies; 200+ results
From: Gaetan Rivet @ 2017-09-18  9:31 UTC (permalink / raw)
  To: dev; +Cc: Gaetan Rivet

Add a section related to EAL API changes to 17.11 release notes.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
 doc/guides/rel_notes/release_17_11.rst | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8bf91bd..d5546ba 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -130,6 +130,34 @@ API Changes
   * Rework start and stop APIs into ``rte_service_runstate_set``
   * Added API to set runstate of service implementation to indicate readyness
 
+* **PCI bus API moved outside of the EAL**
+
+  The PCI bus previously implemented within the EAL has been moved.
+  A first part has been added as an RTE library providing PCI helpers to
+  parse device locations or other such utilities.
+  A second part consisting in the actual bus driver has been moved to its
+  proper subdirectory, without changing its functionalities.
+
+  As such, several PCI-related functions are not proposed by the EAL anymore:
+
+  * rte_pci_detach
+  * rte_pci_dump
+  * rte_pci_ioport_map
+  * rte_pci_ioport_read
+  * rte_pci_ioport_unmap
+  * rte_pci_ioport_write
+  * rte_pci_map_device
+  * rte_pci_probe
+  * rte_pci_probe_one
+  * rte_pci_read_config
+  * rte_pci_register
+  * rte_pci_scan
+  * rte_pci_unmap_device
+  * rte_pci_unregister
+  * rte_pci_write_config
+
+  These functions are made available either as part of ``librte_pci`` or
+  ``librte_bus_pci``.
 
 ABI Changes
 -----------
-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for ring structure
    2017-09-18  9:16  4% ` Bruce Richardson
  2017-09-18  9:24  4% ` Mcnamara, John
@ 2017-09-18  9:30  4% ` Burakov, Anatoly
  2 siblings, 0 replies; 200+ results
From: Burakov, Anatoly @ 2017-09-18  9:30 UTC (permalink / raw)
  To: Olivier Matz, dev
  Cc: Richardson, Bruce, Mcnamara, John, Verkamp, Daniel, Ananyev, Konstantin

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Olivier Matz
> Sent: Monday, September 11, 2017 2:39 PM
> To: dev@dpdk.org
> Cc: Richardson, Bruce <bruce.richardson@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Verkamp, Daniel
> <daniel.verkamp@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for ring structure
> 
> As discussed on the mailing list, the alignment constraint of the ring structure
> can be relaxed.
> 
> Link: http://dpdk.org/dev/patchwork/patch/25039
> Link: http://dpdk.org/dev/patchwork/patch/26103
> 
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>

Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for ring structure
    2017-09-18  9:16  4% ` Bruce Richardson
@ 2017-09-18  9:24  4% ` Mcnamara, John
  2017-09-18  9:30  4% ` Burakov, Anatoly
  2 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2017-09-18  9:24 UTC (permalink / raw)
  To: Olivier Matz, dev; +Cc: Richardson, Bruce, Verkamp, Daniel, Ananyev, Konstantin



> -----Original Message-----
> From: Olivier Matz [mailto:olivier.matz@6wind.com]
> Sent: Monday, September 11, 2017 2:39 PM
> To: dev@dpdk.org
> Cc: Richardson, Bruce <bruce.richardson@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Verkamp, Daniel <daniel.verkamp@intel.com>;
> Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Subject: [PATCH] doc: announce ABI change for ring structure
> 
> As discussed on the mailing list, the alignment constraint of the ring
> structure can be relaxed.
> 
> Link: http://dpdk.org/dev/patchwork/patch/25039
> Link: http://dpdk.org/dev/patchwork/patch/26103
> 
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>

Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for ring structure
  @ 2017-09-18  9:16  4% ` Bruce Richardson
  2017-09-18  9:24  4% ` Mcnamara, John
  2017-09-18  9:30  4% ` Burakov, Anatoly
  2 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2017-09-18  9:16 UTC (permalink / raw)
  To: Olivier Matz; +Cc: dev, john.mcnamara, daniel.verkamp, konstantin.ananyev

On Mon, Sep 11, 2017 at 03:39:13PM +0200, Olivier Matz wrote:
> As discussed on the mailing list, the alignment constraint of
> the ring structure can be relaxed.
> 
> Link: http://dpdk.org/dev/patchwork/patch/25039
> Link: http://dpdk.org/dev/patchwork/patch/26103
> 
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v4 0/3] ethdev new offloads API
  2017-09-17  6:54  4%   ` [dpdk-dev] [PATCH v4 0/3] " Shahaf Shuler
@ 2017-09-18  7:51  0%     ` Andrew Rybchenko
  2017-09-28 18:54  4%     ` [dpdk-dev] [PATCH v5 " Shahaf Shuler
  1 sibling, 0 replies; 200+ results
From: Andrew Rybchenko @ 2017-09-18  7:51 UTC (permalink / raw)
  To: Shahaf Shuler, thomas, jerin.jacob, konstantin.ananyev; +Cc: dev

On 09/17/2017 09:54 AM, Shahaf Shuler wrote:
> Tx offloads configuration is per queue. Tx offloads are enabled by default,
> and can be disabled using ETH_TXQ_FLAGS_NO* flags.
> This behaviour is not consistent with the Rx side where the Rx offloads
> configuration is per port. Rx offloads are disabled by default and enabled
> according to bit field in rte_eth_rxmode structure.
>
> Moreover, considering more Tx and Rx offloads will be added
> over time, the cost of managing them all inside the PMD will be tremendous,
> as the PMD will need to check the matching for the entire offload set
> for each mbuf it handles.
> In addition, on the current approach each Rx offload added breaks the
> ABI compatibility as it requires to add entries to existing bit-fields.
>   
> The series address above issues by defining a new offloads API.
> In the new API, offloads are divided into per-port and per-queue offloads,
> with a corresponding capability for each.
> The offloads are disabled by default. Each offload can be enabled or
> disabled using the existing DEV_TX_OFFLOADS_* or DEV_RX_OFFLOADS_* flags.
> Such API will enable to easily add or remove offloads, without breaking the
> ABI compatibility.
>
> In order to provide a smooth transition between the APIs the following actions
> were taken:
> *  The old offloads API is kept for the meanwhile.
> *  Helper function which copy from old to new API were added to ethdev,
>     enabling the PMD to support only one of the APIs.

As I understand there is an API to copy from a new to old API as well, 
allowing
applications to use the new API and work fine with PMD which supports an 
old API only.

> Per discussion made on the RFC of this series [1], the integration plan which was
> decided is to do the transition in two phases:
> * ethdev API will move on 17.11.
> * Apps and examples will move on 18.02.
>
> This to enable PMD maintainers sufficient time to adopt the new API.
>
> [1]
> http://dpdk.org/ml/archives/dev/2017-August/072643.html
>
> on v4:
>   - Added another patch for documentation.
>   - Fixed ETH_TXQ_FLAGS_IGNORE flag override.
>   - clarify the description of DEV_TX_OFFLOAD_MBUF_FAST_FREE offload.
>
> on v3:
>   - Introduce the DEV_TX_OFFLOAD_MBUF_FAST_FREE to act as an equivalent
>     for the no refcnt and single mempool flags.
>   - Fix features documentation.
>   - Fix comment style.
>
> on v2:
>   - Taking new approach of dividing offloads into per-queue and per-port one.
>   - Postpone the Tx/Rx public struct renaming to 18.02
>   - squash the helper functions into the Rx/Tx offloads intro patches.
>
> Shahaf Shuler (3):
>    ethdev: introduce Rx queue offloads API
>    ethdev: introduce Tx queue offloads API
>    doc: add details on ethdev offloads API
>
>   doc/guides/nics/features.rst            |  66 +++++---
>   doc/guides/prog_guide/poll_mode_drv.rst |  17 ++
>   lib/librte_ether/rte_ethdev.c           | 223 +++++++++++++++++++++++++--
>   lib/librte_ether/rte_ethdev.h           |  89 ++++++++++-
>   4 files changed, 355 insertions(+), 40 deletions(-)

Series-reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v4 0/3] ethdev new offloads API
  2017-09-13  6:37  4% ` [dpdk-dev] [PATCH v3 " Shahaf Shuler
  2017-09-13  9:10  0%   ` Andrew Rybchenko
@ 2017-09-17  6:54  4%   ` Shahaf Shuler
  2017-09-18  7:51  0%     ` Andrew Rybchenko
  2017-09-28 18:54  4%     ` [dpdk-dev] [PATCH v5 " Shahaf Shuler
  1 sibling, 2 replies; 200+ results
From: Shahaf Shuler @ 2017-09-17  6:54 UTC (permalink / raw)
  To: thomas, jerin.jacob, konstantin.ananyev, arybchenko; +Cc: dev

Tx offloads configuration is per queue. Tx offloads are enabled by default, 
and can be disabled using ETH_TXQ_FLAGS_NO* flags. 
This behaviour is not consistent with the Rx side where the Rx offloads
configuration is per port. Rx offloads are disabled by default and enabled 
according to bit field in rte_eth_rxmode structure.

Moreover, considering more Tx and Rx offloads will be added 
over time, the cost of managing them all inside the PMD will be tremendous,
as the PMD will need to check the matching for the entire offload set 
for each mbuf it handles.
In addition, on the current approach each Rx offload added breaks the
ABI compatibility as it requires to add entries to existing bit-fields.
 
The series address above issues by defining a new offloads API.
In the new API, offloads are divided into per-port and per-queue offloads,
with a corresponding capability for each.
The offloads are disabled by default. Each offload can be enabled or
disabled using the existing DEV_TX_OFFLOADS_* or DEV_RX_OFFLOADS_* flags.
Such API will enable to easily add or remove offloads, without breaking the
ABI compatibility.

In order to provide a smooth transition between the APIs the following actions
were taken:
*  The old offloads API is kept for the meanwhile.
*  Helper function which copy from old to new API were added to ethdev,
   enabling the PMD to support only one of the APIs.

Per discussion made on the RFC of this series [1], the integration plan which was
decided is to do the transition in two phases:
* ethdev API will move on 17.11.
* Apps and examples will move on 18.02.

This to enable PMD maintainers sufficient time to adopt the new API.

[1]
http://dpdk.org/ml/archives/dev/2017-August/072643.html

on v4:
 - Added another patch for documentation.
 - Fixed ETH_TXQ_FLAGS_IGNORE flag override.
 - clarify the description of DEV_TX_OFFLOAD_MBUF_FAST_FREE offload.

on v3:
 - Introduce the DEV_TX_OFFLOAD_MBUF_FAST_FREE to act as an equivalent
   for the no refcnt and single mempool flags.
 - Fix features documentation.
 - Fix comment style.

on v2:
 - Taking new approach of dividing offloads into per-queue and per-port one.
 - Postpone the Tx/Rx public struct renaming to 18.02
 - squash the helper functions into the Rx/Tx offloads intro patches.

Shahaf Shuler (3):
  ethdev: introduce Rx queue offloads API
  ethdev: introduce Tx queue offloads API
  doc: add details on ethdev offloads API

 doc/guides/nics/features.rst            |  66 +++++---
 doc/guides/prog_guide/poll_mode_drv.rst |  17 ++
 lib/librte_ether/rte_ethdev.c           | 223 +++++++++++++++++++++++++--
 lib/librte_ether/rte_ethdev.h           |  89 ++++++++++-
 4 files changed, 355 insertions(+), 40 deletions(-)

-- 
2.12.0

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: add note on hardware support deprecation
@ 2017-09-15 13:41 21% Bruce Richardson
  2017-09-18 13:49  0% ` Mcnamara, John
  2017-09-18 13:59 21% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
  0 siblings, 2 replies; 200+ results
From: Bruce Richardson @ 2017-09-15 13:41 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson

Following agreement at the DPDK Technical Board meeting [1], the policy
that hardware support deprecation should be treated as though it were an
ABI break needs to be documented in the contributors guide.

[1] http://dpdk.org/ml/archives/dev/2017-September/074613.html

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 doc/guides/contributing/versioning.rst | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/doc/guides/contributing/versioning.rst b/doc/guides/contributing/versioning.rst
index 8aaf370da..2ec561647 100644
--- a/doc/guides/contributing/versioning.rst
+++ b/doc/guides/contributing/versioning.rst
@@ -18,6 +18,8 @@ General Guidelines
 #. The modification of symbols can generally be managed with versioning
 #. The removal of symbols generally is an ABI break and requires bumping of the
    LIBABIVER macro
+#. Updates to the minimum HW requirements, which drop support for hardware which
+   was previously supported, should be treated as an ABI change.
 
 What is an ABI
 --------------
@@ -77,6 +79,13 @@ for significant reasons, such as performance enhancements. ABI breakage due to
 changes such as reorganizing public structure fields for aesthetic or
 readability purposes should be avoided.
 
+.. note::
+
+        Updates to the minimum HW requirements, which drop support for hardware
+        which was previously supported, should be treated as an ABI change, and
+        follow the relevant deprecation policy procedures as above: 3 acks and
+        announcement at least one release in advance.
+
 Examples of Deprecation Notices
 -------------------------------
 
-- 
2.13.5

^ permalink raw reply	[relevance 21%]

* Re: [dpdk-dev] [PATCH v4 0/4] eventdev: add attribute based get APIs
  2017-09-14 16:08  4% ` [dpdk-dev] [PATCH v4 " Harry van Haaren
  2017-09-14 16:09  3%   ` [dpdk-dev] [PATCH v4 4/4] eventdev: add device started attribute Harry van Haaren
  2017-09-15  6:14  0%   ` [dpdk-dev] [PATCH v4 0/4] eventdev: add attribute based get APIs Nipun Gupta
@ 2017-09-15 12:33  0%   ` Jerin Jacob
  2017-09-20 13:35  4%   ` [dpdk-dev] [PATCH v5 0/5] Harry van Haaren
  3 siblings, 0 replies; 200+ results
From: Jerin Jacob @ 2017-09-15 12:33 UTC (permalink / raw)
  To: Harry van Haaren; +Cc: dev

-----Original Message-----
> Date: Thu, 14 Sep 2017 17:08:59 +0100
> From: Harry van Haaren <harry.van.haaren@intel.com>
> To: dev@dpdk.org
> CC: jerin.jacob@caviumnetworks.com, Harry van Haaren
>  <harry.van.haaren@intel.com>
> Subject: [PATCH v4 0/4] eventdev: add attribute based get APIs
> X-Mailer: git-send-email 2.7.4
> 
> This patchset refactors the eventdev API to be more flexible
> and capable. In particular, the API is capable of returning an
> error value if an invalid device, port or attribute ID is passed
> in, which was not possible with the previous APIs.
> 
> The implementation of this patchset is based on a v1 patch[1],
> and after some discussion this API was seen as the best solution.
> 
> In terms of flexibility, the attribute id allows addition of new
> common eventdev layer attributes without breaking ABI or adding
> new functions. Note that these attributes are not data-path, and
> that PMDs should continue to use the xstats API for reporting any
> unique PMD statistics that are available.
> 
> Regarding API/ABI compatibility, I have removed the functions from
> the .map files - please review the .map file changes for ABI issues
> carefully.
> 
> The last patch of this series adds a started attribute to the device,
> allowing the application to query if a device is currently running.
> 
> -Harry
> 
> [1] http://dpdk.org/dev/patchwork/patch/27152/
> 
> ---
> 
> v4:
> - Rework based on review by Jerin
>   - default: cases into switches
>   - Remove old functions from .map file
>   - Remove /* out */ parameters
>   - Rework header file definitions to match logical order
> - Rework patch split
>   - Cleaner removal of queue_count() function

The changes looks good.

Since the functions are removed, we need to update .so version.
Please update LIBABIVER(file: lib/librte_eventdev/Makefile) and  update
the release notes

reference to the similar change:
http://dpdk.org/browse/dpdk/commit/?id=945081a76ab0bb481f1d62125aa5b547fcc000bd

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 0/4] eventdev: add attribute based get APIs
  2017-09-14 16:08  4% ` [dpdk-dev] [PATCH v4 " Harry van Haaren
  2017-09-14 16:09  3%   ` [dpdk-dev] [PATCH v4 4/4] eventdev: add device started attribute Harry van Haaren
@ 2017-09-15  6:14  0%   ` Nipun Gupta
  2017-09-15 12:33  0%   ` Jerin Jacob
  2017-09-20 13:35  4%   ` [dpdk-dev] [PATCH v5 0/5] Harry van Haaren
  3 siblings, 0 replies; 200+ results
From: Nipun Gupta @ 2017-09-15  6:14 UTC (permalink / raw)
  To: Harry van Haaren, dev; +Cc: jerin.jacob



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Harry van Haaren
> Sent: Thursday, September 14, 2017 21:39
> To: dev@dpdk.org
> Cc: jerin.jacob@caviumnetworks.com; Harry van Haaren
> <harry.van.haaren@intel.com>
> Subject: [dpdk-dev] [PATCH v4 0/4] eventdev: add attribute based get APIs
> 
> This patchset refactors the eventdev API to be more flexible
> and capable. In particular, the API is capable of returning an
> error value if an invalid device, port or attribute ID is passed
> in, which was not possible with the previous APIs.
> 
> The implementation of this patchset is based on a v1 patch[1],
> and after some discussion this API was seen as the best solution.
> 
> In terms of flexibility, the attribute id allows addition of new
> common eventdev layer attributes without breaking ABI or adding
> new functions. Note that these attributes are not data-path, and
> that PMDs should continue to use the xstats API for reporting any
> unique PMD statistics that are available.
> 
> Regarding API/ABI compatibility, I have removed the functions from
> the .map files - please review the .map file changes for ABI issues
> carefully.
> 
> The last patch of this series adds a started attribute to the device,
> allowing the application to query if a device is currently running.
> 
> -Harry
> 
> [1] http://dpdk.org/dev/patchwork/patch/27152/
> 
> ---
> 
> v4:
> - Rework based on review by Jerin
>   - default: cases into switches
>   - Remove old functions from .map file
>   - Remove /* out */ parameters
>   - Rework header file definitions to match logical order
> - Rework patch split
>   - Cleaner removal of queue_count() function
> 
> v3:
> - Fix checkpatch issues... somehow I broke my checkpatch script :/
> 
> v2:
> - New APIs design based on discussion of initial patch.
> 
> 
> 
> Harry van Haaren (4):
>   eventdev: add port attribute function
>   eventdev: add dev attribute get function
>   eventdev: add queue attribute function
>   eventdev: add device started attribute
> 
>  lib/librte_eventdev/rte_eventdev.c           |  97 ++++++++++++------
>  lib/librte_eventdev/rte_eventdev.h           | 115 +++++++++++----------
>  lib/librte_eventdev/rte_eventdev_version.map |  14 ++-
>  test/test/test_eventdev.c                    | 132 +++++++++++++++++++------
>  test/test/test_eventdev_octeontx.c           | 143 ++++++++++++++++++++-------
>  5 files changed, 345 insertions(+), 156 deletions(-)
> 
> --
> 2.7.4

Changes look good.
Series Acked-by: Nipun Gupta <Nipun.gupta@nxp.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3 1/4] ethdev: increase port_id range
  2017-09-14 12:49  4%         ` Ferruh Yigit
@ 2017-09-15  5:11  0%           ` Yang, Zhiyong
  0 siblings, 0 replies; 200+ results
From: Yang, Zhiyong @ 2017-09-15  5:11 UTC (permalink / raw)
  To: Yigit, Ferruh, dev, Doherty, Declan, Lu, Wenzhuo
  Cc: thomas, hemant.agrawal, Hunt, David, Richardson, Bruce, Ananyev,
	Konstantin

Hi Ferruh:

> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Thursday, September 14, 2017 8:50 PM
> To: Yang, Zhiyong <zhiyong.yang@intel.com>; dev@dpdk.org; Doherty, Declan
> <declan.doherty@intel.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>
> Cc: thomas@monjalon.net; hemant.agrawal@nxp.com; Hunt, David
> <david.hunt@intel.com>; Richardson, Bruce <bruce.richardson@intel.com>;
> Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Subject: Re: [PATCH v3 1/4] ethdev: increase port_id range
> 

> >>>  }
> >>>  BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_setup, _v1708, 17.08);
> >>> -MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id,
> >>> +MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint16_t port_id,
> >>
> >> Hmm, this is tricky!
> >> The macro MAP_STATIC_SYMBOL is used for ABI versioning, but changing
> >> the port_id storage type breaks the ABI already. ABI versioning can
> >> be removed completely. Cc'ed Declan.
> >>
> > Do you mean that I should remove
> >>> -MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id, ?
> >
> >> Which also reminds me that bonding LIBABIVER needs to be updated.
> >> This is also required for all i40e, ixgbe and bnxt. Please let me know if you
> need help here.
> >>
> > Yes. I'm not clear about it. Need help Ferruh.
> 
> There are two bonding APIs [1] using ABI versioning [2], and both have port_id
> as parameter. Since we are already breaking ABI, no need to keep older versions
> of APIs.
> 
> So what needs to be done is, in .c file, remove those APIs and versioning macros
> [3], rename latest version of API [6] and update .map file [4] to remove exposed
> ABIs [5] from _older_ versions, only keep latest ones.
> 
> I believe ideally these updates should be in this patch, but this patch is big and no
> need to make it more confusing, I would suggest making these changes
> _before_ this patch, so get rid of unnecessary update in this patch.
> 
> 
> [1]
> rte_eth_bond_8023ad_conf_get_v20()
> rte_eth_bond_8023ad_conf_get_v1607()
> rte_eth_bond_8023ad_setup_v20()
> rte_eth_bond_8023ad_setup_v1607()
> 
> [2]
> http://dpdk.org/doc/guides/contributing/versioning.html
> 
> [3]
> VERSION_SYMBOL, MAP_STATIC_SYMBOL, BIND_DEFAULT_SYMBOL
> 
> [4]
> rte_eth_bond_version.map
> 
> [5]
> rte_eth_bond_8023ad_setup
> rte_eth_bond_8023ad_conf_get
> 
> [6]
> rte_eth_bond_8023ad_conf_get_v1708 -->
> 	rte_eth_bond_8023ad_conf_get
> rte_eth_bond_8023ad_setup_v1708 --->
> 	rte_eth_bond_8023ad_setup
> 

Thanks so much for detailed guide. If no objection, I will do it as you say.
Add it as the first patch in the patchset next version. I will send it out  very soon.

Zhiyong 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v4 4/4] eventdev: add device started attribute
  2017-09-14 16:08  4% ` [dpdk-dev] [PATCH v4 " Harry van Haaren
@ 2017-09-14 16:09  3%   ` Harry van Haaren
  2017-09-15  6:14  0%   ` [dpdk-dev] [PATCH v4 0/4] eventdev: add attribute based get APIs Nipun Gupta
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 200+ results
From: Harry van Haaren @ 2017-09-14 16:09 UTC (permalink / raw)
  To: dev; +Cc: jerin.jacob, Harry van Haaren

This commit adds an attribute to the eventdev, allowing applications
to retrieve if the eventdev is running or stopped. Note that no API
or ABI changes were required in adding the statistic, and code changes
are minimal.

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
---
 lib/librte_eventdev/rte_eventdev.c | 3 +++
 lib/librte_eventdev/rte_eventdev.h | 4 ++++
 2 files changed, 7 insertions(+)

diff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/librte_eventdev/rte_eventdev.c
index 73e1df0..480b26e 100644
--- a/lib/librte_eventdev/rte_eventdev.c
+++ b/lib/librte_eventdev/rte_eventdev.c
@@ -740,6 +740,9 @@ rte_event_dev_attr_get(uint8_t dev_id, uint32_t attr_id,
 	case RTE_EVENT_DEV_ATTR_QUEUE_COUNT:
 		*attr_value = dev->data->nb_queues;
 		break;
+	case RTE_EVENT_DEV_ATTR_STARTED:
+		*attr_value = dev->data->dev_started;
+		break;
 	default:
 		return -EINVAL;
 	}
diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h
index 3fd447a..1b629fc 100644
--- a/lib/librte_eventdev/rte_eventdev.h
+++ b/lib/librte_eventdev/rte_eventdev.h
@@ -407,6 +407,10 @@ rte_event_dev_info_get(uint8_t dev_id, struct rte_event_dev_info *dev_info);
  * The count of queues.
  */
 #define RTE_EVENT_DEV_ATTR_QUEUE_COUNT 1
+/**
+ * The status of the device, zero for stopped, non-zero for started.
+ */
+#define RTE_EVENT_DEV_ATTR_STARTED 2
 
 /**
  * Get an attribute from a device.
-- 
2.7.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v4 0/4] eventdev: add attribute based get APIs
  @ 2017-09-14 16:08  4% ` Harry van Haaren
  2017-09-14 16:09  3%   ` [dpdk-dev] [PATCH v4 4/4] eventdev: add device started attribute Harry van Haaren
                     ` (3 more replies)
  0 siblings, 4 replies; 200+ results
From: Harry van Haaren @ 2017-09-14 16:08 UTC (permalink / raw)
  To: dev; +Cc: jerin.jacob, Harry van Haaren

This patchset refactors the eventdev API to be more flexible
and capable. In particular, the API is capable of returning an
error value if an invalid device, port or attribute ID is passed
in, which was not possible with the previous APIs.

The implementation of this patchset is based on a v1 patch[1],
and after some discussion this API was seen as the best solution.

In terms of flexibility, the attribute id allows addition of new
common eventdev layer attributes without breaking ABI or adding
new functions. Note that these attributes are not data-path, and
that PMDs should continue to use the xstats API for reporting any
unique PMD statistics that are available.

Regarding API/ABI compatibility, I have removed the functions from
the .map files - please review the .map file changes for ABI issues
carefully.

The last patch of this series adds a started attribute to the device,
allowing the application to query if a device is currently running.

-Harry

[1] http://dpdk.org/dev/patchwork/patch/27152/

---

v4:
- Rework based on review by Jerin
  - default: cases into switches
  - Remove old functions from .map file
  - Remove /* out */ parameters
  - Rework header file definitions to match logical order
- Rework patch split
  - Cleaner removal of queue_count() function

v3:
- Fix checkpatch issues... somehow I broke my checkpatch script :/

v2:
- New APIs design based on discussion of initial patch.



Harry van Haaren (4):
  eventdev: add port attribute function
  eventdev: add dev attribute get function
  eventdev: add queue attribute function
  eventdev: add device started attribute

 lib/librte_eventdev/rte_eventdev.c           |  97 ++++++++++++------
 lib/librte_eventdev/rte_eventdev.h           | 115 +++++++++++----------
 lib/librte_eventdev/rte_eventdev_version.map |  14 ++-
 test/test/test_eventdev.c                    | 132 +++++++++++++++++++------
 test/test/test_eventdev_octeontx.c           | 143 ++++++++++++++++++++-------
 5 files changed, 345 insertions(+), 156 deletions(-)

-- 
2.7.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3 3/4] examples: increase port_id range
  @ 2017-09-14 14:41  3%     ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2017-09-14 14:41 UTC (permalink / raw)
  To: Zhiyong Yang, dev; +Cc: thomas, hemant.agrawal, david.hunt

On 9/9/2017 3:47 PM, Zhiyong Yang wrote:
> Modify port_id related code in examples accordingly since port_id
> definition in lib and pmd changes.
>
> Fix some original checkpatch issues and remove some unnecessary
> cast at the same time.
>
> Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
> ---

<...>

>
> diff --git a/doc/guides/rel_notes/release_17_11.rst
b/doc/guides/rel_notes/release_17_11.rst
> index 170f4f916..98fd7cb23 100644
> --- a/doc/guides/rel_notes/release_17_11.rst
> +++ b/doc/guides/rel_notes/release_17_11.rst
> @@ -41,6 +41,10 @@ New Features
>       Also, make sure to start the actual text at the margin.
>       =========================================================
>
> +* **Extended port_id range from uint8_t to uint16_t.**
> +
> +  Extended port_id range from 8 bits to 16 bits in order to support
more than
> +  256 ports in dpdk.
>
>  Resolved Issues
>  ---------------
There was a LIBABIVER update comment in patch 1/4, let me continue it here.

First lets extract documentation on its own patch, instead of being part
of "examples" update.

And update it a little more:

1- Remove deprecation notice.
Each patch implements a deprecation notice also should remove the
notice. rel_notes/deprecation.rst should be updated to remove port_id
related paragraph.


2- LIBABIVER values of increased libraries should be increased.

LIBABIVER is defined in each library Makefile, and set to the value of
current version of the library.

The libraries breaking ABI/API should increase this by one.

So for this patch, following libraries should be updated:
drivers/net/bnxt
drivers/net/bonding
drivers/net/i40e
drivers/net/ixgbe
lib/librte_ether
lib/librte_bitratestats
lib/librte_pdump

Please double check the list the libraries in case I missed.

And it seems we are breaking more API than initially intended. Should we
highlight this more?


3- Document updated library versions in release notes
in release notes, there is a "Shared Library Versions" section. This
section lists all libraries with their versions, like:

"   librte_ethdev.so.7" [1]

This should be updates as:

"   librte_ethdev.so.8"


[1]
It seems I have selected wrong sample :(, there is a mismatch in
Makefile LIBABIVER value and release notes version for librte_ethdev, I
will send a patch for it.

<...>

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 1/4] ethdev: increase port_id range
  2017-09-13  2:26  0%       ` Yang, Zhiyong
@ 2017-09-14 12:49  4%         ` Ferruh Yigit
  2017-09-15  5:11  0%           ` Yang, Zhiyong
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2017-09-14 12:49 UTC (permalink / raw)
  To: Yang, Zhiyong, dev, Doherty, Declan, Lu, Wenzhuo
  Cc: thomas, hemant.agrawal, Hunt, David, Richardson, Bruce, Ananyev,
	Konstantin

On 9/13/2017 3:26 AM, Yang, Zhiyong wrote:
> Hi Ferruh,
> 
>> -----Original Message-----
>> From: Yigit, Ferruh
>> Sent: Monday, September 11, 2017 6:22 PM
>> To: Yang, Zhiyong <zhiyong.yang@intel.com>; dev@dpdk.org; Doherty, Declan
>> <declan.doherty@intel.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>
>> Cc: thomas@monjalon.net; hemant.agrawal@nxp.com; Hunt, David
>> <david.hunt@intel.com>
>> Subject: Re: [PATCH v3 1/4] ethdev: increase port_id range
>>
>> On 9/9/2017 3:47 PM, Zhiyong Yang wrote:
>>> Extend port_id definition from uint8_t to uint16_t in lib and drivers
>>> data structures, specifically rte_eth_dev_data.
>>> Modify the APIs, drivers and app using port_id at the same time.
>>>
>>> Fix some checkpatch issues from the original code and remove some
>>> unnecessary cast operations.
>>>
>>> Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
>>

<...>

>>> @@ -1536,17 +1536,12 @@ rte_eth_bond_8023ad_setup_v1708(uint8_t
>> port_id,
>>>  	return 0;
>>>  }
>>>  BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_setup, _v1708, 17.08);
>>> -MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id,
>>> +MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint16_t port_id,
>>
>> Hmm, this is tricky!
>> The macro MAP_STATIC_SYMBOL is used for ABI versioning, but changing the
>> port_id storage type breaks the ABI already. ABI versioning can be removed
>> completely. Cc'ed Declan.
>>
> Do you mean that I should remove 
>>> -MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id, ?
> 
>> Which also reminds me that bonding LIBABIVER needs to be updated. This is also
>> required for all i40e, ixgbe and bnxt. Please let me know if you need help here.
>>
> Yes. I'm not clear about it. Need help Ferruh.

There are two bonding APIs [1] using ABI versioning [2], and both have
port_id as parameter. Since we are already breaking ABI, no need to keep
older versions of APIs.

So what needs to be done is, in .c file, remove those APIs and
versioning macros [3], rename latest version of API [6] and update .map
file [4] to remove exposed ABIs [5] from _older_ versions, only keep
latest ones.

I believe ideally these updates should be in this patch, but this patch
is big and no need to make it more confusing, I would suggest making
these changes _before_ this patch, so get rid of unnecessary update in
this patch.


[1]
rte_eth_bond_8023ad_conf_get_v20()
rte_eth_bond_8023ad_conf_get_v1607()
rte_eth_bond_8023ad_setup_v20()
rte_eth_bond_8023ad_setup_v1607()

[2]
http://dpdk.org/doc/guides/contributing/versioning.html

[3]
VERSION_SYMBOL, MAP_STATIC_SYMBOL, BIND_DEFAULT_SYMBOL

[4]
rte_eth_bond_version.map

[5]
rte_eth_bond_8023ad_setup
rte_eth_bond_8023ad_conf_get

[6]
rte_eth_bond_8023ad_conf_get_v1708 -->
	rte_eth_bond_8023ad_conf_get
rte_eth_bond_8023ad_setup_v1708 --->
	rte_eth_bond_8023ad_setup

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2 6/6] eal: remove xen dom0 support
    2017-09-14  2:40  3% ` [dpdk-dev] [PATCH v2 5/6] eal: remove API rte_mem_phy2mch Jianfeng Tan
@ 2017-09-14  2:40  1% ` Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-09-14  2:40 UTC (permalink / raw)
  To: dev
  Cc: xen-devel, thomas, john.mcnamara, jerin.jacob, shahafs, wei.liu2,
	joao.m.martins, bruce.richardson, Jianfeng Tan

We remove xen-specific code in EAL, including the option --xen-dom0,
memory initialization code, compiling dependency, etc.

Related documents are removed or updated, and bump the eal library
version.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 MAINTAINERS                                        |   7 -
 config/common_base                                 |   5 -
 doc/guides/contributing/documentation.rst          |   1 -
 doc/guides/index.rst                               |   1 -
 doc/guides/linux_gsg/build_sample_apps.rst         |   5 +-
 doc/guides/linux_gsg/sys_reqs.rst                  |  53 --
 doc/guides/prog_guide/env_abstraction_layer.rst    |  11 -
 doc/guides/prog_guide/source_org.rst               |   1 -
 doc/guides/rel_notes/deprecation.rst               |   3 -
 doc/guides/rel_notes/release_17_11.rst             |  12 +
 doc/guides/testpmd_app_ug/run_app.rst              |   4 -
 doc/guides/xen/img/dpdk_xen_pkt_switch.png         | Bin 163842 -> 0 bytes
 doc/guides/xen/img/grant_refs.png                  | Bin 6405 -> 0 bytes
 doc/guides/xen/img/grant_table.png                 | Bin 96762 -> 0 bytes
 doc/guides/xen/index.rst                           |  38 -
 doc/guides/xen/pkt_switch.rst                      | 470 -------------
 lib/librte_eal/bsdapp/eal/Makefile                 |   2 +-
 .../bsdapp/eal/include/exec-env/rte_dom0_common.h  | 107 ---
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |   3 -
 lib/librte_eal/common/eal_common_options.c         |   3 -
 lib/librte_eal/common/eal_internal_cfg.h           |   1 -
 lib/librte_eal/common/eal_options.h                |   2 -
 lib/librte_eal/common/include/rte_memory.h         |  41 --
 lib/librte_eal/linuxapp/Makefile                   |   2 -
 lib/librte_eal/linuxapp/eal/Makefile               |   7 +-
 lib/librte_eal/linuxapp/eal/eal.c                  |  24 -
 lib/librte_eal/linuxapp/eal/eal_memory.c           |  56 --
 lib/librte_eal/linuxapp/eal/eal_xen_memory.c       | 381 ----------
 .../eal/include/exec-env/rte_dom0_common.h         | 108 ---
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   4 -
 lib/librte_eal/linuxapp/igb_uio/igb_uio.c          |  54 --
 lib/librte_eal/linuxapp/xen_dom0/Makefile          |  53 --
 lib/librte_eal/linuxapp/xen_dom0/compat.h          |  15 -
 lib/librte_eal/linuxapp/xen_dom0/dom0_mm_dev.h     | 107 ---
 lib/librte_eal/linuxapp/xen_dom0/dom0_mm_misc.c    | 780 ---------------------
 pkg/dpdk.spec                                      |   3 -
 36 files changed, 16 insertions(+), 2348 deletions(-)
 delete mode 100644 doc/guides/xen/img/dpdk_xen_pkt_switch.png
 delete mode 100644 doc/guides/xen/img/grant_refs.png
 delete mode 100644 doc/guides/xen/img/grant_table.png
 delete mode 100644 doc/guides/xen/index.rst
 delete mode 100644 doc/guides/xen/pkt_switch.rst
 delete mode 100644 lib/librte_eal/bsdapp/eal/include/exec-env/rte_dom0_common.h
 delete mode 100644 lib/librte_eal/linuxapp/eal/eal_xen_memory.c
 delete mode 100644 lib/librte_eal/linuxapp/eal/include/exec-env/rte_dom0_common.h
 delete mode 100644 lib/librte_eal/linuxapp/xen_dom0/Makefile
 delete mode 100644 lib/librte_eal/linuxapp/xen_dom0/compat.h
 delete mode 100644 lib/librte_eal/linuxapp/xen_dom0/dom0_mm_dev.h
 delete mode 100644 lib/librte_eal/linuxapp/xen_dom0/dom0_mm_misc.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 003e72e..2af32ff 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -189,13 +189,6 @@ Linux VFIO
 M: Anatoly Burakov <anatoly.burakov@intel.com>
 F: lib/librte_eal/linuxapp/eal/*vfio*
 
-Linux Xen
-M: Jianfeng Tan <jianfeng.tan@intel.com>
-F: lib/librte_eal/linuxapp/xen_dom0/
-F: lib/librte_eal/linuxapp/eal/*xen*
-F: lib/librte_eal/linuxapp/eal/include/exec-env/rte_dom0_common.h
-F: doc/guides/xen/
-
 FreeBSD EAL (with overlaps)
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
diff --git a/config/common_base b/config/common_base
index 93928b6..17d3dae 100644
--- a/config/common_base
+++ b/config/common_base
@@ -719,11 +719,6 @@ CONFIG_RTE_LIBRTE_VHOST_DEBUG=n
 CONFIG_RTE_LIBRTE_PMD_VHOST=n
 
 #
-#Compile Xen domain0 support
-#
-CONFIG_RTE_LIBRTE_XEN_DOM0=n
-
-#
 # Compile the test application
 #
 CONFIG_RTE_APP_TEST=y
diff --git a/doc/guides/contributing/documentation.rst b/doc/guides/contributing/documentation.rst
index cddbd7b..170dacd 100644
--- a/doc/guides/contributing/documentation.rst
+++ b/doc/guides/contributing/documentation.rst
@@ -34,7 +34,6 @@ The main directories that contain files related to documentation are shown below
        |-- testpmd_app_ug
        |-- rel_notes
        |-- nics
-       |-- xen
        |-- ...
 
 
diff --git a/doc/guides/index.rst b/doc/guides/index.rst
index 63716b0..5b6eb7e 100644
--- a/doc/guides/index.rst
+++ b/doc/guides/index.rst
@@ -44,7 +44,6 @@ DPDK documentation
    nics/index
    cryptodevs/index
    eventdevs/index
-   xen/index
    contributing/index
    rel_notes/index
    faq/index
diff --git a/doc/guides/linux_gsg/build_sample_apps.rst b/doc/guides/linux_gsg/build_sample_apps.rst
index 0cc5fd1..582984d 100644
--- a/doc/guides/linux_gsg/build_sample_apps.rst
+++ b/doc/guides/linux_gsg/build_sample_apps.rst
@@ -116,7 +116,7 @@ The following is the list of options that can be given to the EAL:
 
     ./rte-app [-c COREMASK | -l CORELIST] [-n NUM] [-b <domain:bus:devid.func>] \
               [--socket-mem=MB,...] [-d LIB.so|DIR] [-m MB] [-r NUM] [-v] [--file-prefix] \
-	      [--proc-type <primary|secondary|auto>] [-- xen-dom0]
+	      [--proc-type <primary|secondary|auto>]
 
 The EAL options are as follows:
 
@@ -163,9 +163,6 @@ The EAL options are as follows:
 * ``--proc-type``:
   The type of process instance.
 
-* ``--xen-dom0``:
-  Support application running on Xen Domain0 without hugetlbfs.
-
 * ``--vmware-tsc-map``:
   Use VMware TSC map instead of native RDTSC.
 
diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index eb8442c..3e7fe63 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -228,56 +228,3 @@ The mount point can be made permanent across reboots, by adding the following li
 For 1GB pages, the page size must be specified as a mount option::
 
     nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0
-
-Xen Domain0 Support in the Linux Environment
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The existing memory management implementation is based on the Linux kernel hugepage mechanism.
-On the Xen hypervisor, hugepage support for DomainU (DomU) Guests means that DPDK applications work as normal for guests.
-
-However, Domain0 (Dom0) does not support hugepages.
-To work around this limitation, a new kernel module rte_dom0_mm is added to facilitate the allocation and mapping of memory via
-**IOCTL** (allocation) and **MMAP** (mapping).
-
-Enabling Xen Dom0 Mode in the DPDK
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-By default, Xen Dom0 mode is disabled in the DPDK build configuration files.
-To support Xen Dom0, the CONFIG_RTE_LIBRTE_XEN_DOM0 setting should be changed to “y”, which enables the Xen Dom0 mode at compile time.
-
-Furthermore, the CONFIG_RTE_EAL_ALLOW_INV_SOCKET_ID setting should also be changed to “y” in the case of the wrong socket ID being received.
-
-Loading the DPDK rte_dom0_mm Module
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-To run any DPDK application on Xen Dom0, the ``rte_dom0_mm`` module must be loaded into the running kernel with rsv_memsize option.
-The module is found in the kmod sub-directory of the DPDK target directory.
-This module should be loaded using the insmod command as shown below (assuming that the current directory is the DPDK target directory)::
-
-    sudo insmod kmod/rte_dom0_mm.ko rsv_memsize=X
-
-The value X cannot be greater than 4096(MB).
-
-Configuring Memory for DPDK Use
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-After the rte_dom0_mm.ko kernel module has been loaded, the user must configure the memory size for DPDK usage.
-This is done by echoing the memory size to a memsize file in the /sys/devices/ directory.
-Use the following command (assuming that 2048 MB is required)::
-
-    echo 2048 > /sys/kernel/mm/dom0-mm/memsize-mB/memsize
-
-The user can also check how much memory has already been used::
-
-    cat /sys/kernel/mm/dom0-mm/memsize-mB/memsize_rsvd
-
-Xen Domain0 does not support NUMA configuration, as a result the ``--socket-mem`` command line option is invalid for Xen Domain0.
-
-.. note::
-
-    The memsize value cannot be greater than the rsv_memsize value.
-
-Running the DPDK Application on Xen Domain0
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-To run the DPDK application on Xen Domain0, an extra command line option ``--xen-dom0`` is required.
diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst
index fff1c06..4775eb3 100644
--- a/doc/guides/prog_guide/env_abstraction_layer.rst
+++ b/doc/guides/prog_guide/env_abstraction_layer.rst
@@ -117,17 +117,6 @@ The physical address of the reserved memory for that memory zone is also returne
 
     Memory reservations done using the APIs provided by rte_malloc are also backed by pages from the hugetlbfs filesystem.
 
-Xen Dom0 support without hugetbls
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The existing memory management implementation is based on the Linux kernel hugepage mechanism.
-However, Xen Dom0 does not support hugepages, so a new Linux kernel module rte_dom0_mm is added to workaround this limitation.
-
-The EAL uses IOCTL interface to notify the Linux kernel module rte_dom0_mm to allocate memory of specified size,
-and get all memory segments information from the module,
-and the EAL uses MMAP interface to map the allocated memory.
-For each memory segment, the physical addresses are contiguous within it but actual hardware addresses are contiguous within 2MB.
-
 PCI Access
 ~~~~~~~~~~
 
diff --git a/doc/guides/prog_guide/source_org.rst b/doc/guides/prog_guide/source_org.rst
index d5d01f3..7aab4b4 100644
--- a/doc/guides/prog_guide/source_org.rst
+++ b/doc/guides/prog_guide/source_org.rst
@@ -108,7 +108,6 @@ The drivers directory has a *net* subdirectory which contains::
     +-- szedata2           # SZEDATA2 poll mode driver
     +-- virtio             # Virtio poll mode driver
     +-- vmxnet3            # VMXNET3 poll mode driver
-    +-- xenvirt            # Xen virtio poll mode driver
 
 .. note::
 
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 3362f33..7a2d2f2 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -29,9 +29,6 @@ Deprecation Notices
   - ``rte_eal_devargs_type_count``
   - ``rte_eal_parse_devargs_str``, replaced by ``rte_eal_devargs_parse``
 
-* eal: the support of Xen dom0 will be removed from EAL in 17.11; and with
-  that, drivers/net/xenvirt and examples/vhost_xen will also be removed.
-
 * eal: An ABI change is planned for 17.11 to make DPDK aware of IOVA address
   translation scheme.
   Reference to phys address in EAL data-structure or functions may change to
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 8534947..06c334b 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -126,7 +126,19 @@ ABI Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+Removed Items
+-------------
 
+.. This section should contain removed items in this release. Sample format:
+
+   * Add a short 1-2 sentence description of the removed item in the past
+     tense.
+
+   This section is a comment. do not overwrite or remove it.
+   Also, make sure to start the actual text at the margin.
+   =========================================================
+
+   * Xen dom0 in EAL was removed, as well as xenvirt PMD and vhost_xen.
 
 Shared Library Versions
 -----------------------
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index e8303f3..bd5ebe6 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -94,10 +94,6 @@ See the DPDK Getting Started Guides for more information on these options.
 
     Display the version information on startup.
 
-*   ``--xen-dom0``
-
-    Support application running on Xen Domain0 without hugetlbfs.
-
 *   ``--syslog``
 
     Set the syslog facility.
diff --git a/doc/guides/xen/img/dpdk_xen_pkt_switch.png b/doc/guides/xen/img/dpdk_xen_pkt_switch.png
deleted file mode 100644
index 32a6d1618820e930b17231f8fe38aab5d5c5d370..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 163842
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

diff --git a/doc/guides/xen/img/grant_refs.png b/doc/guides/xen/img/grant_refs.png
deleted file mode 100644
index baa34e1e3f5e8975ae0516a09f906933b1ac688d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6405
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
R9${aAy7JpMP(_Qd{{c{~dJX^p

diff --git a/doc/guides/xen/img/grant_table.png b/doc/guides/xen/img/grant_table.png
deleted file mode 100644
index c23e5fa73e660c5be9c7cd01f55ff34e2917632b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 96762
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
Z{{xM~vTICa&vpO+002ovPDHLkV1nHvhjah{

diff --git a/doc/guides/xen/index.rst b/doc/guides/xen/index.rst
deleted file mode 100644
index cb43cd2..0000000
--- a/doc/guides/xen/index.rst
+++ /dev/null
@@ -1,38 +0,0 @@
-..  BSD LICENSE
-    Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions
-    are met:
-
-    * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the
-    distribution.
-    * Neither the name of Intel Corporation nor the names of its
-    contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Xen Guide
-=========
-
-.. toctree::
-    :maxdepth: 2
-    :numbered:
-
-    pkt_switch
diff --git a/doc/guides/xen/pkt_switch.rst b/doc/guides/xen/pkt_switch.rst
deleted file mode 100644
index 717a04b..0000000
--- a/doc/guides/xen/pkt_switch.rst
+++ /dev/null
@@ -1,470 +0,0 @@
-..  BSD LICENSE
-    Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions
-    are met:
-
-    * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the
-    distribution.
-    * Neither the name of Intel Corporation nor the names of its
-    contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-DPDK Xen Based Packet-Switching Solution
-========================================
-
-Introduction
-------------
-
-DPDK provides a para-virtualization packet switching solution, based on the Xen hypervisor's Grant Table, Note 1,
-which provides simple and fast packet switching capability between guest domains and host domain based on MAC address or VLAN tag.
-
-This solution is comprised of two components;
-a Poll Mode Driver (PMD) as the front end in the guest domain and a switching back end in the host domain.
-XenStore is used to exchange configure information between the PMD front end and switching back end,
-including grant reference IDs for shared Virtio RX/TX rings,
-MAC address, device state, and so on. XenStore is an information storage space shared between domains,
-see further information on XenStore below.
-
-The front end PMD can be found in the DPDK directory lib/ librte_pmd_xenvirt and back end example in examples/vhost_xen.
-
-The PMD front end and switching back end use shared Virtio RX/TX rings as para- virtualized interface.
-The Virtio ring is created by the front end, and Grant table references for the ring are passed to host.
-The switching back end maps those grant table references and creates shared rings in a mapped address space.
-
-The following diagram describes the functionality of the DPDK Xen Packet- Switching Solution.
-
-
-.. _figure_dpdk_xen_pkt_switch:
-
-.. figure:: img/dpdk_xen_pkt_switch.*
-
-   Functionality of the DPDK Xen Packet Switching Solution.
-
-
-Note 1 The Xen hypervisor uses a mechanism called a Grant Table to share memory between domains
-(`http://wiki.xen.org/wiki/Grant Table <http://wiki.xen.org/wiki/Grant%20Table>`_).
-
-A diagram of the design is shown below, where "gva" is the Guest Virtual Address,
-which is the data pointer of the mbuf, and "hva" is the Host Virtual Address:
-
-
-.. _figure_grant_table:
-
-.. figure:: img/grant_table.*
-
-   DPDK Xen Layout
-
-
-In this design, a Virtio ring is used as a para-virtualized interface for better performance over a Xen private ring
-when packet switching to and from a VM.
-The additional performance is gained by avoiding a system call and memory map in each memory copy with a XEN private ring.
-
-Device Creation
----------------
-
-Poll Mode Driver Front End
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-*   Mbuf pool allocation:
-
-    To use a Xen switching solution, the DPDK application should use rte_mempool_gntalloc_create()
-    to reserve mbuf pools during initialization.
-    rte_mempool_gntalloc_create() creates a mempool with objects from memory allocated and managed via gntalloc/gntdev.
-
-    The DPDK now supports construction of mempools from allocated virtual memory through the rte_mempool_xmem_create() API.
-
-    This front end constructs mempools based on memory allocated through the xen_gntalloc driver.
-    rte_mempool_gntalloc_create() allocates Grant pages, maps them to continuous virtual address space,
-    and calls rte_mempool_xmem_create() to build mempools.
-    The Grant IDs for all Grant pages are passed to the host through XenStore.
-
-*   Virtio Ring Creation:
-
-    The Virtio queue size is defined as 256 by default in the VQ_DESC_NUM macro.
-    Using the queue setup function,
-    Grant pages are allocated based on ring size and are mapped to continuous virtual address space to form the Virtio ring.
-    Normally, one ring is comprised of several pages.
-    Their Grant IDs are passed to the host through XenStore.
-
-    There is no requirement that this memory be physically continuous.
-
-*   Interrupt and Kick:
-
-    There are no interrupts in DPDK Xen Switching as both front and back ends work in polling mode.
-    There is no requirement for notification.
-
-*   Feature Negotiation:
-
-    Currently, feature negotiation through XenStore is not supported.
-
-*   Packet Reception & Transmission:
-
-    With mempools and Virtio rings created, the front end can operate Virtio devices,
-    as it does in Virtio PMD for KVM Virtio devices with the exception that the host
-    does not require notifications or deal with interrupts.
-
-XenStore is a database that stores guest and host information in the form of (key, value) pairs.
-The following is an example of the information generated during the startup of the front end PMD in a guest VM (domain ID 1):
-
-.. code-block:: console
-
-        xenstore -ls /local/domain/1/control/dpdk
-        0_mempool_gref="3042,3043,3044,3045"
-        0_mempool_va="0x7fcbc6881000"
-        0_tx_vring_gref="3049"
-        0_rx_vring_gref="3053"
-        0_ether_addr="4e:0b:d0:4e:aa:f1"
-        0_vring_flag="3054"
-        ...
-
-Multiple mempools and multiple Virtios may exist in the guest domain, the first number is the index, starting from zero.
-
-The idx#_mempool_va stores the guest virtual address for mempool idx#.
-
-The idx#_ether_adder stores the MAC address of the guest Virtio device.
-
-For idx#_rx_ring_gref, idx#_tx_ring_gref, and idx#_mempool_gref, the value is a list of Grant references.
-Take idx#_mempool_gref node for example, the host maps those Grant references to a continuous virtual address space.
-The real Grant reference information is stored in this virtual address space,
-where (gref, pfn) pairs follow each other with -1 as the terminator.
-
-
-.. _figure_grant_refs:
-
-.. figure:: img/grant_refs.*
-
-   Mapping Grant references to a continuous virtual address space
-
-
-After all gref# IDs are retrieved, the host maps them to a continuous virtual address space.
-With the guest mempool virtual address, the host establishes 1:1 address mapping.
-With multiple guest mempools, the host establishes multiple address translation regions.
-
-Switching Back End
-~~~~~~~~~~~~~~~~~~
-
-The switching back end monitors changes in XenStore.
-When the back end detects that a new Virtio device has been created in a guest domain, it will:
-
-#.  Retrieve Grant and configuration information from XenStore.
-
-#.  Map and create a Virtio ring.
-
-#.  Map mempools in the host and establish address translation between the guest address and host address.
-
-#.  Select a free VMDQ pool, set its affinity with the Virtio device, and set the MAC/ VLAN filter.
-
-Packet Reception
-~~~~~~~~~~~~~~~~
-
-When packets arrive from an external network, the MAC?VLAN filter classifies packets into queues in one VMDQ pool.
-As each pool is bonded to a Virtio device in some guest domain, the switching back end will:
-
-#.  Fetch an available entry from the Virtio RX ring.
-
-#.  Get gva, and translate it to hva.
-
-#.  Copy the contents of the packet to the memory buffer pointed to by gva.
-
-The DPDK application in the guest domain, based on the PMD front end,
-is polling the shared Virtio RX ring for available packets and receives them on arrival.
-
-Packet Transmission
-~~~~~~~~~~~~~~~~~~~
-
-When a Virtio device in one guest domain is to transmit a packet,
-it puts the virtual address of the packet's data area into the shared Virtio TX ring.
-
-The packet switching back end is continuously polling the Virtio TX ring.
-When new packets are available for transmission from a guest, it will:
-
-#.  Fetch an available entry from the Virtio TX ring.
-
-#.  Get gva, and translate it to hva.
-
-#.  Copy the packet from hva to the host mbuf's data area.
-
-#.  Compare the destination MAC address with all the MAC addresses of the Virtio devices it manages.
-    If a match exists, it directly copies the packet to the matched VIrtio RX ring.
-    Otherwise, it sends the packet out through hardware.
-
-.. note::
-
-    The packet switching back end is for demonstration purposes only.
-    The user could implement their switching logic based on this example.
-    In this example, only one physical port on the host is supported.
-    Multiple segments are not supported. The biggest mbuf supported is 4KB.
-    When the back end is restarted, all front ends must also be restarted.
-
-Running the Application
------------------------
-
-The following describes the steps required to run the application.
-
-Validated Environment
-~~~~~~~~~~~~~~~~~~~~~
-
-Host:
-
-    Xen-hypervisor: 4.2.2
-
-    Distribution: Fedora release 18
-
-    Kernel: 3.10.0
-
-    Xen development package (including Xen, Xen-libs, xen-devel): 4.2.3
-
-Guest:
-
-    Distribution: Fedora 16 and 18
-
-    Kernel: 3.6.11
-
-Xen Host Prerequisites
-~~~~~~~~~~~~~~~~~~~~~~
-
-Note that the following commands might not be the same on different Linux* distributions.
-
-*   Install xen-devel package:
-
-    .. code-block:: console
-
-        yum install xen-devel.x86_64
-
-*   Start xend if not already started:
-
-    .. code-block:: console
-
-        /etc/init.d/xend start
-
-*   Mount xenfs if not already mounted:
-
-    .. code-block:: console
-
-        mount -t xenfs none /proc/xen
-
-*   Enlarge the limit for xen_gntdev driver:
-
-    .. code-block:: console
-
-        modprobe -r xen_gntdev
-        modprobe xen_gntdev limit=1000000
-
-.. note::
-
-    The default limit for earlier versions of the xen_gntdev driver is 1024.
-    That is insufficient to support the mapping of multiple Virtio devices into multiple VMs,
-    so it is necessary to enlarge the limit by reloading this module.
-    The default limit of recent versions of xen_gntdev is 1048576.
-    The rough calculation of this limit is:
-
-        limit=nb_mbuf# * VM#.
-
-        In DPDK examples, nb_mbuf# is normally 8192.
-
-Building and Running the Switching Backend
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-#.  Edit config/common_linuxapp, and change the default configuration value for the following two items:
-
-    .. code-block:: console
-
-        CONFIG_RTE_LIBRTE_XEN_DOM0=y
-        CONFIG RTE_LIBRTE_PMD_XENVIRT=n
-
-#.  Build the target:
-
-    .. code-block:: console
-
-        make install T=x86_64-native-linuxapp-gcc
-
-#.  Ensure that RTE_SDK and RTE_TARGET are correctly set. Build the switching example:
-
-    .. code-block:: console
-
-        make -C examples/vhost_xen/
-
-#.  Load the Xen DPDK memory management module and preallocate memory:
-
-    .. code-block:: console
-
-        insmod ./x86_64-native-linuxapp-gcc/build/lib/librte_eal/linuxapp/xen_dom0/rte_dom0_mm.ko
-        echo 2048> /sys/kernel/mm/dom0-mm/memsize-mB/memsize
-
-    .. note::
-
-        On Xen Dom0, there is no hugepage support.
-        Under Xen Dom0, the DPDK uses a special memory management kernel module
-        to allocate chunks of physically continuous memory.
-        Refer to the *DPDK Getting Started Guide* for more information on memory management in the DPDK.
-        In the above command, 4 GB memory is reserved (2048 of 2 MB pages) for DPDK.
-
-#.  Load uio_pci_generic and bind one Intel NIC controller to it:
-
-    .. code-block:: console
-
-        modprobe uio_pci_generic
-        python usertools/dpdk-devbind.py -b uio_pci_generic 0000:09:00:00.0
-
-    In this case, 0000:09:00.0 is the PCI address for the NIC controller.
-
-#.  Run the switching back end example:
-
-    .. code-block:: console
-
-        examples/vhost_xen/build/vhost-switch -l 0-3 -n 3 --xen-dom0 -- -p1
-
-.. note::
-
-    The -xen-dom0 option instructs the DPDK to use the Xen kernel module to allocate memory.
-
-Other Parameters:
-
-*   -vm2vm
-
-    The vm2vm parameter enables/disables packet switching in software.
-    Disabling vm2vm implies that on a VM packet transmission will always go to the Ethernet port
-    and will not be switched to another VM
-
-*   -Stats
-
-    The Stats parameter controls the printing of Virtio-net device statistics.
-    The parameter specifies the interval (in seconds) at which to print statistics,
-    an interval of 0 seconds will disable printing statistics.
-
-Xen PMD Frontend Prerequisites
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-#.  Install xen-devel package for accessing XenStore:
-
-    .. code-block:: console
-
-        yum install xen-devel.x86_64
-
-#.  Mount xenfs, if it is not already mounted:
-
-    .. code-block:: console
-
-        mount -t xenfs none /proc/xen
-
-#.  Enlarge the default limit for xen_gntalloc driver:
-
-    .. code-block:: console
-
-        modprobe -r xen_gntalloc
-        modprobe xen_gntalloc limit=6000
-
-.. note::
-
-    Before the Linux kernel version 3.8-rc5, Jan 15th 2013,
-    a critical defect occurs when a guest is heavily allocating Grant pages.
-    The Grant driver allocates fewer pages than expected which causes kernel memory corruption.
-    This happens, for example, when a guest uses the v1 format of a Grant table entry and allocates
-    more than 8192 Grant pages (this number might be different on different hypervisor versions).
-    To work around this issue, set the limit for gntalloc driver to 6000.
-    (The kernel normally allocates hundreds of Grant pages with one Xen front end per virtualized device).
-    If the kernel allocates a lot of Grant pages, for example, if the user uses multiple net front devices,
-    it is best to upgrade the Grant alloc driver.
-    This defect has been fixed in kernel version 3.8-rc5 and later.
-
-Building and Running the Front End
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-#.  Edit config/common_linuxapp, and change the default configuration value:
-
-    .. code-block:: console
-
-        CONFIG_RTE_LIBRTE_XEN_DOM0=n
-        CONFIG_RTE_LIBRTE_PMD_XENVIRT=y
-
-#.  Build the package:
-
-    .. code-block:: console
-
-        make install T=x86_64-native-linuxapp-gcc
-
-#.  Enable hugepages. Refer to the  *DPDK Getting Started Guide* for instructions on
-    how to use hugepages in the DPDK.
-
-#.  Run TestPMD. Refer to *DPDK TestPMD Application User Guide* for detailed parameter usage.
-
-    .. code-block:: console
-
-        ./x86_64-native-linuxapp-gcc/app/testpmd -l 0-3 -n 4 --vdev="net_xenvirt0,mac=00:00:00:00:00:11"
-        testpmd>set fwd mac
-        testpmd>start
-
-    As an example to run two TestPMD instances over 2 Xen Virtio devices:
-
-    .. code-block:: console
-
-        --vdev="net_xenvirt0,mac=00:00:00:00:00:11" --vdev="net_xenvirt1;mac=00:00:00:00:00:22"
-
-
-Usage Examples: Injecting a Packet Stream Using a Packet Generator
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Loopback Mode
-^^^^^^^^^^^^^
-
-Run TestPMD in a guest VM:
-
-.. code-block:: console
-
-    ./x86_64-native-linuxapp-gcc/app/testpmd -l 0-3 -n 4 --vdev="net_xenvirt0,mac=00:00:00:00:00:11" -- -i --eth-peer=0,00:00:00:00:00:22
-    testpmd> set fwd mac
-    testpmd> start
-
-Example output of the vhost_switch would be:
-
-.. code-block:: console
-
-    DATA:(0) MAC_ADDRESS 00:00:00:00:00:11 and VLAN_TAG 1000 registered.
-
-The above message indicates that device 0 has been registered with MAC address 00:00:00:00:00:11 and VLAN tag 1000.
-Any packets received on the NIC with these values is placed on the device's receive queue.
-
-Configure a packet stream in the packet generator, set the destination MAC address to 00:00:00:00:00:11, and VLAN to 1000,
-the guest Virtio receives these packets and sends them out with destination MAC address 00:00:00:00:00:22.
-
-Inter-VM Mode
-^^^^^^^^^^^^^
-
-Run TestPMD in guest VM1:
-
-.. code-block:: console
-
-    ./x86_64-native-linuxapp-gcc/app/testpmd -l 0-3 -n 4 --vdev="net_xenvirt0,mac=00:00:00:00:00:11" -- -i --eth-peer=0,00:00:00:00:00:22 -- -i
-
-Run TestPMD in guest VM2:
-
-.. code-block:: console
-
-    ./x86_64-native-linuxapp-gcc/app/testpmd -l 0-3 -n 4 --vdev="net_xenvirt0,mac=00:00:00:00:00:22" -- -i --eth-peer=0,00:00:00:00:00:33
-
-Configure a packet stream in the packet generator, and set the destination MAC address to 00:00:00:00:00:11 and VLAN to 1000.
-The packets received in Virtio in guest VM1 will be forwarded to Virtio in guest VM2 and
-then sent out through hardware with destination MAC address 00:00:00:00:00:33.
-
-The packet flow is:
-
-packet generator->Virtio in guest VM1->switching backend->Virtio in guest VM2->switching backend->wire
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 005019e..317a75e 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,7 +48,7 @@ LDLIBS += -lgcc_s
 
 EXPORT_MAP := rte_eal_version.map
 
-LIBABIVER := 5
+LIBABIVER := 6
 
 # specific to bsdapp exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c
diff --git a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_dom0_common.h b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_dom0_common.h
deleted file mode 100644
index 99a3343..0000000
--- a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_dom0_common.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- *   This file is provided under a dual BSD/LGPLv2 license.  When using or
- *   redistributing this file, you may do so under either license.
- *
- *   GNU LESSER GENERAL PUBLIC LICENSE
- *
- *   Copyright(c) 2007-2014 Intel Corporation. All rights reserved.
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of version 2.1 of the GNU Lesser General Public License
- *   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
- *   Lesser General Public License for more details.
- *
- *   You should have received a copy of the GNU Lesser General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *
- *   Contact Information:
- *   Intel Corporation
- *
- *
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *   * Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   * Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in
- *     the documentation and/or other materials provided with the
- *     distribution.
- *   * Neither the name of Intel Corporation nor the names of its
- *     contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#ifndef _RTE_DOM0_COMMON_H_
-#define _RTE_DOM0_COMMON_H_
-
-#ifdef __KERNEL__
-#include <linux/if.h>
-#endif
-
-#define DOM0_NAME_MAX   256
-#define DOM0_MM_DEV   "/dev/dom0_mm"
-
-#define DOM0_CONTIG_NUM_ORDER       9       /**< 2M order */
-#define DOM0_NUM_MEMSEG             512     /**< Maximum nb. of memory segment. */
-#define DOM0_MEMBLOCK_SIZE          0x200000 /**< Maximum nb. of memory block(2M). */
-#define DOM0_CONFIG_MEMSIZE         4096     /**< Maximum config memory size(4G). */
-#define DOM0_NUM_MEMBLOCK (DOM0_CONFIG_MEMSIZE / 2) /**< Maximum nb. of 2M memory block. */
-
-#define RTE_DOM0_IOCTL_PREPARE_MEMSEG    _IOWR(0, 1 , struct memory_info)
-#define RTE_DOM0_IOCTL_ATTACH_TO_MEMSEG  _IOWR(0, 2 , char *)
-#define RTE_DOM0_IOCTL_GET_NUM_MEMSEG    _IOWR(0, 3, int)
-#define RTE_DOM0_IOCTL_GET_MEMSEG_INFO   _IOWR(0, 4, void *)
-
-/**
- * A structure used to store memory information.
- */
-struct memory_info {
-	char name[DOM0_NAME_MAX];
-	uint64_t size;
-};
-
-/**
- * A structure used to store memory segment information.
- */
-struct memseg_info {
-	uint32_t idx;
-	uint64_t pfn;
-	uint64_t size;
-	uint64_t mfn[DOM0_NUM_MEMBLOCK];
-};
-
-/**
- * A structure used to store memory block information.
- */
-struct memblock_info {
-	uint8_t  exchange_flag;
-	uint64_t vir_addr;
-	uint64_t pfn;
-	uint64_t mfn;
-};
-#endif /* _RTE_DOM0_COMMON_H_ */
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index aac6fd7..431d872 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -87,8 +87,6 @@ DPDK_2.0 {
 	rte_thread_get_affinity;
 	rte_thread_set_affinity;
 	rte_vlog;
-	rte_xen_dom0_memory_attach;
-	rte_xen_dom0_memory_init;
 	rte_zmalloc;
 	rte_zmalloc_socket;
 
@@ -115,7 +113,6 @@ DPDK_2.2 {
 	rte_keepalive_dispatch_pings;
 	rte_keepalive_mark_alive;
 	rte_keepalive_register_core;
-	rte_xen_dom0_supported;
 
 } DPDK_2.1;
 
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 1da185e..354cded 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -97,7 +97,6 @@ eal_long_options[] = {
 	{OPT_VDEV,              1, NULL, OPT_VDEV_NUM             },
 	{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         },
 	{0,                     0, NULL, 0                        }
 };
 
@@ -208,8 +207,6 @@ eal_reset_internal_config(struct internal_config *internal_cfg)
 
 	internal_cfg->syslog_facility = LOG_DAEMON;
 
-	internal_cfg->xen_dom0_support = 0;
-
 	/* if set to NONE, interrupt mode is determined automatically */
 	internal_cfg->vfio_intr_mode = RTE_INTR_MODE_NONE;
 
diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h
index 7b7e8c8..f7c885f 100644
--- a/lib/librte_eal/common/eal_internal_cfg.h
+++ b/lib/librte_eal/common/eal_internal_cfg.h
@@ -65,7 +65,6 @@ struct internal_config {
 	volatile unsigned force_nrank;    /**< force number of ranks */
 	volatile unsigned no_hugetlbfs;   /**< true to disable hugetlbfs */
 	unsigned hugepage_unlink;         /**< true to unlink backing files */
-	volatile unsigned xen_dom0_support; /**< support app running on Xen Dom0*/
 	volatile unsigned no_pci;         /**< true to disable PCI */
 	volatile unsigned no_hpet;        /**< true to disable HPET */
 	volatile unsigned vmware_tsc_map; /**< true to use VMware TSC mapping
diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h
index 439a261..8770b85 100644
--- a/lib/librte_eal/common/eal_options.h
+++ b/lib/librte_eal/common/eal_options.h
@@ -81,8 +81,6 @@ enum {
 	OPT_VFIO_INTR_NUM,
 #define OPT_VMWARE_TSC_MAP    "vmware-tsc-map"
 	OPT_VMWARE_TSC_MAP_NUM,
-#define OPT_XEN_DOM0          "xen-dom0"
-	OPT_XEN_DOM0_NUM,
 	OPT_LONG_MAX_NUM
 };
 
diff --git a/lib/librte_eal/common/include/rte_memory.h b/lib/librte_eal/common/include/rte_memory.h
index 8d3960d..c545963 100644
--- a/lib/librte_eal/common/include/rte_memory.h
+++ b/lib/librte_eal/common/include/rte_memory.h
@@ -46,10 +46,6 @@
 
 #include <rte_config.h>
 
-#ifdef RTE_EXEC_ENV_LINUXAPP
-#include <exec-env/rte_dom0_common.h>
-#endif
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -116,10 +112,6 @@ struct rte_memseg {
 	int32_t socket_id;          /**< NUMA socket ID. */
 	uint32_t nchannel;          /**< Number of channels. */
 	uint32_t nrank;             /**< Number of ranks. */
-#ifdef RTE_LIBRTE_XEN_DOM0
-	 /**< store segment MFNs */
-	uint64_t mfn[DOM0_NUM_MEMBLOCK];
-#endif
 } __rte_packed;
 
 /**
@@ -195,39 +187,6 @@ unsigned rte_memory_get_nchannel(void);
  */
 unsigned rte_memory_get_nrank(void);
 
-#ifdef RTE_LIBRTE_XEN_DOM0
-
-/**< Internal use only - should DOM0 memory mapping be used */
-int rte_xen_dom0_supported(void);
-
-/**
- * Memory init for supporting application running on Xen domain0.
- *
- * @param void
- *
- * @return
- *       0: successfully
- *	 negative: error
- */
-int rte_xen_dom0_memory_init(void);
-
-/**
- * Attach to memory setments of primary process on Xen domain0.
- *
- * @param void
- *
- * @return
- *       0: successfully
- *       negative: error
- */
-int rte_xen_dom0_memory_attach(void);
-#else
-static inline int rte_xen_dom0_supported(void)
-{
-	return 0;
-}
-#endif
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_eal/linuxapp/Makefile b/lib/librte_eal/linuxapp/Makefile
index 4794696..2ebdf31 100644
--- a/lib/librte_eal/linuxapp/Makefile
+++ b/lib/librte_eal/linuxapp/Makefile
@@ -35,7 +35,5 @@ DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal
 DIRS-$(CONFIG_RTE_EAL_IGB_UIO) += igb_uio
 DIRS-$(CONFIG_RTE_KNI_KMOD) += kni
 DEPDIRS-kni := eal
-DIRS-$(CONFIG_RTE_LIBRTE_XEN_DOM0) += xen_dom0
-DEPDIRS-xen_dom0 := eal
 
 include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 90bca4d..21e0b4a 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -37,7 +37,7 @@ ARCH_DIR ?= $(RTE_ARCH)
 EXPORT_MAP := rte_eal_version.map
 VPATH += $(RTE_SDK)/lib/librte_eal/common/arch/$(ARCH_DIR)
 
-LIBABIVER := 5
+LIBABIVER := 6
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
@@ -58,9 +58,6 @@ endif
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) := eal.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_hugepage_info.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_memory.c
-ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
-SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_xen_memory.c
-endif
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_thread.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_log.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_vfio.c
@@ -130,7 +127,7 @@ ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)
 CFLAGS_eal_thread.o += -Wno-return-type
 endif
 
-INC := rte_interrupts.h rte_kni_common.h rte_dom0_common.h
+INC := rte_interrupts.h rte_kni_common.h
 
 SYMLINK-$(CONFIG_RTE_EXEC_ENV_LINUXAPP)-include/exec-env := \
 	$(addprefix include/exec-env/,$(INC))
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 48f12f4..d995d03 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -354,7 +354,6 @@ eal_usage(const char *prgname)
 	       "  --"OPT_BASE_VIRTADDR"     Base virtual address\n"
 	       "  --"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"
 	       "\n");
 	/* Allow the application to print its usage message too if hook is set */
 	if ( rte_application_usage_hook ) {
@@ -555,19 +554,6 @@ eal_parse_args(int argc, char **argv)
 			eal_usage(prgname);
 			exit(EXIT_SUCCESS);
 
-		/* long options */
-		case OPT_XEN_DOM0_NUM:
-#ifdef RTE_LIBRTE_XEN_DOM0
-			internal_config.xen_dom0_support = 1;
-#else
-			RTE_LOG(ERR, EAL, "Can't support DPDK app "
-				"running on Dom0, please configure"
-				" RTE_LIBRTE_XEN_DOM0=y\n");
-			ret = -1;
-			goto out;
-#endif
-			break;
-
 		case OPT_HUGE_DIR_NUM:
 			internal_config.hugepage_dir = optarg;
 			break;
@@ -641,15 +627,6 @@ eal_parse_args(int argc, char **argv)
 		goto out;
 	}
 
-	/* --xen-dom0 doesn't make sense with --socket-mem */
-	if (internal_config.xen_dom0_support && internal_config.force_sockets == 1) {
-		RTE_LOG(ERR, EAL, "Options --"OPT_SOCKET_MEM" cannot be specified "
-			"together with --"OPT_XEN_DOM0"\n");
-		eal_usage(prgname);
-		ret = -1;
-		goto out;
-	}
-
 	if (optind >= 0)
 		argv[optind-1] = prgname;
 	ret = optind-1;
@@ -794,7 +771,6 @@ rte_eal_init(int argc, char **argv)
 
 	if (internal_config.no_hugetlbfs == 0 &&
 			internal_config.process_type != RTE_PROC_SECONDARY &&
-			internal_config.xen_dom0_support == 0 &&
 			eal_hugepage_info_init() < 0) {
 		rte_eal_init_alert("Cannot get hugepage information.");
 		rte_errno = EACCES;
diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c
index 5279128..087fad4 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -75,13 +75,6 @@
 
 #define PFN_MASK_SIZE	8
 
-#ifdef RTE_LIBRTE_XEN_DOM0
-int rte_xen_dom0_supported(void)
-{
-	return internal_config.xen_dom0_support;
-}
-#endif
-
 /**
  * @file
  * Huge page mapping under linux
@@ -106,10 +99,6 @@ test_phys_addrs_available(void)
 	uint64_t tmp;
 	phys_addr_t physaddr;
 
-	/* For dom0, phys addresses can always be available */
-	if (rte_xen_dom0_supported())
-		return;
-
 	if (!rte_eal_has_hugepages()) {
 		RTE_LOG(ERR, EAL,
 			"Started without hugepages support, physical addresses not available\n");
@@ -139,29 +128,6 @@ rte_mem_virt2phy(const void *virtaddr)
 	int page_size;
 	off_t offset;
 
-	/* when using dom0, /proc/self/pagemap always returns 0, check in
-	 * dpdk memory by browsing the memsegs */
-	if (rte_xen_dom0_supported()) {
-		struct rte_mem_config *mcfg;
-		struct rte_memseg *memseg;
-		unsigned i;
-
-		mcfg = rte_eal_get_configuration()->mem_config;
-		for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-			memseg = &mcfg->memseg[i];
-			if (memseg->addr == NULL)
-				break;
-			if (virtaddr > memseg->addr &&
-					virtaddr < RTE_PTR_ADD(memseg->addr,
-						memseg->len)) {
-				return memseg->phys_addr +
-					RTE_PTR_DIFF(virtaddr, memseg->addr);
-			}
-		}
-
-		return RTE_BAD_PHYS_ADDR;
-	}
-
 	/* Cannot parse /proc/self/pagemap, no need to log errors everywhere */
 	if (!phys_addrs_available)
 		return RTE_BAD_PHYS_ADDR;
@@ -1067,17 +1033,6 @@ rte_eal_hugepage_init(void)
 		return 0;
 	}
 
-/* check if app runs on Xen Dom0 */
-	if (internal_config.xen_dom0_support) {
-#ifdef RTE_LIBRTE_XEN_DOM0
-		/* use dom0_mm kernel driver to init memory */
-		if (rte_xen_dom0_memory_init() < 0)
-			return -1;
-		else
-			return 0;
-#endif
-	}
-
 	/* calculate total number of hugepages available. at this point we haven't
 	 * yet started sorting them so they all are on socket 0 */
 	for (i = 0; i < (int) internal_config.num_hugepage_sizes; i++) {
@@ -1400,17 +1355,6 @@ rte_eal_hugepage_attach(void)
 
 	test_phys_addrs_available();
 
-	if (internal_config.xen_dom0_support) {
-#ifdef RTE_LIBRTE_XEN_DOM0
-		if (rte_xen_dom0_memory_attach() < 0) {
-			RTE_LOG(ERR, EAL, "Failed to attach memory segments of primary "
-					"process\n");
-			return -1;
-		}
-		return 0;
-#endif
-	}
-
 	fd_zero = open("/dev/zero", O_RDONLY);
 	if (fd_zero < 0) {
 		RTE_LOG(ERR, EAL, "Could not open /dev/zero\n");
diff --git a/lib/librte_eal/linuxapp/eal/eal_xen_memory.c b/lib/librte_eal/linuxapp/eal/eal_xen_memory.c
deleted file mode 100644
index 19db1cb..0000000
--- a/lib/librte_eal/linuxapp/eal/eal_xen_memory.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <errno.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <string.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/queue.h>
-#include <sys/file.h>
-#include <unistd.h>
-#include <limits.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-
-#include <rte_log.h>
-#include <rte_memory.h>
-#include <rte_memzone.h>
-#include <rte_launch.h>
-#include <rte_eal.h>
-#include <rte_eal_memconfig.h>
-#include <rte_per_lcore.h>
-#include <rte_lcore.h>
-#include <rte_common.h>
-#include <rte_string_fns.h>
-
-#include "eal_private.h"
-#include "eal_internal_cfg.h"
-#include "eal_filesystem.h"
-#include <exec-env/rte_dom0_common.h>
-
-#define PAGE_SIZE RTE_PGSIZE_4K
-#define DEFAUL_DOM0_NAME "dom0-mem"
-
-static int xen_fd = -1;
-static const char sys_dir_path[] = "/sys/kernel/mm/dom0-mm/memsize-mB";
-
-/*
- * Try to mmap *size bytes in /dev/zero. If it is successful, return the
- * pointer to the mmap'd area and keep *size unmodified. Else, retry
- * with a smaller zone: decrease *size by mem_size until it reaches
- * 0. In this case, return NULL. Note: this function returns an address
- * which is a multiple of mem_size size.
- */
-static void *
-xen_get_virtual_area(size_t *size, size_t mem_size)
-{
-	void *addr;
-	int fd;
-	long aligned_addr;
-
-	RTE_LOG(DEBUG, EAL, "Ask a virtual area of 0x%zu bytes\n", *size);
-
-	fd = open("/dev/zero", O_RDONLY);
-	if (fd < 0){
-		RTE_LOG(ERR, EAL, "Cannot open /dev/zero\n");
-		return NULL;
-	}
-	do {
-		addr = mmap(NULL, (*size) + mem_size, PROT_READ,
-			MAP_PRIVATE, fd, 0);
-		if (addr == MAP_FAILED)
-			*size -= mem_size;
-	} while (addr == MAP_FAILED && *size > 0);
-
-	if (addr == MAP_FAILED) {
-		close(fd);
-		RTE_LOG(ERR, EAL, "Cannot get a virtual area\n");
-		return NULL;
-	}
-
-	munmap(addr, (*size) + mem_size);
-	close(fd);
-
-	/* align addr to a mem_size boundary */
-	aligned_addr = (uintptr_t)addr;
-	aligned_addr = RTE_ALIGN_CEIL(aligned_addr, mem_size);
-        addr = (void *)(aligned_addr);
-
-	RTE_LOG(DEBUG, EAL, "Virtual area found at %p (size = 0x%zx)\n",
-		addr, *size);
-
-	return addr;
-}
-
-/**
- * Get memory size configuration from /sys/devices/virtual/misc/dom0_mm
- * /memsize-mB/memsize file, and the size unit is mB.
- */
-static int
-get_xen_memory_size(void)
-{
-	char path[PATH_MAX];
-	unsigned long mem_size = 0;
-	static const char *file_name;
-
-	file_name = "memsize";
-	snprintf(path, sizeof(path), "%s/%s",
-			sys_dir_path, file_name);
-
-	if (eal_parse_sysfs_value(path, &mem_size) < 0)
-		return -1;
-
-	if (mem_size == 0)
-		rte_exit(EXIT_FAILURE,"XEN-DOM0:the %s/%s was not"
-			" configured.\n",sys_dir_path, file_name);
-	if (mem_size % 2)
-		rte_exit(EXIT_FAILURE,"XEN-DOM0:the %s/%s must be"
-			" even number.\n",sys_dir_path, file_name);
-
-	if (mem_size > DOM0_CONFIG_MEMSIZE)
-		rte_exit(EXIT_FAILURE,"XEN-DOM0:the %s/%s should not be larger"
-			" than %d mB\n",sys_dir_path, file_name, DOM0_CONFIG_MEMSIZE);
-
-	return mem_size;
-}
-
-/**
- * Based on physical address to caculate MFN in Xen Dom0.
- */
-phys_addr_t
-rte_xen_mem_phy2mch(int32_t memseg_id, const phys_addr_t phy_addr)
-{
-	int mfn_id, i;
-	uint64_t mfn, mfn_offset;
-	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
-	struct rte_memseg *memseg = mcfg->memseg;
-
-	/* find the memory segment owning the physical address */
-	if (memseg_id == -1) {
-		for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-			if ((phy_addr >= memseg[i].phys_addr) &&
-					(phy_addr < memseg[i].phys_addr +
-						memseg[i].len)) {
-				memseg_id = i;
-				break;
-			}
-		}
-		if (memseg_id == -1)
-			return RTE_BAD_PHYS_ADDR;
-	}
-
-	mfn_id = (phy_addr - memseg[memseg_id].phys_addr) / RTE_PGSIZE_2M;
-
-	/*the MFN is contiguous in 2M */
-	mfn_offset = (phy_addr - memseg[memseg_id].phys_addr) %
-					RTE_PGSIZE_2M / PAGE_SIZE;
-	mfn = mfn_offset + memseg[memseg_id].mfn[mfn_id];
-
-	/** return mechine address */
-	return mfn * PAGE_SIZE + phy_addr % PAGE_SIZE;
-}
-
-int
-rte_xen_dom0_memory_init(void)
-{
-	void *vir_addr, *vma_addr = NULL;
-	int err, ret = 0;
-	uint32_t i, requested, mem_size, memseg_idx, num_memseg = 0;
-	size_t vma_len = 0;
-	struct memory_info meminfo;
-	struct memseg_info seginfo[RTE_MAX_MEMSEG];
-	int flags, page_size = getpagesize();
-	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
-	struct rte_memseg *memseg = mcfg->memseg;
-	uint64_t total_mem = internal_config.memory;
-
-	memset(seginfo, 0, sizeof(seginfo));
-	memset(&meminfo, 0, sizeof(struct memory_info));
-
-	mem_size = get_xen_memory_size();
-	requested = (unsigned) (total_mem / 0x100000);
-	if (requested > mem_size)
-		/* if we didn't satisfy total memory requirements */
-		rte_exit(EXIT_FAILURE,"Not enough memory available! Requested: %uMB,"
-				" available: %uMB\n", requested, mem_size);
-	else if (total_mem != 0)
-		mem_size = requested;
-
-	/* Check FD and open once */
-	if (xen_fd < 0) {
-		xen_fd = open(DOM0_MM_DEV, O_RDWR);
-		if (xen_fd < 0) {
-			RTE_LOG(ERR, EAL, "Can not open %s\n",DOM0_MM_DEV);
-			return -1;
-		}
-	}
-
-	meminfo.size = mem_size;
-
-	/* construct memory mangement name for Dom0 */
-	snprintf(meminfo.name, DOM0_NAME_MAX, "%s-%s",
-		internal_config.hugefile_prefix, DEFAUL_DOM0_NAME);
-
-	/* Notify kernel driver to allocate memory */
-	ret = ioctl(xen_fd, RTE_DOM0_IOCTL_PREPARE_MEMSEG, &meminfo);
-	if (ret < 0) {
-		RTE_LOG(ERR, EAL, "XEN DOM0:failed to get memory\n");
-		err = -EIO;
-		goto fail;
-	}
-
-	/* Get number of memory segment from driver */
-	ret = ioctl(xen_fd, RTE_DOM0_IOCTL_GET_NUM_MEMSEG, &num_memseg);
-	if (ret < 0) {
-		RTE_LOG(ERR, EAL, "XEN DOM0:failed to get memseg count.\n");
-		err = -EIO;
-		goto fail;
-	}
-
-	if(num_memseg > RTE_MAX_MEMSEG){
-		RTE_LOG(ERR, EAL, "XEN DOM0: the memseg count %d is greater"
-			" than max memseg %d.\n",num_memseg, RTE_MAX_MEMSEG);
-		err = -EIO;
-		goto fail;
-	}
-
-	/* get all memory segements information */
-	ret = ioctl(xen_fd, RTE_DOM0_IOCTL_GET_MEMSEG_INFO, seginfo);
-	if (ret < 0) {
-		RTE_LOG(ERR, EAL, "XEN DOM0:failed to get memseg info.\n");
-		err = -EIO;
-		goto fail;
-	}
-
-	/* map all memory segments to contiguous user space */
-	for (memseg_idx = 0; memseg_idx < num_memseg; memseg_idx++)
-	{
-		vma_len = seginfo[memseg_idx].size;
-
-		/**
-		 * get the biggest virtual memory area up to vma_len. If it fails,
-		 * vma_addr is NULL, so let the kernel provide the address.
-		 */
-		vma_addr = xen_get_virtual_area(&vma_len, RTE_PGSIZE_2M);
-		if (vma_addr == NULL) {
-			flags = MAP_SHARED;
-			vma_len = RTE_PGSIZE_2M;
-		} else
-			flags = MAP_SHARED | MAP_FIXED;
-
-		seginfo[memseg_idx].size = vma_len;
-		vir_addr = mmap(vma_addr, seginfo[memseg_idx].size,
-			PROT_READ|PROT_WRITE, flags, xen_fd,
-			memseg_idx * page_size);
-		if (vir_addr == MAP_FAILED) {
-			RTE_LOG(ERR, EAL, "XEN DOM0:Could not mmap %s\n",
-				DOM0_MM_DEV);
-			err = -EIO;
-			goto fail;
-		}
-
-		memseg[memseg_idx].addr = vir_addr;
-		memseg[memseg_idx].phys_addr = page_size *
-			seginfo[memseg_idx].pfn ;
-		memseg[memseg_idx].len = seginfo[memseg_idx].size;
-		for ( i = 0; i < seginfo[memseg_idx].size / RTE_PGSIZE_2M; i++)
-			memseg[memseg_idx].mfn[i] = seginfo[memseg_idx].mfn[i];
-
-		/* MFNs are continuous in 2M, so assume that page size is 2M */
-		memseg[memseg_idx].hugepage_sz = RTE_PGSIZE_2M;
-
-		memseg[memseg_idx].nchannel = mcfg->nchannel;
-		memseg[memseg_idx].nrank = mcfg->nrank;
-
-		/* NUMA is not suppoted in Xen Dom0, so only set socket 0*/
-		memseg[memseg_idx].socket_id = 0;
-	}
-
-	return 0;
-fail:
-	if (xen_fd > 0) {
-		close(xen_fd);
-		xen_fd = -1;
-	}
-	return err;
-}
-
-/*
- * This creates the memory mappings in the secondary process to match that of
- * the server process. It goes through each memory segment in the DPDK runtime
- * configuration, mapping them in order to form a contiguous block in the
- * virtual memory space
- */
-int
-rte_xen_dom0_memory_attach(void)
-{
-	const struct rte_mem_config *mcfg;
-	unsigned s = 0; /* s used to track the segment number */
-	int xen_fd = -1;
-	int ret = -1;
-	void *vir_addr;
-	char name[DOM0_NAME_MAX] = {0};
-	int page_size = getpagesize();
-
-	mcfg = rte_eal_get_configuration()->mem_config;
-
-	/* Check FD and open once */
-	if (xen_fd < 0) {
-		xen_fd = open(DOM0_MM_DEV, O_RDWR);
-		if (xen_fd < 0) {
-			RTE_LOG(ERR, EAL, "Can not open %s\n",DOM0_MM_DEV);
-			goto error;
-		}
-	}
-
-	/* construct memory mangement name for Dom0 */
-	snprintf(name, DOM0_NAME_MAX, "%s-%s",
-		internal_config.hugefile_prefix, DEFAUL_DOM0_NAME);
-	/* attach to memory segments of primary process */
-	ret = ioctl(xen_fd, RTE_DOM0_IOCTL_ATTACH_TO_MEMSEG, name);
-	if (ret) {
-		RTE_LOG(ERR, EAL,"attach memory segments fail.\n");
-		goto error;
-	}
-
-	/* map all segments into memory to make sure we get the addrs */
-	for (s = 0; s < RTE_MAX_MEMSEG; ++s) {
-
-		/*
-		 * the first memory segment with len==0 is the one that
-		 * follows the last valid segment.
-		 */
-		if (mcfg->memseg[s].len == 0)
-			break;
-
-		vir_addr = mmap(mcfg->memseg[s].addr, mcfg->memseg[s].len,
-				PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, xen_fd,
-				s * page_size);
-		if (vir_addr == MAP_FAILED) {
-			RTE_LOG(ERR, EAL, "Could not mmap %llu bytes "
-				"in %s to requested address [%p]\n",
-				(unsigned long long)mcfg->memseg[s].len, DOM0_MM_DEV,
-				mcfg->memseg[s].addr);
-			goto error;
-		}
-	}
-	return 0;
-
-error:
-	if (xen_fd >= 0) {
-		close(xen_fd);
-		xen_fd = -1;
-	}
-	return -1;
-}
diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_dom0_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_dom0_common.h
deleted file mode 100644
index d970778..0000000
--- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_dom0_common.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*-
- *   This file is provided under a dual BSD/LGPLv2 license.  When using or
- *   redistributing this file, you may do so under either license.
- *
- *   GNU LESSER GENERAL PUBLIC LICENSE
- *
- *   Copyright(c) 2007-2014 Intel Corporation. All rights reserved.
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of version 2.1 of the GNU Lesser General Public License
- *   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
- *   Lesser General Public License for more details.
- *
- *   You should have received a copy of the GNU Lesser General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *
- *   Contact Information:
- *   Intel Corporation
- *
- *
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *   * Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   * Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in
- *     the documentation and/or other materials provided with the
- *     distribution.
- *   * Neither the name of Intel Corporation nor the names of its
- *     contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#ifndef _RTE_DOM0_COMMON_H_
-#define _RTE_DOM0_COMMON_H_
-
-#ifdef __KERNEL__
-#include <linux/if.h>
-#endif
-
-#define DOM0_NAME_MAX   256
-#define DOM0_MM_DEV   "/dev/dom0_mm"
-
-#define DOM0_CONTIG_NUM_ORDER       9       /**< order of 2M */
-#define DOM0_NUM_MEMSEG             512     /**< Maximum nb. of memory segment. */
-#define DOM0_MEMBLOCK_SIZE          0x200000 /**< size of memory block(2M). */
-#define DOM0_CONFIG_MEMSIZE         4096     /**< Maximum config memory size(4G). */
-#define DOM0_NUM_MEMBLOCK (DOM0_CONFIG_MEMSIZE / 2) /**< Maximum nb. of 2M memory block. */
-
-#define RTE_DOM0_IOCTL_PREPARE_MEMSEG    _IOWR(0, 1 , struct memory_info)
-#define RTE_DOM0_IOCTL_ATTACH_TO_MEMSEG  _IOWR(0, 2 , char *)
-#define RTE_DOM0_IOCTL_GET_NUM_MEMSEG    _IOWR(0, 3, int)
-#define RTE_DOM0_IOCTL_GET_MEMSEG_INFO   _IOWR(0, 4, void *)
-
-/**
- * A structure used to store memory information.
- */
-struct memory_info {
-	char name[DOM0_NAME_MAX];
-	uint64_t size;
-};
-
-/**
- * A structure used to store memory segment information.
- */
-struct memseg_info {
-	uint32_t idx;
-	uint64_t pfn;
-	uint64_t size;
-	uint64_t mfn[DOM0_NUM_MEMBLOCK];
-};
-
-/**
- * A structure used to store memory block information.
- */
-struct memblock_info {
-	uint8_t exchange_flag;
-	uint8_t used;
-	uint64_t vir_addr;
-	uint64_t pfn;
-	uint64_t mfn;
-};
-#endif /* _RTE_DOM0_COMMON_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index 3a8f154..17c8984 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -87,8 +87,6 @@ DPDK_2.0 {
 	rte_thread_get_affinity;
 	rte_thread_set_affinity;
 	rte_vlog;
-	rte_xen_dom0_memory_attach;
-	rte_xen_dom0_memory_init;
 	rte_zmalloc;
 	rte_zmalloc_socket;
 
@@ -118,8 +116,6 @@ DPDK_2.2 {
 	rte_keepalive_dispatch_pings;
 	rte_keepalive_mark_alive;
 	rte_keepalive_register_core;
-	rte_xen_dom0_supported;
-	rte_xen_mem_phy2mch;
 
 } DPDK_2.1;
 
diff --git a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
index 07a19a3..3d5c2f3 100644
--- a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
+++ b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
@@ -33,9 +33,6 @@
 #include <linux/version.h>
 #include <linux/slab.h>
 
-#ifdef CONFIG_XEN_DOM0
-#include <xen/xen.h>
-#endif
 #include <rte_pci_dev_features.h>
 
 #include "compat.h"
@@ -201,52 +198,6 @@ igbuio_pci_release(struct uio_info *info, struct inode *inode)
 	return 0;
 }
 
-#ifdef CONFIG_XEN_DOM0
-static int
-igbuio_dom0_mmap_phys(struct uio_info *info, struct vm_area_struct *vma)
-{
-	int idx;
-
-	idx = (int)vma->vm_pgoff;
-	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-#ifdef HAVE_PTE_MASK_PAGE_IOMAP
-	vma->vm_page_prot.pgprot |= _PAGE_IOMAP;
-#endif
-
-	return remap_pfn_range(vma,
-			vma->vm_start,
-			info->mem[idx].addr >> PAGE_SHIFT,
-			vma->vm_end - vma->vm_start,
-			vma->vm_page_prot);
-}
-
-/**
- * This is uio device mmap method which will use igbuio mmap for Xen
- * Dom0 environment.
- */
-static int
-igbuio_dom0_pci_mmap(struct uio_info *info, struct vm_area_struct *vma)
-{
-	int idx;
-
-	if (vma->vm_pgoff >= MAX_UIO_MAPS)
-		return -EINVAL;
-
-	if (info->mem[vma->vm_pgoff].size == 0)
-		return -EINVAL;
-
-	idx = (int)vma->vm_pgoff;
-	switch (info->mem[idx].memtype) {
-	case UIO_MEM_PHYS:
-		return igbuio_dom0_mmap_phys(info, vma);
-	case UIO_MEM_LOGICAL:
-	case UIO_MEM_VIRTUAL:
-	default:
-		return -EINVAL;
-	}
-}
-#endif
-
 /* Remap pci resources described by bar #pci_bar in uio resource n. */
 static int
 igbuio_pci_setup_iomem(struct pci_dev *dev, struct uio_info *info,
@@ -405,11 +356,6 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 	udev->info.irqcontrol = igbuio_pci_irqcontrol;
 	udev->info.open = igbuio_pci_open;
 	udev->info.release = igbuio_pci_release;
-#ifdef CONFIG_XEN_DOM0
-	/* check if the driver run on Xen Dom0 */
-	if (xen_initial_domain())
-		udev->info.mmap = igbuio_dom0_pci_mmap;
-#endif
 	udev->info.priv = udev;
 	udev->pdev = dev;
 
diff --git a/lib/librte_eal/linuxapp/xen_dom0/Makefile b/lib/librte_eal/linuxapp/xen_dom0/Makefile
deleted file mode 100644
index be51a82..0000000
--- a/lib/librte_eal/linuxapp/xen_dom0/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-#   BSD LICENSE
-#
-#   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
-#   All rights reserved.
-#
-#   Redistribution and use in source and binary forms, with or without
-#   modification, are permitted provided that the following conditions
-#   are met:
-#
-#     * Redistributions of source code must retain the above copyright
-#       notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright
-#       notice, this list of conditions and the following disclaimer in
-#       the documentation and/or other materials provided with the
-#       distribution.
-#     * Neither the name of Intel Corporation nor the names of its
-#       contributors may be used to endorse or promote products derived
-#       from this software without specific prior written permission.
-#
-#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-include $(RTE_SDK)/mk/rte.vars.mk
-
-#
-# module name and path
-#
-MODULE = rte_dom0_mm
-
-#
-# CFLAGS
-#
-MODULE_CFLAGS += -I$(SRCDIR) --param max-inline-insns-single=50
-MODULE_CFLAGS += -I$(RTE_OUTPUT)/include
-MODULE_CFLAGS += -include $(RTE_OUTPUT)/include/rte_config.h
-MODULE_CFLAGS += -Wall -Werror
-
-#
-# all source are stored in SRCS-y
-#
-
-SRCS-y += dom0_mm_misc.c
-
-include $(RTE_SDK)/mk/rte.module.mk
diff --git a/lib/librte_eal/linuxapp/xen_dom0/compat.h b/lib/librte_eal/linuxapp/xen_dom0/compat.h
deleted file mode 100644
index e6eb97f..0000000
--- a/lib/librte_eal/linuxapp/xen_dom0/compat.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Minimal wrappers to allow compiling xen_dom0 on older kernels.
- */
-
-#ifndef RHEL_RELEASE_VERSION
-#define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b))
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \
-	(!(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4)))
-
-#define kstrtoul strict_strtoul
-
-#endif /* < 2.6.39 */
diff --git a/lib/librte_eal/linuxapp/xen_dom0/dom0_mm_dev.h b/lib/librte_eal/linuxapp/xen_dom0/dom0_mm_dev.h
deleted file mode 100644
index 9d5ffb2..0000000
--- a/lib/librte_eal/linuxapp/xen_dom0/dom0_mm_dev.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- * This file is provided under a dual BSD/GPLv2 license.  When using or
- *   redistributing this file, you may do so under either license.
- *
- *   GPL LICENSE SUMMARY
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of version 2 of the GNU General Public License 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, write to the Free Software
- *   Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *   The full GNU General Public License is included in this distribution
- *   in the file called LICENSE.GPL.
- *
- *   Contact Information:
- *   Intel Corporation
- *
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-#ifndef _DOM0_MM_DEV_H_
-#define _DOM0_MM_DEV_H_
-
-#include <linux/wait.h>
-#include <linux/mutex.h>
-#include <linux/sched.h>
-#include <linux/spinlock.h>
-#include <exec-env/rte_dom0_common.h>
-
-#define NUM_MEM_CTX     256  /**< Maximum number of memory context*/
-#define MAX_EXCHANGE_FAIL_TIME 5  /**< Maximum times of allowing exchange fail .*/
-#define MAX_MEMBLOCK_SIZE (2 * DOM0_MEMBLOCK_SIZE)
-#define MAX_NUM_ORDER     (DOM0_CONTIG_NUM_ORDER + 1)
-#define SIZE_PER_BLOCK    2       /**< Size of memory block (2MB).*/
-
-/**
- * A structure describing the private information for a dom0 device.
- */
-struct dom0_mm_dev {
-	struct miscdevice miscdev;
-	uint8_t fail_times;
-	uint32_t used_memsize;
-	uint32_t num_mem_ctx;
-	uint32_t config_memsize;
-	uint32_t num_bigblock;
-	struct  dom0_mm_data *mm_data[NUM_MEM_CTX];
-	struct mutex data_lock;
-};
-
-struct dom0_mm_data{
-	uint32_t refcnt;
-	uint32_t num_memseg; /**< Number of memory segment. */
-	uint32_t mem_size;   /**< Size of requesting memory. */
-
-	char name[DOM0_NAME_MAX];
-
-	/** Store global memory block IDs used by an instance */
-	uint32_t block_num[DOM0_NUM_MEMBLOCK];
-
-	/** Store memory block information.*/
-	struct memblock_info block_info[DOM0_NUM_MEMBLOCK];
-
-	/** Store memory segment information.*/
-	struct memseg_info  seg_info[DOM0_NUM_MEMSEG];
-};
-
-#define XEN_ERR(args...) printk(KERN_DEBUG "XEN_DOM0: Error: " args)
-#define XEN_PRINT(args...) printk(KERN_DEBUG "XEN_DOM0: " args)
-#endif
diff --git a/lib/librte_eal/linuxapp/xen_dom0/dom0_mm_misc.c b/lib/librte_eal/linuxapp/xen_dom0/dom0_mm_misc.c
deleted file mode 100644
index 79630ba..0000000
--- a/lib/librte_eal/linuxapp/xen_dom0/dom0_mm_misc.c
+++ /dev/null
@@ -1,780 +0,0 @@
-/*-
- * This file is provided under a dual BSD/GPLv2 license.  When using or
- *   redistributing this file, you may do so under either license.
- *
- *   GPL LICENSE SUMMARY
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of version 2 of the GNU General Public License 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, write to the Free Software
- *   Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *   The full GNU General Public License is included in this distribution
- *   in the file called LICENSE.GPL.
- *
- *   Contact Information:
- *   Intel Corporation
- *
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-#include <linux/fs.h>
-#include <linux/device.h>
-#include <linux/errno.h>
-#include <linux/vmalloc.h>
-#include <linux/mm.h>
-#include <linux/version.h>
-
-#include <xen/xen.h>
-#include <xen/page.h>
-#include <xen/xen-ops.h>
-#include <xen/interface/memory.h>
-
-#include <exec-env/rte_dom0_common.h>
-
-#include "compat.h"
-#include "dom0_mm_dev.h"
-
-MODULE_LICENSE("Dual BSD/GPL");
-MODULE_AUTHOR("Intel Corporation");
-MODULE_DESCRIPTION("Kernel Module for supporting DPDK running on Xen Dom0");
-
-static struct dom0_mm_dev dom0_dev;
-static struct kobject *dom0_kobj = NULL;
-
-static struct memblock_info *rsv_mm_info;
-
-/* Default configuration for reserved memory size(2048 MB). */
-static uint32_t rsv_memsize = 2048;
-
-static int dom0_open(struct inode *inode, struct file *file);
-static int dom0_release(struct inode *inode, struct file *file);
-static int dom0_ioctl(struct file *file, unsigned int ioctl_num,
-		unsigned long ioctl_param);
-static int dom0_mmap(struct file *file, struct vm_area_struct *vma);
-static int dom0_memory_free(uint32_t size);
-static int dom0_memory_release(struct dom0_mm_data *mm_data);
-
-static const struct file_operations data_fops = {
-	.owner = THIS_MODULE,
-	.open = dom0_open,
-	.release = dom0_release,
-	.mmap = dom0_mmap,
-	.unlocked_ioctl = (void *)dom0_ioctl,
-};
-
-static ssize_t
-show_memsize_rsvd(struct device *dev, struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, 10, "%u\n", dom0_dev.used_memsize);
-}
-
-static ssize_t
-show_memsize(struct device *dev, struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, 10, "%u\n", dom0_dev.config_memsize);
-}
-
-static ssize_t
-store_memsize(struct device *dev, struct device_attribute *attr,
-            const char *buf, size_t count)
-{
-	int err = 0;
-	unsigned long mem_size;
-
-	if (0 != kstrtoul(buf, 0, &mem_size))
-		return  -EINVAL;
-
-	mutex_lock(&dom0_dev.data_lock);
-	if (0 == mem_size) {
-		err = -EINVAL;
-		goto fail;
-	} else if (mem_size > (rsv_memsize - dom0_dev.used_memsize)) {
-		XEN_ERR("configure memory size fail\n");
-		err = -EINVAL;
-		goto fail;
-	} else
-		dom0_dev.config_memsize = mem_size;
-
-fail:
-	mutex_unlock(&dom0_dev.data_lock);
-	return err ? err : count;
-}
-
-static DEVICE_ATTR(memsize, S_IRUGO | S_IWUSR, show_memsize, store_memsize);
-static DEVICE_ATTR(memsize_rsvd, S_IRUGO, show_memsize_rsvd, NULL);
-
-static struct attribute *dev_attrs[] = {
-	&dev_attr_memsize.attr,
-	&dev_attr_memsize_rsvd.attr,
-	NULL,
-};
-
-/* the memory size unit is MB */
-static const struct attribute_group dev_attr_grp = {
-	.name = "memsize-mB",
-	.attrs = dev_attrs,
-};
-
-
-static void
-sort_viraddr(struct memblock_info *mb, int cnt)
-{
-	int i,j;
-	uint64_t tmp_pfn;
-	uint64_t tmp_viraddr;
-
-	/*sort virtual address and pfn */
-	for(i = 0; i < cnt; i ++) {
-		for(j = cnt - 1; j > i; j--) {
-			if(mb[j].pfn < mb[j - 1].pfn) {
-				tmp_pfn = mb[j - 1].pfn;
-				mb[j - 1].pfn = mb[j].pfn;
-				mb[j].pfn = tmp_pfn;
-
-				tmp_viraddr = mb[j - 1].vir_addr;
-				mb[j - 1].vir_addr = mb[j].vir_addr;
-				mb[j].vir_addr = tmp_viraddr;
-			}
-		}
-	}
-}
-
-static int
-dom0_find_memdata(const char * mem_name)
-{
-	unsigned i;
-	int idx = -1;
-	for(i = 0; i< NUM_MEM_CTX; i++) {
-		if(dom0_dev.mm_data[i] == NULL)
-			continue;
-		if (!strncmp(dom0_dev.mm_data[i]->name, mem_name,
-			sizeof(char) * DOM0_NAME_MAX)) {
-			idx = i;
-			break;
-		}
-	}
-
-	return idx;
-}
-
-static int
-dom0_find_mempos(void)
-{
-	unsigned i;
-	int idx = -1;
-
-	for(i = 0; i< NUM_MEM_CTX; i++) {
-		if(dom0_dev.mm_data[i] == NULL){
-			idx = i;
-			break;
-		}
-	}
-
-	return idx;
-}
-
-static int
-dom0_memory_release(struct dom0_mm_data *mm_data)
-{
-	int idx;
-	uint32_t  num_block, block_id;
-
-	/* each memory block is 2M */
-	num_block = mm_data->mem_size / SIZE_PER_BLOCK;
-	if (num_block == 0)
-		return -EINVAL;
-
-	/* reset global memory data */
-	idx = dom0_find_memdata(mm_data->name);
-	if (idx >= 0) {
-		dom0_dev.used_memsize -= mm_data->mem_size;
-		dom0_dev.mm_data[idx] = NULL;
-		dom0_dev.num_mem_ctx--;
-	}
-
-	/* reset these memory blocks status as free */
-	for (idx = 0; idx < num_block; idx++) {
-		block_id = mm_data->block_num[idx];
-		rsv_mm_info[block_id].used = 0;
-	}
-
-	memset(mm_data, 0, sizeof(struct dom0_mm_data));
-	vfree(mm_data);
-	return 0;
-}
-
-static int
-dom0_memory_free(uint32_t rsv_size)
-{
-	uint64_t vstart, vaddr;
-	uint32_t i, num_block, size;
-
-	if (!xen_pv_domain())
-		return -1;
-
-	/* each memory block is 2M */
-	num_block = rsv_size / SIZE_PER_BLOCK;
-	if (num_block == 0)
-		return -EINVAL;
-
-	/* free all memory blocks of size of 4M and destroy contiguous region */
-	for (i = 0; i < dom0_dev.num_bigblock * 2; i += 2) {
-		vstart = rsv_mm_info[i].vir_addr;
-		if (vstart) {
-		#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
-			if (rsv_mm_info[i].exchange_flag)
-				xen_destroy_contiguous_region(vstart,
-						DOM0_CONTIG_NUM_ORDER);
-			if (rsv_mm_info[i + 1].exchange_flag)
-				xen_destroy_contiguous_region(vstart +
-						DOM0_MEMBLOCK_SIZE,
-						DOM0_CONTIG_NUM_ORDER);
-		#else
-			if (rsv_mm_info[i].exchange_flag)
-				xen_destroy_contiguous_region(rsv_mm_info[i].pfn
-					* PAGE_SIZE,
-					DOM0_CONTIG_NUM_ORDER);
-			if (rsv_mm_info[i + 1].exchange_flag)
-				xen_destroy_contiguous_region(rsv_mm_info[i].pfn
-					* PAGE_SIZE + DOM0_MEMBLOCK_SIZE,
-					DOM0_CONTIG_NUM_ORDER);
-		#endif
-
-			size = DOM0_MEMBLOCK_SIZE * 2;
-			vaddr = vstart;
-			while (size > 0) {
-				ClearPageReserved(virt_to_page(vaddr));
-				vaddr += PAGE_SIZE;
-				size -= PAGE_SIZE;
-			}
-			free_pages(vstart, MAX_NUM_ORDER);
-		}
-	}
-
-	/* free all memory blocks size of 2M and destroy contiguous region */
-	for (; i < num_block; i++) {
-		vstart = rsv_mm_info[i].vir_addr;
-		if (vstart) {
-			if (rsv_mm_info[i].exchange_flag)
-				xen_destroy_contiguous_region(vstart,
-					DOM0_CONTIG_NUM_ORDER);
-
-			size = DOM0_MEMBLOCK_SIZE;
-			vaddr = vstart;
-			while (size > 0) {
-				ClearPageReserved(virt_to_page(vaddr));
-				vaddr += PAGE_SIZE;
-				size -= PAGE_SIZE;
-			}
-			free_pages(vstart, DOM0_CONTIG_NUM_ORDER);
-		}
-	}
-
-	memset(rsv_mm_info, 0, sizeof(struct memblock_info) * num_block);
-	vfree(rsv_mm_info);
-	rsv_mm_info = NULL;
-
-	return 0;
-}
-
-static void
-find_free_memory(uint32_t count, struct dom0_mm_data *mm_data)
-{
-	uint32_t i = 0;
-	uint32_t j = 0;
-
-	while ((i < count) && (j < rsv_memsize / SIZE_PER_BLOCK)) {
-		if (rsv_mm_info[j].used == 0) {
-			mm_data->block_info[i].pfn = rsv_mm_info[j].pfn;
-			mm_data->block_info[i].vir_addr =
-				rsv_mm_info[j].vir_addr;
-			mm_data->block_info[i].mfn = rsv_mm_info[j].mfn;
-			mm_data->block_info[i].exchange_flag =
-				rsv_mm_info[j].exchange_flag;
-			mm_data->block_num[i] = j;
-			rsv_mm_info[j].used = 1;
-			i++;
-		}
-		j++;
-	}
-}
-
-/**
- * Find all memory segments in which physical addresses are contiguous.
- */
-static void
-find_memseg(int count, struct dom0_mm_data * mm_data)
-{
-	int i = 0;
-	int j, k, idx = 0;
-	uint64_t zone_len, pfn, num_block;
-
-	while(i < count) {
-		if (mm_data->block_info[i].exchange_flag == 0) {
-			i++;
-			continue;
-		}
-		k = 0;
-		pfn = mm_data->block_info[i].pfn;
-		mm_data->seg_info[idx].pfn = pfn;
-		mm_data->seg_info[idx].mfn[k] = mm_data->block_info[i].mfn;
-
-		for (j = i + 1; j < count; j++) {
-
-			/* ignore exchange fail memory block */
-			if (mm_data->block_info[j].exchange_flag == 0)
-				break;
-
-			if (mm_data->block_info[j].pfn !=
-				(mm_data->block_info[j - 1].pfn +
-					 DOM0_MEMBLOCK_SIZE / PAGE_SIZE))
-			    break;
-			++k;
-			mm_data->seg_info[idx].mfn[k] = mm_data->block_info[j].mfn;
-		}
-
-		num_block = j - i;
-		zone_len = num_block * DOM0_MEMBLOCK_SIZE;
-		mm_data->seg_info[idx].size = zone_len;
-
-		XEN_PRINT("memseg id=%d, size=0x%llx\n", idx, zone_len);
-		i = i+ num_block;
-		idx++;
-		if (idx == DOM0_NUM_MEMSEG)
-			break;
-	}
-	mm_data->num_memseg = idx;
-}
-
-static int
-dom0_memory_reserve(uint32_t rsv_size)
-{
-	uint64_t pfn, vstart, vaddr;
-	uint32_t i, num_block, size, allocated_size = 0;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
-	dma_addr_t dma_handle;
-#endif
-
-	/* 2M as memory block */
-	num_block = rsv_size / SIZE_PER_BLOCK;
-
-	rsv_mm_info = vmalloc(sizeof(struct memblock_info) * num_block);
-	if (!rsv_mm_info) {
-		XEN_ERR("Unable to allocate device memory information\n");
-		return -ENOMEM;
-	}
-	memset(rsv_mm_info, 0, sizeof(struct memblock_info) * num_block);
-
-	/* try alloc size of 4M once */
-	for (i = 0; i < num_block; i += 2) {
-		vstart = (unsigned long)
-			__get_free_pages(GFP_ATOMIC, MAX_NUM_ORDER);
-		if (vstart == 0)
-			break;
-
-		dom0_dev.num_bigblock = i / 2 + 1;
-		allocated_size =  SIZE_PER_BLOCK * (i + 2);
-
-		/* size of 4M */
-		size = DOM0_MEMBLOCK_SIZE * 2;
-
-		vaddr = vstart;
-		while (size > 0) {
-			SetPageReserved(virt_to_page(vaddr));
-			vaddr += PAGE_SIZE;
-			size -= PAGE_SIZE;
-		}
-
-		pfn = virt_to_pfn(vstart);
-		rsv_mm_info[i].pfn = pfn;
-		rsv_mm_info[i].vir_addr = vstart;
-		rsv_mm_info[i + 1].pfn =
-				pfn + DOM0_MEMBLOCK_SIZE / PAGE_SIZE;
-		rsv_mm_info[i + 1].vir_addr =
-				vstart + DOM0_MEMBLOCK_SIZE;
-	}
-
-	/*if it failed to alloc 4M, and continue to alloc 2M once */
-	for (; i < num_block; i++) {
-		vstart = (unsigned long)
-			__get_free_pages(GFP_ATOMIC, DOM0_CONTIG_NUM_ORDER);
-		if (vstart == 0) {
-			XEN_ERR("allocate memory fail.\n");
-			dom0_memory_free(allocated_size);
-			return -ENOMEM;
-		}
-
-		allocated_size += SIZE_PER_BLOCK;
-
-		size = DOM0_MEMBLOCK_SIZE;
-		vaddr = vstart;
-		while (size > 0) {
-			SetPageReserved(virt_to_page(vaddr));
-			vaddr += PAGE_SIZE;
-			size -= PAGE_SIZE;
-		}
-		pfn = virt_to_pfn(vstart);
-		rsv_mm_info[i].pfn = pfn;
-		rsv_mm_info[i].vir_addr = vstart;
-	}
-
-	sort_viraddr(rsv_mm_info, num_block);
-
-	for (i = 0; i< num_block; i++) {
-
-		/*
-		 * This API is used to exchage MFN for getting a block of
-		 * contiguous physical addresses, its maximum size is 2M.
-		 */
-	#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
-		if (xen_create_contiguous_region(rsv_mm_info[i].vir_addr,
-				DOM0_CONTIG_NUM_ORDER, 0) == 0) {
-	#else
-		if (xen_create_contiguous_region(rsv_mm_info[i].pfn * PAGE_SIZE,
-				DOM0_CONTIG_NUM_ORDER, 0, &dma_handle) == 0) {
-	#endif
-			rsv_mm_info[i].exchange_flag = 1;
-			rsv_mm_info[i].mfn =
-				pfn_to_mfn(rsv_mm_info[i].pfn);
-			rsv_mm_info[i].used = 0;
-		} else {
-			XEN_ERR("exchange memeory fail\n");
-			rsv_mm_info[i].exchange_flag = 0;
-			dom0_dev.fail_times++;
-			if (dom0_dev.fail_times > MAX_EXCHANGE_FAIL_TIME) {
-				dom0_memory_free(rsv_size);
-				return  -EFAULT;
-			}
-		}
-	}
-
-	return 0;
-}
-
-static int
-dom0_prepare_memsegs(struct memory_info *meminfo, struct dom0_mm_data *mm_data)
-{
-	uint32_t num_block;
-	int idx;
-
-	/* check if there is a free name buffer */
-	memcpy(mm_data->name, meminfo->name, DOM0_NAME_MAX);
-	mm_data->name[DOM0_NAME_MAX - 1] = '\0';
-	idx = dom0_find_mempos();
-	if (idx < 0)
-		return -1;
-
-	num_block = meminfo->size / SIZE_PER_BLOCK;
-	/* find free memory and new memory segments*/
-	find_free_memory(num_block, mm_data);
-	find_memseg(num_block, mm_data);
-
-	/* update private memory data */
-	mm_data->refcnt++;
-	mm_data->mem_size = meminfo->size;
-
-	/* update global memory data */
-	dom0_dev.mm_data[idx] = mm_data;
-	dom0_dev.num_mem_ctx++;
-	dom0_dev.used_memsize += mm_data->mem_size;
-
-	return 0;
-}
-
-static int
-dom0_check_memory (struct memory_info *meminfo)
-{
-	int idx;
-	uint64_t mem_size;
-
-	/* round memory size to the next even number. */
-	if (meminfo->size % 2)
-		++meminfo->size;
-
-	mem_size = meminfo->size;
-	if (dom0_dev.num_mem_ctx > NUM_MEM_CTX) {
-		XEN_ERR("Memory data space is full in Dom0 driver\n");
-		return -1;
-	}
-	idx = dom0_find_memdata(meminfo->name);
-	if (idx >= 0) {
-		XEN_ERR("Memory data name %s has already exsited in Dom0 driver.\n",
-			meminfo->name);
-		return -1;
-	}
-	if ((dom0_dev.used_memsize + mem_size) > rsv_memsize) {
-		XEN_ERR("Total size can't be larger than reserved size.\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-static int __init
-dom0_init(void)
-{
-	if (!xen_domain())
-		return -ENODEV;
-
-	if (rsv_memsize > DOM0_CONFIG_MEMSIZE) {
-		XEN_ERR("The reserved memory size cannot be greater than %d\n",
-			DOM0_CONFIG_MEMSIZE);
-		return -EINVAL;
-	}
-
-	/* Setup the misc device */
-	dom0_dev.miscdev.minor = MISC_DYNAMIC_MINOR;
-	dom0_dev.miscdev.name = "dom0_mm";
-	dom0_dev.miscdev.fops = &data_fops;
-
-	/* register misc char device */
-	if (misc_register(&dom0_dev.miscdev) != 0) {
-		XEN_ERR("Misc device registration failed\n");
-		return -EPERM;
-	}
-
-	mutex_init(&dom0_dev.data_lock);
-	dom0_kobj = kobject_create_and_add("dom0-mm", mm_kobj);
-
-	if (!dom0_kobj) {
-		XEN_ERR("dom0-mm object creation failed\n");
-		misc_deregister(&dom0_dev.miscdev);
-		return -ENOMEM;
-	}
-
-	if (sysfs_create_group(dom0_kobj, &dev_attr_grp)) {
-		kobject_put(dom0_kobj);
-		misc_deregister(&dom0_dev.miscdev);
-		return -EPERM;
-	}
-
-	if (dom0_memory_reserve(rsv_memsize) < 0) {
-		sysfs_remove_group(dom0_kobj, &dev_attr_grp);
-		kobject_put(dom0_kobj);
-		misc_deregister(&dom0_dev.miscdev);
-		return -ENOMEM;
-	}
-
-	XEN_PRINT("####### DPDK Xen Dom0 module loaded  #######\n");
-
-	return 0;
-}
-
-static void __exit
-dom0_exit(void)
-{
-	if (rsv_mm_info != NULL)
-		dom0_memory_free(rsv_memsize);
-
-	sysfs_remove_group(dom0_kobj, &dev_attr_grp);
-	kobject_put(dom0_kobj);
-	misc_deregister(&dom0_dev.miscdev);
-
-	XEN_PRINT("####### DPDK Xen Dom0 module unloaded  #######\n");
-}
-
-static int
-dom0_open(struct inode *inode, struct file *file)
-{
-	file->private_data = NULL;
-
-	XEN_PRINT(KERN_INFO "/dev/dom0_mm opened\n");
-	return 0;
-}
-
-static int
-dom0_release(struct inode *inode, struct file *file)
-{
-	int ret = 0;
-	struct dom0_mm_data *mm_data = file->private_data;
-
-	if (mm_data == NULL)
-		return ret;
-
-	mutex_lock(&dom0_dev.data_lock);
-	if (--mm_data->refcnt == 0)
-		ret = dom0_memory_release(mm_data);
-	mutex_unlock(&dom0_dev.data_lock);
-
-	file->private_data = NULL;
-	XEN_PRINT(KERN_INFO "/dev/dom0_mm closed\n");
-	return ret;
-}
-
-static int
-dom0_mmap(struct file *file, struct vm_area_struct *vm)
-{
-	int status = 0;
-	uint32_t idx = vm->vm_pgoff;
-	uint64_t pfn, size = vm->vm_end - vm->vm_start;
-	struct dom0_mm_data *mm_data = file->private_data;
-
-	if(mm_data == NULL)
-		return -EINVAL;
-
-	mutex_lock(&dom0_dev.data_lock);
-	if (idx >= mm_data->num_memseg) {
-		mutex_unlock(&dom0_dev.data_lock);
-		return -EINVAL;
-	}
-
-	if (size > mm_data->seg_info[idx].size){
-		mutex_unlock(&dom0_dev.data_lock);
-		return -EINVAL;
-	}
-
-	XEN_PRINT("mmap memseg idx =%d,size = 0x%llx\n", idx, size);
-
-	pfn = mm_data->seg_info[idx].pfn;
-	mutex_unlock(&dom0_dev.data_lock);
-
-	status = remap_pfn_range(vm, vm->vm_start, pfn, size, PAGE_SHARED);
-
-	return status;
-}
-static int
-dom0_ioctl(struct file *file,
-	unsigned int ioctl_num,
-	unsigned long ioctl_param)
-{
-	int idx, ret;
-	char name[DOM0_NAME_MAX] = {0};
-	struct memory_info meminfo;
-	struct dom0_mm_data *mm_data = file->private_data;
-
-	XEN_PRINT("IOCTL num=0x%0x param=0x%0lx \n", ioctl_num, ioctl_param);
-
-	/**
-	 * Switch according to the ioctl called
-	 */
-	switch _IOC_NR(ioctl_num) {
-	case _IOC_NR(RTE_DOM0_IOCTL_PREPARE_MEMSEG):
-		ret = copy_from_user(&meminfo, (void *)ioctl_param,
-			sizeof(struct memory_info));
-		if (ret)
-			return  -EFAULT;
-
-		if (mm_data != NULL) {
-			XEN_ERR("Cannot create memory segment for the same"
-				" file descriptor\n");
-			return -EINVAL;
-		}
-
-		/* Allocate private data */
-		mm_data = vmalloc(sizeof(struct dom0_mm_data));
-		if (!mm_data) {
-			XEN_ERR("Unable to allocate device private data\n");
-			return -ENOMEM;
-		}
-		memset(mm_data, 0, sizeof(struct dom0_mm_data));
-
-		mutex_lock(&dom0_dev.data_lock);
-		/* check if we can allocate memory*/
-		if (dom0_check_memory(&meminfo) < 0) {
-			mutex_unlock(&dom0_dev.data_lock);
-			vfree(mm_data);
-			return -EINVAL;
-		}
-
-		/* allocate memory and created memory segments*/
-		if (dom0_prepare_memsegs(&meminfo, mm_data) < 0) {
-			XEN_ERR("create memory segment fail.\n");
-			mutex_unlock(&dom0_dev.data_lock);
-			return -EIO;
-		}
-
-		file->private_data = mm_data;
-		mutex_unlock(&dom0_dev.data_lock);
-		break;
-
-	/* support multiple process in term of memory mapping*/
-	case _IOC_NR(RTE_DOM0_IOCTL_ATTACH_TO_MEMSEG):
-		ret = copy_from_user(name, (void *)ioctl_param,
-				sizeof(char) * DOM0_NAME_MAX);
-		if (ret)
-			return -EFAULT;
-
-		mutex_lock(&dom0_dev.data_lock);
-		idx = dom0_find_memdata(name);
-		if (idx < 0) {
-			mutex_unlock(&dom0_dev.data_lock);
-			return -EINVAL;
-		}
-
-		mm_data = dom0_dev.mm_data[idx];
-		mm_data->refcnt++;
-		file->private_data = mm_data;
-		mutex_unlock(&dom0_dev.data_lock);
-		break;
-
-	case _IOC_NR(RTE_DOM0_IOCTL_GET_NUM_MEMSEG):
-		ret = copy_to_user((void *)ioctl_param, &mm_data->num_memseg,
-				sizeof(int));
-		if (ret)
-			return -EFAULT;
-		break;
-
-	case _IOC_NR(RTE_DOM0_IOCTL_GET_MEMSEG_INFO):
-		ret = copy_to_user((void *)ioctl_param,
-				&mm_data->seg_info[0],
-				sizeof(struct memseg_info) *
-				mm_data->num_memseg);
-		if (ret)
-			return -EFAULT;
-		break;
-	default:
-		XEN_PRINT("IOCTL default \n");
-		break;
-	}
-
-	return 0;
-}
-
-module_init(dom0_init);
-module_exit(dom0_exit);
-
-module_param(rsv_memsize, uint, S_IRUGO | S_IWUSR);
-MODULE_PARM_DESC(rsv_memsize, "Xen-dom0 reserved memory size(MB).\n");
diff --git a/pkg/dpdk.spec b/pkg/dpdk.spec
index 95c3335..fd1b5ef 100644
--- a/pkg/dpdk.spec
+++ b/pkg/dpdk.spec
@@ -52,9 +52,6 @@ ExclusiveArch: i686 x86_64 aarch64
 %endif
 
 BuildRequires: kernel-devel, kernel-headers, libpcap-devel
-%ifarch i686 x86_64
-BuildRequires: xen-devel
-%endif
 BuildRequires: doxygen, python-sphinx, inkscape
 BuildRequires: texlive-collection-latexextra
 
-- 
2.7.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v2 5/6] eal: remove API rte_mem_phy2mch
  @ 2017-09-14  2:40  3% ` Jianfeng Tan
  2017-09-14  2:40  1% ` [dpdk-dev] [PATCH v2 6/6] eal: remove xen dom0 support Jianfeng Tan
  1 sibling, 0 replies; 200+ results
From: Jianfeng Tan @ 2017-09-14  2:40 UTC (permalink / raw)
  To: dev
  Cc: xen-devel, thomas, john.mcnamara, jerin.jacob, shahafs, wei.liu2,
	joao.m.martins, bruce.richardson, Jianfeng Tan

Previously, to get MFN address in dom0, this API is a wrapper to
obtain the "physical address".

As we will removed xen dom0 support, this API is not necessary.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
 doc/guides/rel_notes/release_17_11.rst     |  2 ++
 drivers/net/e1000/em_rxtx.c                |  4 ++--
 drivers/net/e1000/igb_rxtx.c               |  4 ++--
 drivers/net/fm10k/fm10k_ethdev.c           |  4 ++--
 drivers/net/i40e/i40e_ethdev.c             |  2 +-
 drivers/net/i40e/i40e_fdir.c               |  2 +-
 drivers/net/i40e/i40e_rxtx.c               |  8 ++++----
 drivers/net/ixgbe/ixgbe_rxtx.c             |  4 ++--
 drivers/net/sfc/sfc.c                      |  2 +-
 lib/librte_eal/common/include/rte_memory.h | 30 ------------------------------
 lib/librte_mempool/rte_mempool.c           |  3 ---
 11 files changed, 17 insertions(+), 48 deletions(-)

diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 170f4f9..8534947 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -110,6 +110,8 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+   * ``rte_mem_phy2mch`` was used in xen dom0 to obtain the physical address;
+     remove this API as xen dom0 support was removed.
 
 ABI Changes
 -----------
diff --git a/drivers/net/e1000/em_rxtx.c b/drivers/net/e1000/em_rxtx.c
index 31819c5..a0f63a7 100644
--- a/drivers/net/e1000/em_rxtx.c
+++ b/drivers/net/e1000/em_rxtx.c
@@ -1289,7 +1289,7 @@ eth_em_tx_queue_setup(struct rte_eth_dev *dev,
 	txq->port_id = dev->data->port_id;
 
 	txq->tdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_TDT(queue_idx));
-	txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+	txq->tx_ring_phys_addr = tz->phys_addr;
 	txq->tx_ring = (struct e1000_data_desc *) tz->addr;
 
 	PMD_INIT_LOG(DEBUG, "sw_ring=%p hw_ring=%p dma_addr=0x%"PRIx64,
@@ -1416,7 +1416,7 @@ eth_em_rx_queue_setup(struct rte_eth_dev *dev,
 
 	rxq->rdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDT(queue_idx));
 	rxq->rdh_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDH(queue_idx));
-	rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+	rxq->rx_ring_phys_addr = rz->phys_addr;
 	rxq->rx_ring = (struct e1000_rx_desc *) rz->addr;
 
 	PMD_INIT_LOG(DEBUG, "sw_ring=%p hw_ring=%p dma_addr=0x%"PRIx64,
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index 1c80a2a..0fccb5d 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -1530,7 +1530,7 @@ eth_igb_tx_queue_setup(struct rte_eth_dev *dev,
 	txq->port_id = dev->data->port_id;
 
 	txq->tdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_TDT(txq->reg_idx));
-	txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+	txq->tx_ring_phys_addr = tz->phys_addr;
 
 	txq->tx_ring = (union e1000_adv_tx_desc *) tz->addr;
 	/* Allocate software ring */
@@ -1667,7 +1667,7 @@ eth_igb_rx_queue_setup(struct rte_eth_dev *dev,
 	}
 	rxq->rdt_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDT(rxq->reg_idx));
 	rxq->rdh_reg_addr = E1000_PCI_REG_ADDR(hw, E1000_RDH(rxq->reg_idx));
-	rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+	rxq->rx_ring_phys_addr = rz->phys_addr;
 	rxq->rx_ring = (union e1000_adv_rx_desc *) rz->addr;
 
 	/* Allocate software ring. */
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index e60d3a3..15ea2a5 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -1887,7 +1887,7 @@ fm10k_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
 		return -ENOMEM;
 	}
 	q->hw_ring = mz->addr;
-	q->hw_ring_phys_addr = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
+	q->hw_ring_phys_addr = mz->phys_addr;
 
 	/* Check if number of descs satisfied Vector requirement */
 	if (!rte_is_power_of_2(nb_desc)) {
@@ -2047,7 +2047,7 @@ fm10k_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
 		return -ENOMEM;
 	}
 	q->hw_ring = mz->addr;
-	q->hw_ring_phys_addr = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
+	q->hw_ring_phys_addr = mz->phys_addr;
 
 	/*
 	 * allocate memory for the RS bit tracker. Enough slots to hold the
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index f12aefa..f30b4f5 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3769,7 +3769,7 @@ i40e_allocate_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw,
 
 	mem->size = size;
 	mem->va = mz->addr;
-	mem->pa = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
+	mem->pa = mz->phys_addr;
 	mem->zone = (const void *)mz;
 	PMD_DRV_LOG(DEBUG,
 		"memzone %s allocated with physical address: %"PRIu64,
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index 8013add..70dae92 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -249,7 +249,7 @@ i40e_fdir_setup(struct i40e_pf *pf)
 		goto fail_mem;
 	}
 	pf->fdir.prg_pkt = mz->addr;
-	pf->fdir.dma_addr = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
+	pf->fdir.dma_addr = mz->phys_addr;
 
 	pf->fdir.match_counter_index = I40E_COUNTER_INDEX_FDIR(hw->pf_id);
 	PMD_DRV_LOG(INFO, "FDIR setup successfully, with programming queue %u.",
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index f571e79..344c11c 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1822,7 +1822,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
 	/* Zero all the descriptors in the ring. */
 	memset(rz->addr, 0, ring_size);
 
-	rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+	rxq->rx_ring_phys_addr = rz->phys_addr;
 	rxq->rx_ring = (union i40e_rx_desc *)rz->addr;
 
 	len = (uint16_t)(nb_desc + RTE_PMD_I40E_RX_MAX_BURST);
@@ -2159,7 +2159,7 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
 	txq->vsi = vsi;
 	txq->tx_deferred_start = tx_conf->tx_deferred_start;
 
-	txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+	txq->tx_ring_phys_addr = tz->phys_addr;
 	txq->tx_ring = (struct i40e_tx_desc *)tz->addr;
 
 	/* Allocate software ring */
@@ -2671,7 +2671,7 @@ i40e_fdir_setup_tx_resources(struct i40e_pf *pf)
 	txq->reg_idx = pf->fdir.fdir_vsi->base_queue;
 	txq->vsi = pf->fdir.fdir_vsi;
 
-	txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+	txq->tx_ring_phys_addr = tz->phys_addr;
 	txq->tx_ring = (struct i40e_tx_desc *)tz->addr;
 	/*
 	 * don't need to allocate software ring and reset for the fdir
@@ -2727,7 +2727,7 @@ i40e_fdir_setup_rx_resources(struct i40e_pf *pf)
 	rxq->reg_idx = pf->fdir.fdir_vsi->base_queue;
 	rxq->vsi = pf->fdir.fdir_vsi;
 
-	rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+	rxq->rx_ring_phys_addr = rz->phys_addr;
 	rxq->rx_ring = (union i40e_rx_desc *)rz->addr;
 
 	/*
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 64bff25..ac1415b 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -2548,7 +2548,7 @@ ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
 	else
 		txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw, IXGBE_TDT(txq->reg_idx));
 
-	txq->tx_ring_phys_addr = rte_mem_phy2mch(tz->memseg_id, tz->phys_addr);
+	txq->tx_ring_phys_addr = tz->phys_addr;
 	txq->tx_ring = (union ixgbe_adv_tx_desc *) tz->addr;
 
 	/* Allocate software ring */
@@ -2850,7 +2850,7 @@ ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
 			IXGBE_PCI_REG_ADDR(hw, IXGBE_RDH(rxq->reg_idx));
 	}
 
-	rxq->rx_ring_phys_addr = rte_mem_phy2mch(rz->memseg_id, rz->phys_addr);
+	rxq->rx_ring_phys_addr = rz->phys_addr;
 	rxq->rx_ring = (union ixgbe_adv_rx_desc *) rz->addr;
 
 	/*
diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 6cecfc0..f9e9916 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -61,7 +61,7 @@ sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id,
 		return ENOMEM;
 	}
 
-	esmp->esm_addr = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr);
+	esmp->esm_addr = mz->phys_addr;
 	if (esmp->esm_addr == RTE_BAD_PHYS_ADDR) {
 		(void)rte_memzone_free(mz);
 		return EFAULT;
diff --git a/lib/librte_eal/common/include/rte_memory.h b/lib/librte_eal/common/include/rte_memory.h
index 4aa5d1f..8d3960d 100644
--- a/lib/librte_eal/common/include/rte_memory.h
+++ b/lib/librte_eal/common/include/rte_memory.h
@@ -200,30 +200,6 @@ unsigned rte_memory_get_nrank(void);
 /**< Internal use only - should DOM0 memory mapping be used */
 int rte_xen_dom0_supported(void);
 
-/**< Internal use only - phys to virt mapping for xen */
-phys_addr_t rte_xen_mem_phy2mch(int32_t, const phys_addr_t);
-
-/**
- * Return the physical address of elt, which is an element of the pool mp.
- *
- * @param memseg_id
- *   Identifier of the memory segment owning the physical address. If
- *   set to -1, find it automatically.
- * @param phy_addr
- *   physical address of elt.
- *
- * @return
- *   The physical address or RTE_BAD_PHYS_ADDR on error.
- */
-static inline phys_addr_t
-rte_mem_phy2mch(int32_t memseg_id, const phys_addr_t phy_addr)
-{
-	if (rte_xen_dom0_supported())
-		return rte_xen_mem_phy2mch(memseg_id, phy_addr);
-	else
-		return phy_addr;
-}
-
 /**
  * Memory init for supporting application running on Xen domain0.
  *
@@ -250,12 +226,6 @@ static inline int rte_xen_dom0_supported(void)
 {
 	return 0;
 }
-
-static inline phys_addr_t
-rte_mem_phy2mch(int32_t memseg_id __rte_unused, const phys_addr_t phy_addr)
-{
-	return phy_addr;
-}
 #endif
 
 #ifdef __cplusplus
diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
index 6d726ae..892a1ac 100644
--- a/lib/librte_mempool/rte_mempool.c
+++ b/lib/librte_mempool/rte_mempool.c
@@ -473,8 +473,6 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
 		     mp->populated_size < mp->size; off += phys_len) {
 
 		paddr = rte_mem_virt2phy(addr + off);
-		/* required for xen_dom0 to get the machine address */
-		paddr = rte_mem_phy2mch(-1, paddr);
 
 		if (paddr == RTE_BAD_PHYS_ADDR && rte_eal_has_hugepages()) {
 			ret = -EINVAL;
@@ -486,7 +484,6 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
 			phys_addr_t paddr_tmp;
 
 			paddr_tmp = rte_mem_virt2phy(addr + off + phys_len);
-			paddr_tmp = rte_mem_phy2mch(-1, paddr_tmp);
 
 			if (paddr_tmp != paddr + phys_len)
 				break;
-- 
2.7.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v3 3/3] doc: update timer lib docs
  @ 2017-09-13 22:05  3%   ` Erik Gabriel Carrillo
    1 sibling, 0 replies; 200+ results
From: Erik Gabriel Carrillo @ 2017-09-13 22:05 UTC (permalink / raw)
  To: rsanford; +Cc: dev, konstantin.ananyev, stephen, keith.wiles, narender.vangati

This change updates the timer library documentation to
reflect a change to the organization of the skiplists
in the implementation.

Signed-off-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
---
v3
* Updated implementation details section of timer_lib.rst to reflect the 
  addition of the option to use multiple pending timer lists per lcore.
* Updated release notes to reflect the addition of new function in timer
  lib API.

 doc/guides/prog_guide/timer_lib.rst    | 27 +++++++++++++++++----------
 doc/guides/rel_notes/release_17_11.rst |  7 +++++++
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/doc/guides/prog_guide/timer_lib.rst b/doc/guides/prog_guide/timer_lib.rst
index f437417..dfabf24 100644
--- a/doc/guides/prog_guide/timer_lib.rst
+++ b/doc/guides/prog_guide/timer_lib.rst
@@ -1,5 +1,5 @@
 ..  BSD LICENSE
-    Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+    Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
     All rights reserved.
 
     Redistribution and use in source and binary forms, with or without
@@ -53,16 +53,19 @@ Refer to the `callout manual <http://www.daemon-systems.org/man/callout.9.html>`
 Implementation Details
 ----------------------
 
-Timers are tracked on a per-lcore basis,
-with all pending timers for a core being maintained in order of timer expiry in a skiplist data structure.
-The skiplist used has ten levels and each entry in the table appears in each level with probability ¼^level.
+Timers are tracked on a per-lcore basis, with all pending timers for a core being maintained in order of timer
+expiry in either a single skiplist data structure or an array of skiplists, depending on whether
+the lcore has been configured for multiple pending lists. Multiple pending lists can be enabled when an
+application experiences contention for a single list for that lcore; skiplists corresponding to every other
+enabled lcore will be created.
+Each skiplist data structure has ten levels and each entry in the table appears in each level with probability ¼^level.
 This means that all entries are present in level 0, 1 in every 4 entries is present at level 1,
 one in every 16 at level 2 and so on up to level 9.
 This means that adding and removing entries from the timer list for a core can be done in log(n) time,
 up to 4^10 entries, that is, approximately 1,000,000 timers per lcore.
 
 A timer structure contains a special field called status,
-which is a union of a timer state (stopped, pending, running, config) and an owner (lcore id).
+which is a union of a timer state (stopped, pending, running, config), an installer (lcore id), and an owner (lcore id).
 Depending on the timer state, we know if a timer is present in a list or not:
 
 *   STOPPED: no owner, not in a list
@@ -77,17 +80,21 @@ Resetting or stopping a timer while it is in a CONFIG or RUNNING state is not al
 When modifying the state of a timer,
 a Compare And Swap instruction should be used to guarantee that the status (state+owner) is modified atomically.
 
-Inside the rte_timer_manage() function,
-the skiplist is used as a regular list by iterating along the level 0 list, which contains all timer entries,
-until an entry which has not yet expired has been encountered.
-To improve performance in the case where there are entries in the timer list but none of those timers have yet expired,
+Inside the rte_timer_manage() function, the timer lists are processed.
+If multiple pending lists have been enabled for an lcore, then each skiplist will
+be traversed sequentially, and run lists will be broken out and then processed.
+If multiple pending lists are not enabled for an lcore, then only a single skiplist will be traversed.
+A skiplist is used as a regular list by iterating along the level
+0 list, which contains all timer entries, until an entry which has not yet expired has been encountered.
+To improve performance in the case where there are entries in a skiplist but none of those timers have yet expired,
 the expiry time of the first list entry is maintained within the per-core timer list structure itself.
 On 64-bit platforms, this value can be checked without the need to take a lock on the overall structure.
 (Since expiry times are maintained as 64-bit values,
 a check on the value cannot be done on 32-bit platforms without using either a compare-and-swap (CAS) instruction or using a lock,
 so this additional check is skipped in favor of checking as normal once the lock has been taken.)
 On both 64-bit and 32-bit platforms,
-a call to rte_timer_manage() returns without taking a lock in the case where the timer list for the calling core is empty.
+rte_timer_manage() can either return or continue on to an lcore's next skiplist without taking a lock in the case where a timer list is empty,
+depending on whether or not the lcore has multiple pending lists.
 
 Use Cases
 ---------
diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst
index 170f4f9..4683cbe 100644
--- a/doc/guides/rel_notes/release_17_11.rst
+++ b/doc/guides/rel_notes/release_17_11.rst
@@ -110,6 +110,13 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* **Updated timer library.**
+
+  The timer library has been updated; it can now support multiple timer lists
+  per lcore where it previously only had one.  This functionality is off by
+  default but can be enabled in cases where contention for a single list is
+  an issue with the new function ``rte_timer_subsystem_set_multi_pendlists()``.
+
 
 ABI Changes
 -----------
-- 
2.6.4

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2 16/17] build: add option to version libs using DPDK version
  2017-09-13 13:11  0%       ` Bruce Richardson
@ 2017-09-13 17:02  0%         ` Luca Boccassi
  0 siblings, 0 replies; 200+ results
From: Luca Boccassi @ 2017-09-13 17:02 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, nhorman, harry.van.haaren, Christian Ehrhardt

On Wed, 2017-09-13 at 14:11 +0100, Bruce Richardson wrote:
> On Wed, Sep 13, 2017 at 12:32:24PM +0100, Luca Boccassi wrote:
> > On Tue, 2017-09-12 at 11:38 +0100, Bruce Richardson wrote:
> > > Normally, each library has it's own version number based on the
> > > ABI.
> > > Add an option to have all libs just use the DPDK version number
> > > as
> > > the
> > > .so version.
> > > 
> > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > > Reviewed-by: Harry van Haaren <harry.van.haaren@intel.com>
> > > ---
> > >  drivers/meson.build | 8 +++++++-
> > >  lib/meson.build     | 8 +++++++-
> > >  meson_options.txt   | 1 +
> > >  3 files changed, 15 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/drivers/meson.build b/drivers/meson.build
> > > index f19da16fb..0c251bd61 100644
> > > --- a/drivers/meson.build
> > > +++ b/drivers/meson.build
> > > @@ -92,6 +92,12 @@ foreach class:driver_classes
> > >  						depends:
> > > [pmdinfogen, tmp_lib])
> > >  			endforeach
> > >  
> > > +			if get_option('per_library_versions')
> > > +				so_version = '@0@.1'.format(vers
> > > ion)
> > > +			else
> > > +				so_version =
> > > meson.project_version()
> > > +			endif
> > > +
> > >  			# now build the driver itself, and add
> > > to
> > > the drivers list
> > >  			lib_name = driver_name_fmt.format(name)
> > >  			version_map = '@0@/@1@/@2@_version.map'.
> > > form
> > > at(
> > > @@ -105,7 +111,7 @@ foreach class:driver_classes
> > >  				c_args: cflags,
> > >  				link_args: '-Wl,--version-
> > > script=' +
> > > version_map,
> > >  				link_depends: version_map,
> > > -				version: '@0@.1'.format(version)
> > > ,
> > > +				version: so_version,
> > >  				install: true,
> > >  				install_dir:
> > > driver_install_path)
> > >  
> > > diff --git a/lib/meson.build b/lib/meson.build
> > > index d814721de..36652cfe1 100644
> > > --- a/lib/meson.build
> > > +++ b/lib/meson.build
> > > @@ -76,6 +76,12 @@ foreach l:libraries
> > >  			dep_objs += [get_variable('dep_rte_' +
> > > d)]
> > >  		endforeach
> > >  
> > > +		if get_option('per_library_versions')
> > > +			so_version = '@0@.1'.format(version)
> > > +		else
> > > +			so_version = meson.project_version()
> > > +		endif
> > > +
> > >  		version_map = '@0@/@1@/rte_@2@_version.map'.form
> > > at(
> > >  				meson.current_source_dir(),
> > > dir_name, name)
> > >  		libname = 'rte_' + name
> > > @@ -87,7 +93,7 @@ foreach l:libraries
> > >  				include_directories:
> > > include_directories(dir_name),
> > >  				link_args: '-Wl,--version-
> > > script=' +
> > > version_map,
> > >  				link_depends: version_map,
> > > -				version: '@0@.1'.format(version)
> > > ,
> > > +				version: so_version,
> > >  				install: true)
> > >  		dep = declare_dependency(link_with: lib,
> > >  				include_directories:
> > > include_directories(dir_name),
> > > diff --git a/meson_options.txt b/meson_options.txt
> > > index 9c45b8159..636226ce8 100644
> > > --- a/meson_options.txt
> > > +++ b/meson_options.txt
> > > @@ -6,3 +6,4 @@ option('allow_invalid_socket_id', type:
> > > 'boolean',
> > > value: false,
> > >  	description: 'allow out-of-range NUMA socket id\'s for
> > > platforms that don\'t report the value correctly')
> > >  option('enable_kmods', type: 'boolean', value: true,
> > > description:
> > > 'build kernel modules')
> > >  option('kernel_dir', type: 'string', value: '', description:
> > > 'path
> > > to the kernel for building kernel modules')
> > > +option('per_library_versions', type: 'boolean', value: true,
> > > description: 'true: each lib gets its own version number, false:
> > > DPDK
> > > version used for each lib')
> > 
> > Hi Bruce,
> > 
> > First of all thanks for implementing this option, and sorry for the
> > delay.
> > 
> > A couple of minor things:
> > 
> > 1) The project version has 3 digits, but the ABI version should
> > have 2
> > - eg: should be 17.08 but right now it's 17.08.0 - given point
> > releases
> > will be ABI compatible so they must not change the ABI version. In
> > the
> > packaging code we use cut to chop it off:
> > 
> > DPDK_ABI := $(shell echo $(DEB_VERSION_UPSTREAM) | cut -d '.'  -f1-
> > 2)
> > 
> > Not sure how to achieve the same in a Meson script though (can it
> > shell
> > out? or are there string manipulation built-ins?), sorry - just
> > starting to look at it.
> > 
> 
> That should be easy enough to do. It's 3-digits because I'm just
> pulling
> the project version unmodified from the initial project definition.
> I'd
> say I can manage to strip off one digit as part of the build.
> 
> > Right now the rte_config option allows the user to completely
> > override
> > the version - I'm fine with having a single boolean provided this
> > change is applied, it simplifies packaging a bit, but if it's
> > easier
> > for you to just accepted a version instead of a boolean it's fine
> > as
> > well, as you prefer
> 
> If there is a case where we might want to provide a particular
> version,
> I'm happy to edit the option, but if not I'll keep it as-is, because
> it
> will ensure all users of the option get the exact same behaviour, and
> means I only have two possibilities to test.

I agree, it looks fine as it is right now - I'm not aware of any other
use case at the moment.

> > 
> > 2) When the option is true, it should not generate a symlink with
> > the
> > ABI "revision", as the first digit is really not the revision, so
> > it
> > does not make much sense. Worse, it will stop 2 versions being co-
> > installable (which was the whole point :-) ), as, eg, 17.02, 17.05
> > and
> > 17.08 will all ship a libfoo.so.17 symlink. I can fix it in the
> > packaging, but I don't think it should be generated upstream at all
> > when this option is enabled.
> 
> Not exactly sure how to fix this, but I think it may work by using
> soversion as well as version in the library() calls.
> 
> > 
> > IOW, the following is the current result:
> > 
> > $ ls -l debian/librte-ethdev17.08/usr/lib/x86_64-linux-gnu/
> > total 72
> > lrwxrwxrwx 1 lboccass lboccass    24 Sep 13 11:50
> > librte_ethdev.so.17 -> librte_ethdev.so.17.08.0
> > -rw-r--r-- 1 lboccass lboccass 71672 Sep 13 11:50
> > librte_ethdev.so.17.08.0
> > 
> > The expected result would be to create a single file
> > "librte_ethdev.so.17.08" instead.
> > 
> 
> Let me see what I can do :-)
> 
> /Bruce

Now it works as expected, thanks!

-- 
Kind regards,
Luca Boccassi

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 17/17] doc: add documentation on how to add new components to DPDK
    2017-09-13 14:12  1%     ` [dpdk-dev] [PATCH v3 04/17] build: add DPDK libraries to build Bruce Richardson
  2017-09-13 14:12  3%     ` [dpdk-dev] [PATCH v3 16/17] build: add option to version libs using DPDK version Bruce Richardson
@ 2017-09-13 14:12  3%     ` Bruce Richardson
  2 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2017-09-13 14:12 UTC (permalink / raw)
  To: dev
  Cc: nhorman, luca.boccassi, harry.van.haaren, keith.wiles, Bruce Richardson

Add to the contributors guide details on how to add libraries and drivers
and integrate them with the DPDK build system(s).

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 doc/guides/contributing/coding_style.rst | 214 +++++++++++++++++++++++++++++++
 1 file changed, 214 insertions(+)

diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index d8e4a0f9c..3c59cbca5 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -702,3 +702,217 @@ All Python code should work with Python 2.7+ and 3.2+ and be compliant with
 `PEP8 (Style Guide for Python Code) <https://www.python.org/dev/peps/pep-0008/>`_.
 
 The ``pep8`` tool can be used for testing compliance with the guidelines.
+
+Integrating with the Build System
+---------------------------------
+
+DPDK supports being built in two different ways:
+
+* using ``make`` - or more specifically "GNU make", i.e. ``gmake`` on FreeBSD
+* using the tools ``meson`` and ``ninja``
+
+Any new library or driver to be integrated into DPDK should support being
+built with both systems. While building using ``make`` is a legacy approach, and
+most build-system enhancements are being done using ``meson`` and ``ninja``
+there are no plans at this time to deprecate the legacy ``make`` build system.
+
+Therefore all new component additions should include both a ``Makefile`` and a
+``meson.build`` file, and should be added to the component lists in both the
+``Makefile`` and ``meson.build`` files in the relevant top-level directory:
+either ``lib`` directory or a ``driver`` subdirectory.
+
+Makefile Contents
+~~~~~~~~~~~~~~~~~
+
+The ``Makefile`` for the component should be of the following format, where
+``<name>`` corresponds to the name of the library in question, e.g. hash,
+lpm, etc. For drivers, the same format of Makefile is used.
+
+.. code-block:: makefile
+
+	# pull in basic DPDK definitions, including whether library is to be
+	# built or not
+	include $(RTE_SDK)/mk/rte.vars.mk
+
+	# library name
+	LIB = librte_<name>.a
+
+	# any library cflags needed. Generally add "-O3 $(WERROR_FLAGS)"
+	CFLAGS += -O3
+	CFLAGS += $(WERROR_FLAGS)
+
+	# the symbol version information for the library, and .so version
+	EXPORT_MAP := rte_<name>_version.map
+	LIBABIVER := 1
+
+	# all source filenames are stored in SRCS-y
+	SRCS-$(CONFIG_RTE_LIBRTE_<NAME>) += rte_<name>.c
+
+	# install includes
+	SYMLINK-$(CONFIG_RTE_LIBRTE_<NAME>)-include += rte_<name>.h
+
+	# pull in rules to build the library
+	include $(RTE_SDK)/mk/rte.lib.mk
+
+Meson Build File Contents - Libraries
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``meson.build`` file for a new DPDK library should be of the following basic
+format.
+
+.. code-block:: python
+
+	sources = files('file1.c', ...)
+	headers = files('file1.c', ...)
+
+
+The will build based on a number of conventions and assumptions within the DPDK
+itself, for example, that the library name is the same as the directory name in
+which the files are stored.
+
+For a library ``meson.build`` file, there are number of variables which can be
+set, some mandatory, others optional. The mandatory fields are:
+
+sources
+	**Default Value = []**.
+	This variable should list out the files to be compiled up to create the
+	library. Files must be specified using the meson ``files()`` function.
+
+
+The optional fields are:
+
+build
+	**Default Value = true.**
+	Used to optionally compile a library, based on its dependencies or
+	environment. A simple example of use would be:
+
+.. code-block:: python
+
+	if host_machine.system() != 'linux'
+	        build = false
+	endif
+
+
+cflags
+	**Default Value = []**.
+	Used to specify any additional cflags that need to be passed to compile
+	the sources in the library.
+
+deps
+	**Default Value = ['eal']**.
+	Used to list the internal library dependencies of the library. It should
+	be assigned to using ``+=`` rather than overwriting using ``=``.  The
+	dependencies should be specified as strings, each one giving the name of
+	a DPDK library, without the ``librte_`` prefix. Dependencies are handled
+	recursively, so specifying e.g. ``mempool``, will automatically also
+	make the library depend upon the mempool library's dependencies too -
+	``ring`` and ``eal``. For libraries that only depend upon EAL, this
+	variable may be omitted from the ``meson.build`` file.  For example:
+
+.. code-block:: python
+
+	deps += ['ethdev']
+
+
+ext_deps
+	**Default Value = []**.
+	Used to specify external dependencies of this library. They should be
+	returned as dependency objects, as returned from the meson
+	``dependency()`` or ``find_library()`` functions. Before returning
+	these, they should be checked to ensure the dependencies have been
+	found, and, if not, the ``build`` variable should be set to ``false``.
+	For example:
+
+.. code-block:: python
+
+	my_dep = dependency('libX', required: 'false')
+	if my_dep.found()
+		ext_deps += my_dep
+	else
+		build = false
+	endif
+
+
+headers
+	**Default Value = []**.
+	Used to return the list of header files for the library that should be
+	installed to $PREFIX/include when ``ninja install`` is run. As with
+	source files, these should be specified using the meson ``files()``
+	function.
+
+name
+	**Default Value = library name derived from the directory name**.
+	If a library's .so or .a file differs from that given in the directory
+	name, the name should be specified using this variable. In practice,
+	since the convention is that for a library called ``librte_xyz.so``, the
+	sources are stored in a directory ``lib/librte_xyz``, this value should
+	never be needed for new libraries.
+
+.. note::
+
+	The name value also provides the name used to find the function version
+	map file, as part of the build process, so if the directory name and
+	library names differ, the ``version.map`` file should be named
+	consistently with the library, not the directory
+
+objs
+	**Default Value = []**.
+	This variable can be used to pass to the library build some pre-built
+	objects that were compiled up as part of another target given in the
+	included library ``meson.build`` file.
+
+version
+	**Default Value = 1**.
+	Specifies the ABI version of the library, and is used as the major
+	version number of the resulting ``.so`` library.
+
+Meson Build File Contents - Drivers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For drivers, the values are largely the same as for libraries. The variables
+supported are:
+
+build
+	As above.
+
+cflags
+	As above.
+
+deps
+	As above.
+
+ext_deps
+	As above.
+
+includes
+	**Default Value = <driver directory>** Some drivers include a base
+	directory for additional source files and headers, so we have this
+	variable to allow the headers from that base directory to be found when
+	compiling driver sources. Should be appended to using ``+=`` rather than
+	overwritten using ``=``.  The values appended should be meson include
+	objects got using the ``include_directories()`` function. For example:
+
+.. code-block:: python
+
+	includes += include_directories('base')
+
+name
+	As above, though note that each driver class can define it's own naming
+	scheme for the resulting ``.so`` files.
+
+objs
+	As above, generally used for the contents of the ``base`` directory.
+
+pkgconfig_extra_libs
+	**Default Value = []**
+	This variable is used to pass additional library link flags through to
+	the DPDK pkgconfig file generated, for example, to track any additional
+	libraries that may need to be linked into the build - especially when
+	using static libraries. Anything added here will be appended to the end
+	of the ``pkgconfig --libs`` output.
+
+sources [mandatory]
+	As above
+
+version
+	As above
-- 
2.13.5

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v3 16/17] build: add option to version libs using DPDK version
    2017-09-13 14:12  1%     ` [dpdk-dev] [PATCH v3 04/17] build: add DPDK libraries to build Bruce Richardson
@ 2017-09-13 14:12  3%     ` Bruce Richardson
  2017-09-13 14:12  3%     ` [dpdk-dev] [PATCH v3 17/17] doc: add documentation on how to add new components to DPDK Bruce Richardson
  2 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2017-09-13 14:12 UTC (permalink / raw)
  To: dev
  Cc: nhorman, luca.boccassi, harry.van.haaren, keith.wiles, Bruce Richardson

Normally, each library has it's own version number based on the ABI.
Add an option to have all libs just use the DPDK version number as the
.so version.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 drivers/meson.build                     | 13 ++++++++++++-
 lib/librte_eal/bsdapp/eal/meson.build   | 12 +++++++++++-
 lib/librte_eal/linuxapp/eal/meson.build | 12 +++++++++++-
 lib/meson.build                         | 12 +++++++++++-
 meson_options.txt                       |  1 +
 5 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/drivers/meson.build b/drivers/meson.build
index f19da16fb..3ea42b04b 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -92,6 +92,16 @@ foreach class:driver_classes
 						depends: [pmdinfogen, tmp_lib])
 			endforeach
 
+			if get_option('per_library_versions')
+				lib_version = '@0@.1'.format(version)
+				so_version = '@0@'.format(version)
+			else
+				pver = meson.project_version().split('.')
+				lib_version = '@0@.@1@'.format(pver.get(0),
+						pver.get(1))
+				so_version = lib_version
+			endif
+
 			# now build the driver itself, and add to the drivers list
 			lib_name = driver_name_fmt.format(name)
 			version_map = '@0@/@1@/@2@_version.map'.format(
@@ -105,7 +115,8 @@ foreach class:driver_classes
 				c_args: cflags,
 				link_args: '-Wl,--version-script=' + version_map,
 				link_depends: version_map,
-				version: '@0@.1'.format(version),
+				version: lib_version,
+				soversion: so_version,
 				install: true,
 				install_dir: driver_install_path)
 
diff --git a/lib/librte_eal/bsdapp/eal/meson.build b/lib/librte_eal/bsdapp/eal/meson.build
index 00973122a..f6c43fd44 100644
--- a/lib/librte_eal/bsdapp/eal/meson.build
+++ b/lib/librte_eal/bsdapp/eal/meson.build
@@ -46,11 +46,21 @@ sources = ['eal_alarm.c',
 
 eal_extra_link_arg = '-lexecinfo'
 
+if get_option('per_library_versions')
+	lib_version = '@0@.1'.format(version)
+	so_version = '@0@'.format(version)
+else
+	pver = meson.project_version().split('.')
+	lib_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
+	so_version = lib_version
+endif
+
 version_map = join_paths(meson.current_source_dir(), 'rte_eal_version.map')
 eal_lib = library('rte_eal', sources, eal_common_sources, eal_common_arch_sources,
 			dependencies: dependency('threads'),
 			include_directories : eal_inc,
-			version: '@0@.1'.format(version),
+			version: lib_version,
+			soversion: so_version,
 			c_args: '-D_GNU_SOURCE',
 			link_depends: version_map,
 			link_args: [eal_extra_link_arg,
diff --git a/lib/librte_eal/linuxapp/eal/meson.build b/lib/librte_eal/linuxapp/eal/meson.build
index e7daed499..bffbd7e66 100644
--- a/lib/librte_eal/linuxapp/eal/meson.build
+++ b/lib/librte_eal/linuxapp/eal/meson.build
@@ -51,11 +51,21 @@ sources = ['eal_alarm.c',
 
 eal_extra_link_arg = '-ldl'
 
+if get_option('per_library_versions')
+	lib_version = '@0@.1'.format(version)
+	so_version = '@0@'.format(version)
+else
+	pver = meson.project_version().split('.')
+	lib_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
+	so_version = lib_version
+endif
+
 version_map = join_paths(meson.current_source_dir(), 'rte_eal_version.map')
 eal_lib = library('rte_eal', sources, eal_common_sources, eal_common_arch_sources,
 			dependencies: dependency('threads'),
 			include_directories : eal_inc,
-			version: '@0@.1'.format(version),
+			version: lib_version,
+			soversion: so_version,
 			c_args: '-D_GNU_SOURCE',
 			link_depends: version_map,
 			link_args: [eal_extra_link_arg,
diff --git a/lib/meson.build b/lib/meson.build
index d814721de..5244fe4a5 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -76,6 +76,15 @@ foreach l:libraries
 			dep_objs += [get_variable('dep_rte_' + d)]
 		endforeach
 
+		if get_option('per_library_versions')
+			lib_version = '@0@.1'.format(version)
+			so_version = '@0@'.format(version)
+		else
+			pver = meson.project_version().split('.')
+			lib_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
+			so_version = lib_version
+		endif
+
 		version_map = '@0@/@1@/rte_@2@_version.map'.format(
 				meson.current_source_dir(), dir_name, name)
 		libname = 'rte_' + name
@@ -87,7 +96,8 @@ foreach l:libraries
 				include_directories: include_directories(dir_name),
 				link_args: '-Wl,--version-script=' + version_map,
 				link_depends: version_map,
-				version: '@0@.1'.format(version),
+				version: lib_version,
+				soversion: so_version,
 				install: true)
 		dep = declare_dependency(link_with: lib,
 				include_directories: include_directories(dir_name),
diff --git a/meson_options.txt b/meson_options.txt
index 9c45b8159..636226ce8 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -6,3 +6,4 @@ option('allow_invalid_socket_id', type: 'boolean', value: false,
 	description: 'allow out-of-range NUMA socket id\'s for platforms that don\'t report the value correctly')
 option('enable_kmods', type: 'boolean', value: true, description: 'build kernel modules')
 option('kernel_dir', type: 'string', value: '', description: 'path to the kernel for building kernel modules')
+option('per_library_versions', type: 'boolean', value: true, description: 'true: each lib gets its own version number, false: DPDK version used for each lib')
-- 
2.13.5

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v3 04/17] build: add DPDK libraries to build
  @ 2017-09-13 14:12  1%     ` Bruce Richardson
  2017-09-13 14:12  3%     ` [dpdk-dev] [PATCH v3 16/17] build: add option to version libs using DPDK version Bruce Richardson
  2017-09-13 14:12  3%     ` [dpdk-dev] [PATCH v3 17/17] doc: add documentation on how to add new components to DPDK Bruce Richardson
  2 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2017-09-13 14:12 UTC (permalink / raw)
  To: dev
  Cc: nhorman, luca.boccassi, harry.van.haaren, keith.wiles, Bruce Richardson

Add non-EAL libraries to DPDK build. The compat lib is a special case,
along with the previously-added EAL, but all other libs can be build using
the same set of commands, where the individual meson.build files only need
to specify their dependencies, source files, header files and ABI versions.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 config/rte_config.h                 | 36 ++++++++++++++++++++
 lib/librte_acl/meson.build          | 59 ++++++++++++++++++++++++++++++++
 lib/librte_bitratestats/meson.build | 34 +++++++++++++++++++
 lib/librte_cfgfile/meson.build      | 34 +++++++++++++++++++
 lib/librte_cmdline/meson.build      | 55 ++++++++++++++++++++++++++++++
 lib/librte_compat/meson.build       | 36 ++++++++++++++++++++
 lib/librte_cryptodev/meson.build    | 40 ++++++++++++++++++++++
 lib/librte_distributor/meson.build  | 39 +++++++++++++++++++++
 lib/librte_efd/meson.build          | 34 +++++++++++++++++++
 lib/librte_ether/meson.build        | 45 +++++++++++++++++++++++++
 lib/librte_eventdev/meson.build     | 36 ++++++++++++++++++++
 lib/librte_gro/meson.build          | 34 +++++++++++++++++++
 lib/librte_hash/meson.build         | 45 +++++++++++++++++++++++++
 lib/librte_ip_frag/meson.build      | 39 +++++++++++++++++++++
 lib/librte_jobstats/meson.build     | 33 ++++++++++++++++++
 lib/librte_kni/meson.build          | 38 +++++++++++++++++++++
 lib/librte_kvargs/meson.build       | 34 +++++++++++++++++++
 lib/librte_latencystats/meson.build | 34 +++++++++++++++++++
 lib/librte_lpm/meson.build          | 35 +++++++++++++++++++
 lib/librte_mbuf/meson.build         | 35 +++++++++++++++++++
 lib/librte_mempool/meson.build      | 35 +++++++++++++++++++
 lib/librte_meter/meson.build        | 33 ++++++++++++++++++
 lib/librte_metrics/meson.build      | 33 ++++++++++++++++++
 lib/librte_net/meson.build          | 45 +++++++++++++++++++++++++
 lib/librte_pdump/meson.build        | 34 +++++++++++++++++++
 lib/librte_pipeline/meson.build     | 35 +++++++++++++++++++
 lib/librte_port/meson.build         | 58 ++++++++++++++++++++++++++++++++
 lib/librte_power/meson.build        | 37 ++++++++++++++++++++
 lib/librte_reorder/meson.build      | 34 +++++++++++++++++++
 lib/librte_ring/meson.build         | 33 ++++++++++++++++++
 lib/librte_sched/meson.build        | 36 ++++++++++++++++++++
 lib/librte_table/meson.build        | 52 ++++++++++++++++++++++++++++
 lib/librte_timer/meson.build        | 33 ++++++++++++++++++
 lib/librte_vhost/meson.build        | 39 +++++++++++++++++++++
 lib/meson.build                     | 67 +++++++++++++++++++++++++++++++++++++
 35 files changed, 1379 insertions(+)
 create mode 100644 lib/librte_acl/meson.build
 create mode 100644 lib/librte_bitratestats/meson.build
 create mode 100644 lib/librte_cfgfile/meson.build
 create mode 100644 lib/librte_cmdline/meson.build
 create mode 100644 lib/librte_compat/meson.build
 create mode 100644 lib/librte_cryptodev/meson.build
 create mode 100644 lib/librte_distributor/meson.build
 create mode 100644 lib/librte_efd/meson.build
 create mode 100644 lib/librte_ether/meson.build
 create mode 100644 lib/librte_eventdev/meson.build
 create mode 100644 lib/librte_gro/meson.build
 create mode 100644 lib/librte_hash/meson.build
 create mode 100644 lib/librte_ip_frag/meson.build
 create mode 100644 lib/librte_jobstats/meson.build
 create mode 100644 lib/librte_kni/meson.build
 create mode 100644 lib/librte_kvargs/meson.build
 create mode 100644 lib/librte_latencystats/meson.build
 create mode 100644 lib/librte_lpm/meson.build
 create mode 100644 lib/librte_mbuf/meson.build
 create mode 100644 lib/librte_mempool/meson.build
 create mode 100644 lib/librte_meter/meson.build
 create mode 100644 lib/librte_metrics/meson.build
 create mode 100644 lib/librte_net/meson.build
 create mode 100644 lib/librte_pdump/meson.build
 create mode 100644 lib/librte_pipeline/meson.build
 create mode 100644 lib/librte_port/meson.build
 create mode 100644 lib/librte_power/meson.build
 create mode 100644 lib/librte_reorder/meson.build
 create mode 100644 lib/librte_ring/meson.build
 create mode 100644 lib/librte_sched/meson.build
 create mode 100644 lib/librte_table/meson.build
 create mode 100644 lib/librte_timer/meson.build
 create mode 100644 lib/librte_vhost/meson.build

diff --git a/config/rte_config.h b/config/rte_config.h
index c94704cfe..b47cfabae 100644
--- a/config/rte_config.h
+++ b/config/rte_config.h
@@ -58,4 +58,40 @@
 #define RTE_BACKTRACE 1
 #define RTE_EAL_VFIO 1
 
+/* mempool defines */
+#define RTE_MEMPOOL_CACHE_MAX_SIZE 512
+
+/* mbuf defines */
+#define RTE_MBUF_DEFAULT_MEMPOOL_OPS "ring_mp_mc"
+#define RTE_MBUF_REFCNT_ATOMIC 1
+#define RTE_PKTMBUF_HEADROOM 128
+
+/* ether defines */
+#define RTE_MAX_ETHPORTS 32
+#define RTE_MAX_QUEUES_PER_PORT 1024
+#define RTE_ETHDEV_QUEUE_STAT_CNTRS 16
+#define RTE_ETHDEV_RXTX_CALLBACKS 1
+
+/* cryptodev defines */
+#define RTE_CRYPTO_MAX_DEVS 64
+#define RTE_CRYPTODEV_NAME_LEN 64
+
+/* eventdev defines */
+#define RTE_EVENT_MAX_DEVS 16
+#define RTE_EVENT_MAX_QUEUES_PER_DEV 64
+
+/* ip_fragmentation defines */
+#define RTE_LIBRTE_IP_FRAG_MAX_FRAG 4
+#undef RTE_LIBRTE_IP_FRAG_TBL_STAT
+
+/* rte_power defines */
+#define RTE_MAX_LCORE_FREQS 64
+
+/* rte_sched defines */
+#undef RTE_SCHED_RED
+#undef RTE_SCHED_COLLECT_STATS
+#undef RTE_SCHED_SUBPORT_TC_OV
+#define RTE_SCHED_PORT_N_GRINDERS 8
+#undef RTE_SCHED_VECTOR
+
 #endif /* _RTE_CONFIG_H_ */
diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build
new file mode 100644
index 000000000..b81b74468
--- /dev/null
+++ b/lib/librte_acl/meson.build
@@ -0,0 +1,59 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 2
+sources = files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c',
+		'rte_acl.c', 'tb_mem.c')
+headers = files('rte_acl.h', 'rte_acl_osdep.h')
+
+if arch_subdir == 'x86'
+	sources += files('acl_run_sse.c')
+
+	# compile AVX2 version if either:
+	# a. we have AVX supported in minimum instruction set baseline
+	# b. it's not minimum instruction set, but supported by compiler
+	#
+	# in former case, just add avx2 C file to files list
+	# in latter case, compile c file to static lib, using correct compiler
+	# flags, and then have the .o file from static lib linked into main lib.
+	if dpdk_conf.has('RTE_MACHINE_CPUFLAG_AVX2')
+		sources += files('acl_run_avx2.c')
+		cflags += '-DCC_AVX2_SUPPORT'
+	elif cc.has_argument('-mavx2')
+		avx2_tmplib = static_library('avx2_tmp',
+				'acl_run_avx2.c',
+				dependencies: rte_eal,
+				c_args: '-mavx2')
+		objs += avx2_tmplib.extract_objects('acl_run_avx2.c')
+		cflags += '-DCC_AVX2_SUPPORT'
+	endif
+
+endif
diff --git a/lib/librte_bitratestats/meson.build b/lib/librte_bitratestats/meson.build
new file mode 100644
index 000000000..dcf6070bf
--- /dev/null
+++ b/lib/librte_bitratestats/meson.build
@@ -0,0 +1,34 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_bitrate.c')
+headers = files('rte_bitrate.h')
+deps += ['ethdev', 'metrics']
diff --git a/lib/librte_cfgfile/meson.build b/lib/librte_cfgfile/meson.build
new file mode 100644
index 000000000..1a4992ff3
--- /dev/null
+++ b/lib/librte_cfgfile/meson.build
@@ -0,0 +1,34 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 2
+sources = files('rte_cfgfile.c')
+headers = files('rte_cfgfile.h')
diff --git a/lib/librte_cmdline/meson.build b/lib/librte_cmdline/meson.build
new file mode 100644
index 000000000..80fbe5d07
--- /dev/null
+++ b/lib/librte_cmdline/meson.build
@@ -0,0 +1,55 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 2
+sources = files('cmdline.c',
+	'cmdline_cirbuf.c',
+	'cmdline_parse.c',
+	'cmdline_parse_etheraddr.c',
+	'cmdline_parse_ipaddr.c',
+	'cmdline_parse_num.c',
+	'cmdline_parse_portlist.c',
+	'cmdline_parse_string.c',
+	'cmdline_rdline.c',
+	'cmdline_socket.c',
+	'cmdline_vt100.c')
+
+headers = files('cmdline.h',
+	'cmdline_parse.h',
+	'cmdline_parse_num.h',
+	'cmdline_parse_ipaddr.h',
+	'cmdline_parse_etheraddr.h',
+	'cmdline_parse_string.h',
+	'cmdline_rdline.h',
+	'cmdline_vt100.h',
+	'cmdline_socket.h',
+	'cmdline_cirbuf.h',
+	'cmdline_parse_portlist.h')
diff --git a/lib/librte_compat/meson.build b/lib/librte_compat/meson.build
new file mode 100644
index 000000000..3b911dfff
--- /dev/null
+++ b/lib/librte_compat/meson.build
@@ -0,0 +1,36 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+install_headers('rte_compat.h')
+
+set_variable('dep_rte_compat',
+	declare_dependency(include_directories: include_directories('.')))
diff --git a/lib/librte_cryptodev/meson.build b/lib/librte_cryptodev/meson.build
new file mode 100644
index 000000000..e45e7098a
--- /dev/null
+++ b/lib/librte_cryptodev/meson.build
@@ -0,0 +1,40 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 3
+sources = files('rte_cryptodev.c', 'rte_cryptodev_pmd.c')
+headers = files('rte_cryptodev.h',
+	'rte_cryptodev_pci.h',
+	'rte_cryptodev_pmd.h',
+	'rte_cryptodev_vdev.h',
+	'rte_crypto.h',
+	'rte_crypto_sym.h')
+deps += ['kvargs', 'mbuf']
diff --git a/lib/librte_distributor/meson.build b/lib/librte_distributor/meson.build
new file mode 100644
index 000000000..6118c5f50
--- /dev/null
+++ b/lib/librte_distributor/meson.build
@@ -0,0 +1,39 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_distributor.c', 'rte_distributor_v20.c')
+if arch_subdir == 'x86'
+	sources += files('rte_distributor_match_sse.c')
+else
+	sources += files('rte_distributor_match_generic.c')
+endif
+headers = files('rte_distributor.h')
+deps += ['mbuf', 'compat']
diff --git a/lib/librte_efd/meson.build b/lib/librte_efd/meson.build
new file mode 100644
index 000000000..73c004e70
--- /dev/null
+++ b/lib/librte_efd/meson.build
@@ -0,0 +1,34 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_efd.c')
+headers = files('rte_efd.h')
+deps += ['ring', 'hash']
diff --git a/lib/librte_ether/meson.build b/lib/librte_ether/meson.build
new file mode 100644
index 000000000..d10bd37d5
--- /dev/null
+++ b/lib/librte_ether/meson.build
@@ -0,0 +1,45 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+name = 'ethdev'
+version = 6
+sources = files('rte_ethdev.c', 'rte_flow.c', 'rte_tm.c')
+
+headers = files('rte_ethdev.h',
+	'rte_ethdev_pci.h',
+	'rte_ethdev_vdev.h',
+	'rte_eth_ctrl.h',
+	'rte_dev_info.h',
+	'rte_flow.h',
+	'rte_flow_driver.h',
+	'rte_tm.h')
+
+deps += ['net']
diff --git a/lib/librte_eventdev/meson.build b/lib/librte_eventdev/meson.build
new file mode 100644
index 000000000..60d5f4e89
--- /dev/null
+++ b/lib/librte_eventdev/meson.build
@@ -0,0 +1,36 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_eventdev.c', 'rte_event_ring.c')
+headers = files('rte_eventdev.h', 'rte_eventdev_pmd.h',
+		'rte_eventdev_pmd_pci.h', 'rte_eventdev_pmd_vdev.h',
+		'rte_event_ring.h')
+deps += ['ring']
diff --git a/lib/librte_gro/meson.build b/lib/librte_gro/meson.build
new file mode 100644
index 000000000..f6848c42b
--- /dev/null
+++ b/lib/librte_gro/meson.build
@@ -0,0 +1,34 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_gro.c', 'gro_tcp4.c')
+headers = files('rte_gro.h')
+deps += ['ethdev']
diff --git a/lib/librte_hash/meson.build b/lib/librte_hash/meson.build
new file mode 100644
index 000000000..1df383f4b
--- /dev/null
+++ b/lib/librte_hash/meson.build
@@ -0,0 +1,45 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 2
+headers = files('rte_cmp_arm64.h',
+	'rte_cmp_x86.h',
+	'rte_crc_arm64.h',
+	'rte_cuckoo_hash.h',
+	'rte_cuckoo_hash_x86.h',
+	'rte_fbk_hash.h',
+	'rte_hash_crc.h',
+	'rte_hash.h',
+	'rte_jhash.h',
+	'rte_thash.h')
+
+sources = files('rte_cuckoo_hash.c', 'rte_fbk_hash.c')
+deps += ['ring', 'compat']
diff --git a/lib/librte_ip_frag/meson.build b/lib/librte_ip_frag/meson.build
new file mode 100644
index 000000000..11523badf
--- /dev/null
+++ b/lib/librte_ip_frag/meson.build
@@ -0,0 +1,39 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_ipv4_fragmentation.c',
+		'rte_ipv6_fragmentation.c',
+		'rte_ipv4_reassembly.c',
+		'rte_ipv6_reassembly.c',
+		'rte_ip_frag_common.c',
+		'ip_frag_internal.c')
+headers = files('rte_ip_frag.h')
+deps += ['ethdev', 'hash']
diff --git a/lib/librte_jobstats/meson.build b/lib/librte_jobstats/meson.build
new file mode 100644
index 000000000..97cf01cad
--- /dev/null
+++ b/lib/librte_jobstats/meson.build
@@ -0,0 +1,33 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_jobstats.c')
+headers = files('rte_jobstats.h')
diff --git a/lib/librte_kni/meson.build b/lib/librte_kni/meson.build
new file mode 100644
index 000000000..25934a46d
--- /dev/null
+++ b/lib/librte_kni/meson.build
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if host_machine.system() != 'linux'
+	build = false
+endif
+version = 2
+sources = files('rte_kni.c')
+headers = files('rte_kni.h')
+deps += ['ethdev']
diff --git a/lib/librte_kvargs/meson.build b/lib/librte_kvargs/meson.build
new file mode 100644
index 000000000..2962fc370
--- /dev/null
+++ b/lib/librte_kvargs/meson.build
@@ -0,0 +1,34 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 1
+sources = files('rte_kvargs.c')
+headers = files('rte_kvargs.h')
diff --git a/lib/librte_latencystats/meson.build b/lib/librte_latencystats/meson.build
new file mode 100644
index 000000000..10a778433
--- /dev/null
+++ b/lib/librte_latencystats/meson.build
@@ -0,0 +1,34 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_latencystats.c')
+headers = files('rte_latencystats.h')
+deps += ['metrics', 'ethdev']
diff --git a/lib/librte_lpm/meson.build b/lib/librte_lpm/meson.build
new file mode 100644
index 000000000..af88a97ec
--- /dev/null
+++ b/lib/librte_lpm/meson.build
@@ -0,0 +1,35 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 2
+sources = files('rte_lpm.c', 'rte_lpm6.c')
+headers = files('rte_lpm.h', 'rte_lpm6.h')
+deps += ['compat']
diff --git a/lib/librte_mbuf/meson.build b/lib/librte_mbuf/meson.build
new file mode 100644
index 000000000..96856e231
--- /dev/null
+++ b/lib/librte_mbuf/meson.build
@@ -0,0 +1,35 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 3
+sources = files('rte_mbuf.c', 'rte_mbuf_ptype.c')
+headers = files('rte_mbuf.h', 'rte_mbuf_ptype.h')
+deps += ['mempool']
diff --git a/lib/librte_mempool/meson.build b/lib/librte_mempool/meson.build
new file mode 100644
index 000000000..96e582deb
--- /dev/null
+++ b/lib/librte_mempool/meson.build
@@ -0,0 +1,35 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 2
+sources = files('rte_mempool.c', 'rte_mempool_ops.c')
+headers = files('rte_mempool.h')
+deps += ['ring']
diff --git a/lib/librte_meter/meson.build b/lib/librte_meter/meson.build
new file mode 100644
index 000000000..debcebcc1
--- /dev/null
+++ b/lib/librte_meter/meson.build
@@ -0,0 +1,33 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_meter.c')
+headers = files('rte_meter.h')
diff --git a/lib/librte_metrics/meson.build b/lib/librte_metrics/meson.build
new file mode 100644
index 000000000..c820503f0
--- /dev/null
+++ b/lib/librte_metrics/meson.build
@@ -0,0 +1,33 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_metrics.c')
+headers = files('rte_metrics.h')
diff --git a/lib/librte_net/meson.build b/lib/librte_net/meson.build
new file mode 100644
index 000000000..62bbf4c22
--- /dev/null
+++ b/lib/librte_net/meson.build
@@ -0,0 +1,45 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 1
+headers = files('rte_ip.h',
+	'rte_tcp.h',
+	'rte_udp.h',
+	'rte_sctp.h',
+	'rte_icmp.h',
+	'rte_arp.h',
+	'rte_ether.h',
+	'rte_gre.h',
+	'rte_net.h',
+	'rte_net_crc.h')
+
+sources = files('rte_net.c', 'rte_net_crc.c')
+deps += ['mbuf']
diff --git a/lib/librte_pdump/meson.build b/lib/librte_pdump/meson.build
new file mode 100644
index 000000000..94a92b677
--- /dev/null
+++ b/lib/librte_pdump/meson.build
@@ -0,0 +1,34 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_pdump.c')
+headers = files('rte_pdump.h')
+deps += ['ethdev']
diff --git a/lib/librte_pipeline/meson.build b/lib/librte_pipeline/meson.build
new file mode 100644
index 000000000..54e34fc62
--- /dev/null
+++ b/lib/librte_pipeline/meson.build
@@ -0,0 +1,35 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 3
+sources = files('rte_pipeline.c')
+headers = files('rte_pipeline.h')
+deps += ['port', 'table']
diff --git a/lib/librte_port/meson.build b/lib/librte_port/meson.build
new file mode 100644
index 000000000..a0d3a8c07
--- /dev/null
+++ b/lib/librte_port/meson.build
@@ -0,0 +1,58 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 3
+sources = files(
+	'rte_port_ethdev.c',
+	'rte_port_fd.c',
+	'rte_port_ring.c',
+	'rte_port_sched.c',
+	'rte_port_source_sink.c')
+headers = files(
+	'rte_port_ethdev.h',
+	'rte_port_fd.h',
+	'rte_port.h',
+	'rte_port_ring.h',
+	'rte_port_sched.h',
+	'rte_port_source_sink.h')
+deps += ['ethdev', 'sched']
+
+if dpdk_conf.has('RTE_LIBRTE_IP_FRAG')
+	sources += files('rte_port_frag.c', 'rte_port_ras.c')
+	headers += files('rte_port_frag.h', 'rte_port_ras.h')
+	deps += ['ip_frag']
+endif
+
+if dpdk_conf.has('RTE_LIBRTE_KNI')
+	sources += files('rte_port_kni.c')
+	headers += files('rte_port_kni.h')
+	deps += 'kni'
+endif
diff --git a/lib/librte_power/meson.build b/lib/librte_power/meson.build
new file mode 100644
index 000000000..541efa6a4
--- /dev/null
+++ b/lib/librte_power/meson.build
@@ -0,0 +1,37 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if host_machine.system() != 'linux'
+	build = false
+endif
+sources = files('rte_power.c', 'rte_power_acpi_cpufreq.c',
+		'rte_power_kvm_vm.c', 'guest_channel.c')
+headers = files('rte_power.h')
diff --git a/lib/librte_reorder/meson.build b/lib/librte_reorder/meson.build
new file mode 100644
index 000000000..456e83f02
--- /dev/null
+++ b/lib/librte_reorder/meson.build
@@ -0,0 +1,34 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_reorder.c')
+headers = files('rte_reorder.h')
+deps += ['mbuf']
diff --git a/lib/librte_ring/meson.build b/lib/librte_ring/meson.build
new file mode 100644
index 000000000..8c102fe6a
--- /dev/null
+++ b/lib/librte_ring/meson.build
@@ -0,0 +1,33 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_ring.c')
+headers = files('rte_ring.h')
diff --git a/lib/librte_sched/meson.build b/lib/librte_sched/meson.build
new file mode 100644
index 000000000..c4badb211
--- /dev/null
+++ b/lib/librte_sched/meson.build
@@ -0,0 +1,36 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_sched.c', 'rte_red.c', 'rte_approx.c',
+		'rte_reciprocal.c')
+headers = files('rte_sched.h', 'rte_bitmap.h', 'rte_sched_common.h',
+		'rte_red.h', 'rte_approx.h', 'rte_reciprocal.h')
+deps += ['mbuf', 'meter']
diff --git a/lib/librte_table/meson.build b/lib/librte_table/meson.build
new file mode 100644
index 000000000..2fb3ec804
--- /dev/null
+++ b/lib/librte_table/meson.build
@@ -0,0 +1,52 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+version = 2
+sources = files('rte_table_lpm.c', 'rte_table_lpm_ipv6.c',
+		'rte_table_hash_cuckoo.c', 'rte_table_hash_key8.c',
+		'rte_table_hash_key16.c', 'rte_table_hash_key32.c',
+		'rte_table_hash_ext.c', 'rte_table_hash_lru.c',
+		'rte_table_array.c', 'rte_table_stub.c')
+headers = files('rte_table.h', 'rte_table_lpm.h',
+		'rte_table_lpm_ipv6.h', 'rte_table_hash.h',
+		'rte_lru.h', 'rte_table_array.h',
+		'rte_table_stub.h')
+deps += ['mbuf', 'port', 'lpm', 'hash']
+
+if arch_subdir == 'x86'
+	headers += files('rte_lru_x86.h')
+endif
+
+if dpdk_conf.has('RTE_LIBRTE_ACL')
+	sources += files('rte_table_acl.c')
+	headers += files('rte_table_acl.h')
+	deps += ['acl']
+endif
diff --git a/lib/librte_timer/meson.build b/lib/librte_timer/meson.build
new file mode 100644
index 000000000..0edc45772
--- /dev/null
+++ b/lib/librte_timer/meson.build
@@ -0,0 +1,33 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+sources = files('rte_timer.c')
+headers = files('rte_timer.h')
diff --git a/lib/librte_vhost/meson.build b/lib/librte_vhost/meson.build
new file mode 100644
index 000000000..5482169ca
--- /dev/null
+++ b/lib/librte_vhost/meson.build
@@ -0,0 +1,39 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 Intel Corporation.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if host_machine.system() != 'linux'
+	build = false
+endif
+version = 4
+sources = files('fd_man.c', 'socket.c', 'vhost.c', 'vhost_user.c',
+		'virtio_net.c')
+headers = files('rte_vhost.h')
+deps += ['ethdev']
diff --git a/lib/meson.build b/lib/meson.build
index 7cafe6666..d814721de 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -29,4 +29,71 @@
 #   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+# special case for eal, not a simple lib, and compat, just a header
 subdir('librte_eal')
+subdir('librte_compat')
+
+# process all libraries equally, as far as possible
+# "core" libs first, then others alphebetically as far as possible
+# NOTE: for speed of meson runs, the dependencies in the subdirectories
+# sometimes skip deps that would be implied by others, e.g. if mempool is
+# given as a dep, no need to mention ring. This is especially true for the
+# core libs which are widely reused, so their deps are kept to a minimum.
+libraries = ['ring', 'mempool', 'mbuf', 'net', 'ether', # core
+	'metrics', # bitrate/latency stats depends on this
+	'hash',    # efd depends on this
+	'kvargs',  # cryptodev depends on this
+	'acl', 'bitratestats', 'cfgfile', 'cmdline', 'cryptodev',
+	'distributor', 'efd', 'eventdev', 'gro', 'ip_frag', 'jobstats',
+	'kni', 'latencystats', 'lpm', 'meter', 'power', 'pdump',
+	'reorder', 'sched', 'timer', 'vhost',
+	# add pkt framework libs which use other libs from above
+	'port', 'table', 'pipeline']
+
+foreach l:libraries
+	build = true
+	name = l
+	version = 1
+	sources = []
+	headers = []
+	cflags = []
+	objs = [] # other object files to link against, used e.g. for instruction-
+	          # optimized versions of code
+	# use "deps" for internal DPDK dependencies, and "ext_deps" for
+	# external package/library requirements
+	deps = ['eal']
+	ext_deps = []
+
+	dir_name = 'librte_' + l
+	subdir(dir_name)
+
+	if build
+		dpdk_conf.set('RTE_LIBRTE_' + name.to_upper(), 1)
+		install_headers(headers)
+
+		dep_objs = ext_deps
+		foreach d:deps
+			dep_objs += [get_variable('dep_rte_' + d)]
+		endforeach
+
+		version_map = '@0@/@1@/rte_@2@_version.map'.format(
+				meson.current_source_dir(), dir_name, name)
+		libname = 'rte_' + name
+		lib = library(libname,
+				sources,
+				objects: objs,
+				c_args: cflags,
+				dependencies: dep_objs,
+				include_directories: include_directories(dir_name),
+				link_args: '-Wl,--version-script=' + version_map,
+				link_depends: version_map,
+				version: '@0@.1'.format(version),
+				install: true)
+		dep = declare_dependency(link_with: lib,
+				include_directories: include_directories(dir_name),
+				dependencies: dep_objs)
+		set_variable('dep_' + libname, dep)
+
+		dpdk_libraries = [lib] + dpdk_libraries
+	endif
+endforeach
-- 
2.13.5

^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH v3] devtools: rework abi checker script
  @ 2017-09-13 15:00  9%   ` Neil Horman
  2017-09-19  9:15  7%     ` Olivier MATZ
  2017-09-20  9:12 27%   ` [dpdk-dev] [PATCH v4] " Olivier Matz
  1 sibling, 1 reply; 200+ results
From: Neil Horman @ 2017-09-13 15:00 UTC (permalink / raw)
  To: Olivier Matz; +Cc: dev, bruce.richardson

On Mon, Sep 11, 2017 at 10:46:35AM +0200, Olivier Matz wrote:
> The initial version of the script had some limitations:
> - cannot work on a non-clean workspace
> - environment variables are not documented
> - no compilation log in case of failure
> - return success even it abi is incompatible
> 
> This patch addresses these issues and rework the code.
> 
> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
> ---
> 
> v2->v3:
> - fix when not launched from dpdk root dir
> - use "-Og -Wno-error" instead of "-O0"
> - fix typo in commit log
> 
> v1->v2:
> - use /usr/bin/env to find bash (which is required)
> - fix displayed path to html reports
> - reword help for -f option
> 
>  devtools/validate-abi.sh | 392 ++++++++++++++++++++++++-----------------------
>  1 file changed, 200 insertions(+), 192 deletions(-)
> 

This is alot closer, I think theres just a little wierdness left.  When running
this checker script, the end of the log shows this:

CMD: abi-compliance-checker -l librte_vhost.so -old /home/nhorman/git/dpdk/devtools/abi-check/222555480/librte_vhost.so.dump -new /home/nhorman/git/dpdk/devtools/abi-check/02657b4ad/librte_vhost.so.dump
NOTICE: At least one call to abi-compliance-checker returned an error.
NOTICE: ABI may be incompatible, please check logs for details.
NOTICE: Incompatible list:  librte_cryptodev.so librte_eal.so librte_efd.so librte_ethdev.so librte_eventdev.so librte_hash.so librte_pdump.so librte_pmd_crypto_scheduler.so librte_pmd_ring.so librte_ring.so

Which I think is something of a false positive.  The line:
NOTICE: At least one call to abi-compliance-checker returned an error.

I think is emitted simply because abi-compilance-checker returns non-zero and
reports that error if it finds any incompatibilities.  I'm not sure we want to
flag that as an error per se.  It gives the impression something has gone wrong,
rather than correctly identifying that there are incompatibilities.

Though on the other hand, maybe we do want to set that red flag so people look
at what the incompatibilities are.  As I say it out loud, perhaps that
preferable.

Thoughts
Neil

^ permalink raw reply	[relevance 9%]

* Re: [dpdk-dev] [PATCH v2 16/17] build: add option to version libs using DPDK version
  2017-09-13 11:32  5%     ` Luca Boccassi
@ 2017-09-13 13:11  0%       ` Bruce Richardson
  2017-09-13 17:02  0%         ` Luca Boccassi
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2017-09-13 13:11 UTC (permalink / raw)
  To: Luca Boccassi; +Cc: dev, nhorman, harry.van.haaren, Christian Ehrhardt

On Wed, Sep 13, 2017 at 12:32:24PM +0100, Luca Boccassi wrote:
> On Tue, 2017-09-12 at 11:38 +0100, Bruce Richardson wrote:
> > Normally, each library has it's own version number based on the ABI.
> > Add an option to have all libs just use the DPDK version number as
> > the
> > .so version.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > Reviewed-by: Harry van Haaren <harry.van.haaren@intel.com>
> > ---
> >  drivers/meson.build | 8 +++++++-
> >  lib/meson.build     | 8 +++++++-
> >  meson_options.txt   | 1 +
> >  3 files changed, 15 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/meson.build b/drivers/meson.build
> > index f19da16fb..0c251bd61 100644
> > --- a/drivers/meson.build
> > +++ b/drivers/meson.build
> > @@ -92,6 +92,12 @@ foreach class:driver_classes
> >  						depends:
> > [pmdinfogen, tmp_lib])
> >  			endforeach
> >  
> > +			if get_option('per_library_versions')
> > +				so_version = '@0@.1'.format(version)
> > +			else
> > +				so_version = meson.project_version()
> > +			endif
> > +
> >  			# now build the driver itself, and add to
> > the drivers list
> >  			lib_name = driver_name_fmt.format(name)
> >  			version_map = '@0@/@1@/@2@_version.map'.form
> > at(
> > @@ -105,7 +111,7 @@ foreach class:driver_classes
> >  				c_args: cflags,
> >  				link_args: '-Wl,--version-script=' +
> > version_map,
> >  				link_depends: version_map,
> > -				version: '@0@.1'.format(version),
> > +				version: so_version,
> >  				install: true,
> >  				install_dir: driver_install_path)
> >  
> > diff --git a/lib/meson.build b/lib/meson.build
> > index d814721de..36652cfe1 100644
> > --- a/lib/meson.build
> > +++ b/lib/meson.build
> > @@ -76,6 +76,12 @@ foreach l:libraries
> >  			dep_objs += [get_variable('dep_rte_' + d)]
> >  		endforeach
> >  
> > +		if get_option('per_library_versions')
> > +			so_version = '@0@.1'.format(version)
> > +		else
> > +			so_version = meson.project_version()
> > +		endif
> > +
> >  		version_map = '@0@/@1@/rte_@2@_version.map'.format(
> >  				meson.current_source_dir(),
> > dir_name, name)
> >  		libname = 'rte_' + name
> > @@ -87,7 +93,7 @@ foreach l:libraries
> >  				include_directories:
> > include_directories(dir_name),
> >  				link_args: '-Wl,--version-script=' +
> > version_map,
> >  				link_depends: version_map,
> > -				version: '@0@.1'.format(version),
> > +				version: so_version,
> >  				install: true)
> >  		dep = declare_dependency(link_with: lib,
> >  				include_directories:
> > include_directories(dir_name),
> > diff --git a/meson_options.txt b/meson_options.txt
> > index 9c45b8159..636226ce8 100644
> > --- a/meson_options.txt
> > +++ b/meson_options.txt
> > @@ -6,3 +6,4 @@ option('allow_invalid_socket_id', type: 'boolean',
> > value: false,
> >  	description: 'allow out-of-range NUMA socket id\'s for
> > platforms that don\'t report the value correctly')
> >  option('enable_kmods', type: 'boolean', value: true, description:
> > 'build kernel modules')
> >  option('kernel_dir', type: 'string', value: '', description: 'path
> > to the kernel for building kernel modules')
> > +option('per_library_versions', type: 'boolean', value: true,
> > description: 'true: each lib gets its own version number, false: DPDK
> > version used for each lib')
> 
> Hi Bruce,
> 
> First of all thanks for implementing this option, and sorry for the
> delay.
> 
> A couple of minor things:
> 
> 1) The project version has 3 digits, but the ABI version should have 2
> - eg: should be 17.08 but right now it's 17.08.0 - given point releases
> will be ABI compatible so they must not change the ABI version. In the
> packaging code we use cut to chop it off:
> 
> DPDK_ABI := $(shell echo $(DEB_VERSION_UPSTREAM) | cut -d '.'  -f1-2)
> 
> Not sure how to achieve the same in a Meson script though (can it shell
> out? or are there string manipulation built-ins?), sorry - just
> starting to look at it.
> 
That should be easy enough to do. It's 3-digits because I'm just pulling
the project version unmodified from the initial project definition. I'd
say I can manage to strip off one digit as part of the build.

> Right now the rte_config option allows the user to completely override
> the version - I'm fine with having a single boolean provided this
> change is applied, it simplifies packaging a bit, but if it's easier
> for you to just accepted a version instead of a boolean it's fine as
> well, as you prefer

If there is a case where we might want to provide a particular version,
I'm happy to edit the option, but if not I'll keep it as-is, because it
will ensure all users of the option get the exact same behaviour, and
means I only have two possibilities to test.

> 
> 2) When the option is true, it should not generate a symlink with the
> ABI "revision", as the first digit is really not the revision, so it
> does not make much sense. Worse, it will stop 2 versions being co-
> installable (which was the whole point :-) ), as, eg, 17.02, 17.05 and
> 17.08 will all ship a libfoo.so.17 symlink. I can fix it in the
> packaging, but I don't think it should be generated upstream at all
> when this option is enabled.

Not exactly sure how to fix this, but I think it may work by using
soversion as well as version in the library() calls.

> 
> IOW, the following is the current result:
> 
> $ ls -l debian/librte-ethdev17.08/usr/lib/x86_64-linux-gnu/
> total 72
> lrwxrwxrwx 1 lboccass lboccass    24 Sep 13 11:50 librte_ethdev.so.17 -> librte_ethdev.so.17.08.0
> -rw-r--r-- 1 lboccass lboccass 71672 Sep 13 11:50 librte_ethdev.so.17.08.0
> 
> The expected result would be to create a single file "librte_ethdev.so.17.08" instead.
> 

Let me see what I can do :-)

/Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2 16/17] build: add option to version libs using DPDK version
  2017-09-12 10:38  3%   ` [dpdk-dev] [PATCH v2 16/17] build: add option to version libs using DPDK version Bruce Richardson
@ 2017-09-13 11:32  5%     ` Luca Boccassi
  2017-09-13 13:11  0%       ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Luca Boccassi @ 2017-09-13 11:32 UTC (permalink / raw)
  To: Bruce Richardson, dev; +Cc: nhorman, harry.van.haaren, Christian Ehrhardt

On Tue, 2017-09-12 at 11:38 +0100, Bruce Richardson wrote:
> Normally, each library has it's own version number based on the ABI.
> Add an option to have all libs just use the DPDK version number as
> the
> .so version.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Reviewed-by: Harry van Haaren <harry.van.haaren@intel.com>
> ---
>  drivers/meson.build | 8 +++++++-
>  lib/meson.build     | 8 +++++++-
>  meson_options.txt   | 1 +
>  3 files changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/meson.build b/drivers/meson.build
> index f19da16fb..0c251bd61 100644
> --- a/drivers/meson.build
> +++ b/drivers/meson.build
> @@ -92,6 +92,12 @@ foreach class:driver_classes
>  						depends:
> [pmdinfogen, tmp_lib])
>  			endforeach
>  
> +			if get_option('per_library_versions')
> +				so_version = '@0@.1'.format(version)
> +			else
> +				so_version = meson.project_version()
> +			endif
> +
>  			# now build the driver itself, and add to
> the drivers list
>  			lib_name = driver_name_fmt.format(name)
>  			version_map = '@0@/@1@/@2@_version.map'.form
> at(
> @@ -105,7 +111,7 @@ foreach class:driver_classes
>  				c_args: cflags,
>  				link_args: '-Wl,--version-script=' +
> version_map,
>  				link_depends: version_map,
> -				version: '@0@.1'.format(version),
> +				version: so_version,
>  				install: true,
>  				install_dir: driver_install_path)
>  
> diff --git a/lib/meson.build b/lib/meson.build
> index d814721de..36652cfe1 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -76,6 +76,12 @@ foreach l:libraries
>  			dep_objs += [get_variable('dep_rte_' + d)]
>  		endforeach
>  
> +		if get_option('per_library_versions')
> +			so_version = '@0@.1'.format(version)
> +		else
> +			so_version = meson.project_version()
> +		endif
> +
>  		version_map = '@0@/@1@/rte_@2@_version.map'.format(
>  				meson.current_source_dir(),
> dir_name, name)
>  		libname = 'rte_' + name
> @@ -87,7 +93,7 @@ foreach l:libraries
>  				include_directories:
> include_directories(dir_name),
>  				link_args: '-Wl,--version-script=' +
> version_map,
>  				link_depends: version_map,
> -				version: '@0@.1'.format(version),
> +				version: so_version,
>  				install: true)
>  		dep = declare_dependency(link_with: lib,
>  				include_directories:
> include_directories(dir_name),
> diff --git a/meson_options.txt b/meson_options.txt
> index 9c45b8159..636226ce8 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -6,3 +6,4 @@ option('allow_invalid_socket_id', type: 'boolean',
> value: false,
>  	description: 'allow out-of-range NUMA socket id\'s for
> platforms that don\'t report the value correctly')
>  option('enable_kmods', type: 'boolean', value: true, description:
> 'build kernel modules')
>  option('kernel_dir', type: 'string', value: '', description: 'path
> to the kernel for building kernel modules')
> +option('per_library_versions', type: 'boolean', value: true,
> description: 'true: each lib gets its own version number, false: DPDK
> version used for each lib')

Hi Bruce,

First of all thanks for implementing this option, and sorry for the
delay.

A couple of minor things:

1) The project version has 3 digits, but the ABI version should have 2
- eg: should be 17.08 but right now it's 17.08.0 - given point releases
will be ABI compatible so they must not change the ABI version. In the
packaging code we use cut to chop it off:

DPDK_ABI := $(shell echo $(DEB_VERSION_UPSTREAM) | cut -d '.'  -f1-2)

Not sure how to achieve the same in a Meson script though (can it shell
out? or are there string manipulation built-ins?), sorry - just
starting to look at it.

Right now the rte_config option allows the user to completely override
the version - I'm fine with having a single boolean provided this
change is applied, it simplifies packaging a bit, but if it's easier
for you to just accepted a version instead of a boolean it's fine as
well, as you prefer

2) When the option is true, it should not generate a symlink with the
ABI "revision", as the first digit is really not the revision, so it
does not make much sense. Worse, it will stop 2 versions being co-
installable (which was the whole point :-) ), as, eg, 17.02, 17.05 and
17.08 will all ship a libfoo.so.17 symlink. I can fix it in the
packaging, but I don't think it should be generated upstream at all
when this option is enabled.

IOW, the following is the current result:

$ ls -l debian/librte-ethdev17.08/usr/lib/x86_64-linux-gnu/
total 72
lrwxrwxrwx 1 lboccass lboccass    24 Sep 13 11:50 librte_ethdev.so.17 -> librte_ethdev.so.17.08.0
-rw-r--r-- 1 lboccass lboccass 71672 Sep 13 11:50 librte_ethdev.so.17.08.0

The expected result would be to create a single file "librte_ethdev.so.17.08" instead.

-- 
Kind regards,
Luca Boccassi

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v3 0/2] ethdev new offloads API
  2017-09-13  6:37  4% ` [dpdk-dev] [PATCH v3 " Shahaf Shuler
@ 2017-09-13  9:10  0%   ` Andrew Rybchenko
  2017-09-17  6:54  4%   ` [dpdk-dev] [PATCH v4 0/3] " Shahaf Shuler
  1 sibling, 0 replies; 200+ results
From: Andrew Rybchenko @ 2017-09-13  9:10 UTC (permalink / raw)
  To: Shahaf Shuler, thomas; +Cc: dev

On 09/13/2017 09:37 AM, Shahaf Shuler wrote:
> Tx offloads configuration is per queue. Tx offloads are enabled by default,
> and can be disabled using ETH_TXQ_FLAGS_NO* flags.
> This behaviour is not consistent with the Rx side where the Rx offloads
> configuration is per port. Rx offloads are disabled by default and enabled
> according to bit field in rte_eth_rxmode structure.
>
> Moreover, considering more Tx and Rx offloads will be added
> over time, the cost of managing them all inside the PMD will be tremendous,
> as the PMD will need to check the matching for the entire offload set
> for each mbuf it handles.
> In addition, on the current approach each Rx offload added breaks the
> ABI compatibility as it requires to add entries to existing bit-fields.
>   
> The series address above issues by defining a new offloads API.
> With the new API, Tx and Rx offloads configuration is per queue.
> The offloads are disabled by default. Each offload can be enabled or
> disabled using the existing DEV_TX_OFFLOADS_* or DEV_RX_OFFLOADS_* flags.
> Such API will enable to easily add or remove offloads, without breaking the
> ABI compatibility.

It should be updated since offloads are configured now per-port and 
per-queue.

> The new API does not have an equivalent for the below Tx flags:
>
> * ETH_TXQ_FLAGS_NOREFCOUNT
> * ETH_TXQ_FLAGS_NOMULTMEMP
>
> The reason is that those flags are not to manage offloads, rather some
> guarantee from application on the way it uses mbufs, therefore could not be
> present as part of DEV_TX_OFFLOADS_*.
> Such flags are useful only for benchmarks, and therefore provide a non-realistic
> performance for DPDK customers using simple benchmarks for evaluation.
> Leveraging the work being done in this series to clean up those flags.

It should be updated since now you care about these flags as well.

> In order to provide a smooth transition between the APIs the following actions
> were taken:
> *  The old offloads API is kept for the meanwhile.
> *  New capabilities were added for PMD to advertize it has moved to the new
>     offloads API.
> *  Helper function which copy from old to new API were added to ethdev,
>     enabling the PMD to support only one of the APIs.
>
> Per discussion made on the RFC of this series [1], the integration plan which was
> decided is to do the transition in two phases:
> * ethdev API will move on 17.11.
> * Apps and examples will move on 18.02.
>
> This to enable PMD maintainers sufficient time to adopt the new API.
>
> [1]
> http://dpdk.org/ml/archives/dev/2017-August/072643.html
>
> on v3:
>   - Introduce the DEV_TX_OFFLOAD_MBUF_FAST_FREE to act as an equivalent
>     for the no refcnt and single mempool flags.
>   - Fix features documentation.
>   - Fix commnet style.
>
> on v2:
>   - Taking new approach of dividing offloads into per-queue and per-port one.
>   - Postpone the Tx/Rx public struct renaming to 18.02
>   - squash the helper functions into the Rx/Tx offloads intro patches.
>
> Shahaf Shuler (2):
>    ethdev: introduce Rx queue offloads API
>    ethdev: introduce Tx queue offloads API
>
>   doc/guides/nics/features.rst  |  66 +++++++----
>   lib/librte_ether/rte_ethdev.c | 220 ++++++++++++++++++++++++++++++++++---
>   lib/librte_ether/rte_ethdev.h |  89 ++++++++++++++-
>   3 files changed, 335 insertions(+), 40 deletions(-)

Many thanks for your work on this patch series.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] multi-process shared memory on PPC
  2017-09-12 18:11  0%     ` Xueming(Steven) Li
@ 2017-09-13  8:56  0%       ` Xueming(Steven) Li
  0 siblings, 0 replies; 200+ results
From: Xueming(Steven) Li @ 2017-09-13  8:56 UTC (permalink / raw)
  To: Chao Zhu; +Cc: dev

HI Chao,

Found a mmap MAP_SHARED issue in multi-process, the address returned seems to be a local malloc address, conflicts with other variable in secondary process, code:

Mmap in primary process initiates a shared address:
	addr = mmap(NULL, page_size, PROT_WRITE, MAP_SHARED, cmd_fd, offset);
At secondary process, the remapping of primary address with same offset and length succeed, but it corrupted a local variable allocated by calloc():
	addr = mmap((void *)pri_addr, page_size, PROT_WRITE, MAP_FIXED | MAP_SHARED, fd, offset);

Gdb log of secondary process, comments inside. Hope I'm wrong somewhere:

Thread 1 "symmetric_mp" hit Breakpoint 1, mlx5_init_context (vdev=0x10430c00, ctx=0x7ffff72200b8, cmd_fd=7)
    at /home/xueming/rdma-core/providers/mlx5/mlx5.c:888
888             gross_uuars = context->tot_uuars / MLX5_NUM_NON_FP_BFREGS_PER_UAR * NUM_BFREGS_PER_UAR;
(gdb) p context
$1 = (struct mlx5_context *) 0x7ffff72200b8
(gdb) p *context
$2 = {ibv_ctx = {device = 0x0, ops = {query_device = 0x0, query_port = 0x0, alloc_pd = 0x0, dealloc_pd = 0x0, reg_mr = 0x0, rereg_mr = 0x0, dereg_mr = 0x0,
...
/////////// the local variable "context" allocated by calloc() works well before mmap ///////////
 (gdb) c
Continuing.
Thread 1 "symmetric_mp" received signal SIGSEGV, Segmentation fault.
0x00007ffff7d06340 in free () from /lib/powerpc64le-linux-gnu/libc.so.6
(gdb) bt
#0  0x00007ffff7d06340 in free () from /lib/powerpc64le-linux-gnu/libc.so.6
#1  0x00007ffff7efd92c in mlx5_cleanup_context (device=0x10430c00, ibctx=0x7ffff72200b8) at /home/xueming/rdma-core/providers/mlx5/mlx5.c:1008
#2  0x00007ffff7f3cc74 in __ibv_close_device_1_1 (context=0x7ffff72200b8) at /home/xueming/rdma-core/libibverbs/device.c:285
#3  0x00000000101d8118 in mlx5_pci_probe (pci_drv=0x103345a8 <mlx5_driver>, pci_dev=0x10440510) at /home/xueming/mlnx-dpdk.org/drivers/net/mlx5/mlx5.c:925
...
(gdb) f 1
#1  0x00007ffff7efd92c in mlx5_cleanup_context (device=0x10430c00, ibctx=0x7ffff72200b8) at /home/xueming/rdma-core/providers/mlx5/mlx5.c:1008
1008            free(context->bfs);
(gdb) p context
$3 = (struct mlx5_context *) 0x7ffff72200b8
////////////same address///////////////
 (gdb) p *context
Cannot access memory at address 0x7ffff7250000
////////// This is the address returned by mmap() of primary address, conflicted here. /////////////////
(gdb) p sizeof(struct mlx5_context)
$5 = 199408
 (gdb) p/x  0x7ffff72200b8 + 199408
$7 = 0x7ffff7250ba8

Best Regards,
Xueming


> -----Original Message-----
> From: Xueming(Steven) Li
> Sent: Wednesday, September 13, 2017 2:11 AM
> To: Xueming(Steven) Li <xuemingl@mellanox.com>; Chao Zhu
> <chaozhu@linux.vnet.ibm.com>
> Cc: dev@dpdk.org
> Subject: RE: multi-process shared memory on PPC
> 
> It works for me after setting nr_overcommit_hugepages correctly, thanks again.
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Xueming(Steven)
> > Li
> > Sent: Tuesday, September 12, 2017 4:13 PM
> > To: Chao Zhu <chaozhu@linux.vnet.ibm.com>
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] multi-process shared memory on PPC
> >
> > Great, that might be something missing, will update later. Thanks!
> >
> > > -----Original Message-----
> > > From: Chao Zhu [mailto:chaozhu@linux.vnet.ibm.com]
> > > Sent: Tuesday, September 12, 2017 4:02 PM
> > > To: Xueming(Steven) Li <xuemingl@mellanox.com>
> > > Cc: dev@dpdk.org
> > > Subject: RE: multi-process shared memory on PPC
> > >
> > > Xueming,
> > >
> > > I tried it on my local server, it works fine.
> > > Did you set this value
> > > "/sys/kernel/mm/hugepages/hugepages-
> > 16384kB/nr_overcommit_hugepages" ?
> > > It should be the same value as "
> > > /sys/kernel/mm/hugepages/hugepages-16384kB/nr_hugepages" on
> ppc64le.
> > >
> > > > -----Original Message-----
> > > > From: Xueming(Steven) Li [mailto:xuemingl@mellanox.com]
> > > > Sent: 2017年8月31日 22:40
> > > > To: Chao Zhu <chaozhu@linux.vnet.ibm.com>
> > > > Cc: dev@dpdk.org
> > > > Subject: multi-process shared memory on PPC
> > > >
> > > > Hi all,
> > > >
> > > > I'm testing multi-process example on PowerPC system, looks like
> > > > shared memory not working properly.
> > > > Below are the error and debug info of the first multi-process
> > > > example 'simple_mp' (works as expected on X86):
> > > >
> > > > // Build DPDK, master branch
> > > > # make T=ppc_64-power8-linuxapp-gcc -j160 -C
> > > > examples/multi_process/simple_mp/ #
> > > > examples/multi_process/simple_mp/build/simple_mp  -w 0:0.0
> > > > --proc-type=primary -l 1-2 --socket-mem
> > > > 256,256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,256,256
> > > > APP: Finished Process Init.
> > > > Starting core 2
> > > > simple_mp >
> > > >
> > > > // Open another terminal and run secondary process # gdb --args
> > > > examples/multi_process/simple_mp/build/simple_mp -n 4 -w 0:0.0
> > > > --proc-type=secondary -l 3-4 --socket-mem
> > > > 256,256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,256,256
> > > > GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1 Copyright (C) 2016
> > > > Free Software Foundation, Inc.
> > > > License GPLv3+: GNU GPL version 3 or later
> > > >
> > > <https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2F
> > > ur
> > > ldef
> > > ense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttp-
> > >
> >
> 3A__gnu.org_licenses_gpl&data=02%7C01%7Cxuemingl%40mellanox.com%7C
> > >
> >
> 9cd11fda7a7f48df7cbd08d4f9b486d8%7Ca652971c7d2e4d9ba6a4d149256f461
> > >
> >
> b%7C0%7C0%7C636408001138751301&sdata=bb3hwYz7ehCqt4QA6GGqTDMY
> > > kY1qAJV%2BCMDBVbXmWzE%3D&reserved=0.
> > > h
> > > > tml&d=DwIFAg&c=jf_iaSHvJObTbx-
> > > siA1ZOg&r=4TYe4NpqlgVi0ArYpZ76FrWp7IE
> > > > w8gfzq7k4itCX_Mg&m=lz_1z0LzwjqjIwuuryoN7QPg9N-
> > 6aTY_jEvDZtMZR0o&s
> > > > =SbDQBN7qJ9z8fWCSePyvm5FFncp2P_9XZm-qs1lH5PE&e= > This is free
> > > > software: you are free to change and redistribute it.
> > > > There is NO WARRANTY, to the extent permitted by law.  Type "show
> > > copying"
> > > > and "show warranty" for details.
> > > > This GDB was configured as "powerpc64le-linux-gnu".
> > > > Type "show configuration" for configuration details.
> > > > For bug reporting instructions, please see:
> > > > <https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%
> > > > 2F
> > > > ur
> > > > ldefense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttp-
> > > 3A__www.gnu.org_softwar&
> > > >
> > >
> >
> data=02%7C01%7Cxuemingl%40mellanox.com%7C9cd11fda7a7f48df7cbd08d4f
> > > 9b48
> > > >
> > >
> >
> 6d8%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C63640800113875
> > > 1301&sd
> > > >
> > >
> >
> ata=4DNDTyIcHpTIU60K7FM%2F1zuASSB1IdZDRyOaiVp1Y%2BY%3D&reserved=
> > > 0
> > > > e_gdb_bugs_&d=DwIFAg&c=jf_iaSHvJObTbx-
> > > siA1ZOg&r=4TYe4NpqlgVi0ArYpZ
> > > > 76FrWp7IEw8gfzq7k4itCX_Mg&m=lz_1z0LzwjqjIwuuryoN7QPg9N-
> > > 6aTY_jEvDZt
> > > > MZR0o&s=GAFKK3jSahAPFXMGcPGbVNTl0CesJy_qfs5TxXfGOX0&e= >.
> > > > Find the GDB manual and other documentation resources online at:
> > > > <https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%
> > > > 2F
> > > > ur
> > > > ldefense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttp-
> > > 3A__www.gnu.org_softwar&
> > > >
> > >
> >
> data=02%7C01%7Cxuemingl%40mellanox.com%7C9cd11fda7a7f48df7cbd08d4f
> > > 9b48
> > > >
> > >
> >
> 6d8%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C63640800113875
> > > 1301&sd
> > > >
> > >
> >
> ata=4DNDTyIcHpTIU60K7FM%2F1zuASSB1IdZDRyOaiVp1Y%2BY%3D&reserved=
> > > 0
> > > > e_gdb_documentation_&d=DwIFAg&c=jf_iaSHvJObTbx-
> > > siA1ZOg&r=4TYe4Npql
> > > >
> > gVi0ArYpZ76FrWp7IEw8gfzq7k4itCX_Mg&m=lz_1z0LzwjqjIwuuryoN7QPg9N-
> > > 6a
> > > > TY_jEvDZtMZR0o&s=JdkMMjGGl-
> > > 3Z3BGnjCkOFP5lI5BIbRNBxH4EVI70YFc&e= > .
> > > > For help, type "help".
> > > > Type "apropos word" to search for commands related to "word"...
> > > > Reading symbols from
> > > > examples/multi_process/simple_mp/build/simple_mp...done.
> > > > (gdb) r
> > > > Starting program:
> > > > /home/xueming/mlnx-
> > > dpdk.org/examples/multi_process/simple_mp/build/sim
> > > > ple_mp -n 4 -w 0:0.0 --proc-type=secondary -l 3-4 --socket-mem
> > > > 256,256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,256,256
> > > > [Thread debugging using libthread_db enabled] Using host
> > > > libthread_db
> > > library
> > > > "/lib/powerpc64le-linux-gnu/libthread_db.so.1".
> > > > EAL: Detected 144 lcore(s)
> > > > EAL: Probing VFIO support...
> > > > [New Thread 0x7ffff7a6eff0 (LWP 58811)] [New Thread 0x7ffff726eff0
> > > > (LWP 58812)]
> > > >
> > > > Thread 1 "simple_mp" received signal SIGSEGV, Segmentation fault.
> > > > 0x00007ffff7d2f3ec in ?? () from
> > > > /lib/powerpc64le-linux-gnu/libc.so.6
> > > >  (gdb) bt full
> > > > #0  0x00007ffff7d2f3ec in ?? () from
> > > > /lib/powerpc64le-linux-gnu/libc.so.6
> > > > No symbol table info available.
> > > > #1  0x0000000010077d54 in rte_ring_lookup (name=0x102a4e28
> > > > "PRI_2_SEC")
> > > >     at /home/xueming/mlnx-dpdk.org/lib/librte_ring/rte_ring.c:326
> > > >         te = 0x7ef3eefd5e00
> > > >         r = 0x0
> > > >         ring_list = 0x7ffff7aa250c
> > > > #2  0x0000000010032640 in main (argc=10, argv=0x7ffffffff3e8)
> > > >     at
> > > > /home/xueming/mlnx-
> > > dpdk.org/examples/multi_process/simple_mp/main.c:12
> > > > 8
> > > >         flags = 0
> > > >         ring_size = 64
> > > >         pool_size = 1024
> > > >         pool_cache = 32
> > > >         priv_data_sz = 0
> > > >         ret = 9
> > > >         lcore_id = 32767
> > > >         cl = 0x7ffff7fef718 <_dl_argv>
> > > > (gdb) f 1
> > > > #1  0x0000000010077d54 in rte_ring_lookup (name=0x102a4e28
> > > > "PRI_2_SEC")
> > > >     at /home/xueming/mlnx-dpdk.org/lib/librte_ring/rte_ring.c:326
> > > > 326                     if (strncmp(name, r->name,
> > > > RTE_RING_NAMESIZE) == 0)
> > > > (gdb) l
> > > > 321
> > > > 322             rte_rwlock_read_lock(RTE_EAL_TAILQ_RWLOCK);
> > > > 323
> > > > 324             TAILQ_FOREACH(te, ring_list, next) {
> > > > 325                     r = (struct rte_ring *) te->data;
> > > > 326                     if (strncmp(name, r->name,
> > > > RTE_RING_NAMESIZE) == 0)
> > > > 327                             break;
> > > > 328             }
> > > > 329
> > > > 330             rte_rwlock_read_unlock(RTE_EAL_TAILQ_RWLOCK);
> > > > (gdb) p *te
> > > > $1 = {next = {tqe_next = 0x0, tqe_prev = 0x0}, data = 0x0}
> > > > (gdb) p *ring_list
> > > > $2 = {tqh_first = 0x7ef3eefd5e00, tqh_last = 0x7ef3eec6d100}
> > > >
> > > > # uname -a
> > > > Linux dragon-power-01 4.13.0-rc2 #1 SMP Tue Aug 29 17:27:05 IDT
> > > > 2017 ppc64le ppc64le ppc64le GNU/Linux
> > > >
> > > > # cat /etc/issue
> > > > Ubuntu 16.04.2 LTS \n \l
> > > >
> > > > # gcc --version
> > > > gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 Copyright
> > > > (C)
> > > > 2015 Free Software Foundation, Inc.
> > > > This is free software; see the source for copying conditions.
> > > > There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR
> > > > A PARTICULAR PURPOSE.
> > > >
> > > > # lscpu
> > > > Architecture:          ppc64le
> > > > Byte Order:            Little Endian
> > > > CPU(s):                144
> > > > On-line CPU(s) list:   0-87,96-103,112-159
> > > > Thread(s) per core:    8
> > > > Core(s) per socket:    4
> > > > Socket(s):             4
> > > > NUMA node(s):          4
> > > > Model:                 2.1 (pvr 004b 0201)
> > > > Model name:            POWER8E (raw), altivec supported
> > > > CPU max MHz:           3690.0000
> > > > CPU min MHz:           2061.0000
> > > > L1d cache:             64K
> > > > L1i cache:             32K
> > > > L2 cache:              512K
> > > > L3 cache:              8192K
> > > > NUMA node0 CPU(s):     0-39
> > > > NUMA node1 CPU(s):     40-79
> > > > NUMA node16 CPU(s):    80-87,96-103,112-119
> > > > NUMA node17 CPU(s):    120-159
> > > >
> > > > # cat build/.config
> > > > # RTE_EXEC_ENV values are the directories in mk/exec-env/
> > > > CONFIG_RTE_EXEC_ENV="linuxapp"
> > > > # RTE_ARCH values are architecture we compile for. directories in
> > > > mk/arch/ CONFIG_RTE_ARCH="ppc_64"
> > > > # machine can define specific variables or action for a specific
> > > > board # RTE_MACHINE values are architecture we compile for.
> > > > directories in mk/machine/ CONFIG_RTE_MACHINE="power8"
> > > > # The compiler we use.
> > > > # RTE_TOOLCHAIN values are architecture we compile for.
> > > > directories in mk/toolchain/ CONFIG_RTE_TOOLCHAIN="gcc"
> > > > # Use intrinsics or assembly code for key routines
> > > > CONFIG_RTE_FORCE_INTRINSICS=n # Machine forces strict alignment
> > > > constraints.
> > > > CONFIG_RTE_ARCH_STRICT_ALIGN=n
> > > > # Compile to share library
> > > > CONFIG_RTE_BUILD_SHARED_LIB=n
> > > > # Use newest code breaking previous ABI CONFIG_RTE_NEXT_ABI=y #
> > > > Major ABI to overwrite library specific LIBABIVER
> > > > CONFIG_RTE_MAJOR_ABI= # Machine's cache line size
> > > > CONFIG_RTE_CACHE_LINE_SIZE=128
> > > > # Compile Environment Abstraction Layer CONFIG_RTE_LIBRTE_EAL=y
> > > > CONFIG_RTE_MAX_LCORE=256
> > > > CONFIG_RTE_MAX_NUMA_NODES=32
> > > > CONFIG_RTE_MAX_MEMSEG=256
> > > > CONFIG_RTE_MAX_MEMZONE=2560
> > > > CONFIG_RTE_MAX_TAILQ=32
> > > > CONFIG_RTE_LOG_LEVEL=RTE_LOG_INFO
> > > > CONFIG_RTE_LOG_DP_LEVEL=RTE_LOG_INFO
> > > > CONFIG_RTE_LOG_HISTORY=256
> > > > CONFIG_RTE_BACKTRACE=y
> > > > CONFIG_RTE_LIBEAL_USE_HPET=n
> > > > CONFIG_RTE_EAL_ALLOW_INV_SOCKET_ID=n
> > > > CONFIG_RTE_EAL_ALWAYS_PANIC_ON_ERROR=n
> > > > CONFIG_RTE_EAL_IGB_UIO=y
> > > > CONFIG_RTE_EAL_VFIO=y
> > > > CONFIG_RTE_MALLOC_DEBUG=n
> > > > CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=y
> > > > # Recognize/ignore architecture we compile for. AVX/AVX512 CPU
> > > > flags for performance/power testing.
> > > > # AVX512 is marked as experimental for now, will enable it after
> > > > enough #
> > > field
> > > > test and possible optimization.
> > > > CONFIG_RTE_ENABLE_AVX=y
> > > > CONFIG_RTE_ENABLE_AVX512=n
> > > > # Default driver path (or "" to disable) CONFIG_RTE_EAL_PMD_PATH=""
> > > > # Compile Environment Abstraction Layer to support Vmware TSC map
> > > > CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=n
> > > > # Compile architecture we compile for. argument parser library
> > > > CONFIG_RTE_LIBRTE_KVARGS=y # Compile generic ethernet library
> > > > CONFIG_RTE_LIBRTE_ETHER=y CONFIG_RTE_LIBRTE_ETHDEV_DEBUG=n
> > > > CONFIG_RTE_MAX_ETHPORTS=32
> > > > CONFIG_RTE_MAX_QUEUES_PER_PORT=1024
> > > > CONFIG_RTE_LIBRTE_IEEE1588=n
> > > > CONFIG_RTE_ETHDEV_QUEUE_STAT_CNTRS=16
> > > > CONFIG_RTE_ETHDEV_RXTX_CALLBACKS=y
> > > > # Turn off Tx preparation stage
> > > > # Warning: rte_eth_tx_prepare() can be safely disabled only if
> > > > using a #
> > > driver
> > > > which do not implement any Tx preparation.
> > > > CONFIG_RTE_ETHDEV_TX_PREPARE_NOOP=n
> > > > # Compile burst-oriented Amazon ENA PMD driver
> > > > CONFIG_RTE_LIBRTE_ENA_PMD=y
> > CONFIG_RTE_LIBRTE_ENA_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_ENA_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_ENA_DEBUG_TX_FREE=n
> > > > CONFIG_RTE_LIBRTE_ENA_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_ENA_COM_DEBUG=n
> > > > # Compile burst-oriented IGB & EM PMD drivers
> > > > CONFIG_RTE_LIBRTE_EM_PMD=y CONFIG_RTE_LIBRTE_IGB_PMD=y
> > > > CONFIG_RTE_LIBRTE_E1000_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_E1000_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_E1000_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_E1000_DEBUG_TX_FREE=n
> > > > CONFIG_RTE_LIBRTE_E1000_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_E1000_PF_DISABLE_STRIP_CRC=n
> > > > # Compile burst-oriented IXGBE PMD driver
> > > > CONFIG_RTE_LIBRTE_IXGBE_PMD=n
> > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_TX_FREE=n
> > > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC=n
> > > > CONFIG_RTE_IXGBE_INC_VECTOR=y
> > > > CONFIG_RTE_LIBRTE_IXGBE_BYPASS=n
> > > > # Compile burst-oriented I40E PMD driver
> > > > CONFIG_RTE_LIBRTE_I40E_PMD=y
> > CONFIG_RTE_LIBRTE_I40E_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_I40E_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_I40E_DEBUG_TX_FREE=n
> > > > CONFIG_RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC=y
> > > > CONFIG_RTE_LIBRTE_I40E_INC_VECTOR=y
> > > > CONFIG_RTE_LIBRTE_I40E_16BYTE_RX_DESC=n
> > > > CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_PF=64
> > > > CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_VF=4
> > > > CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM=4
> > > > # interval up to 8160 us, aligned to 2 (or default value)
> > > > CONFIG_RTE_LIBRTE_I40E_ITR_INTERVAL=-1
> > > > # Compile burst-oriented FM10K PMD
> CONFIG_RTE_LIBRTE_FM10K_PMD=n
> > > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_TX_FREE=n
> > > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE=y
> > > > CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR=y
> > > > # Compile burst-oriented Mellanox ConnectX-3 (MLX4) PMD
> > > > CONFIG_RTE_LIBRTE_MLX4_PMD=n
> CONFIG_RTE_LIBRTE_MLX4_DEBUG=n
> > > > CONFIG_RTE_LIBRTE_MLX4_DEBUG_BROKEN_VERBS=n
> > > > CONFIG_RTE_LIBRTE_MLX4_SGE_WR_N=4
> > > > CONFIG_RTE_LIBRTE_MLX4_MAX_INLINE=0
> > > > CONFIG_RTE_LIBRTE_MLX4_TX_MP_CACHE=8
> > > > CONFIG_RTE_LIBRTE_MLX4_SOFT_COUNTERS=1
> > > > # Compile burst-oriented Mellanox ConnectX-4 & ConnectX-5 (MLX5)
> > > > PMD CONFIG_RTE_LIBRTE_MLX5_PMD=y
> CONFIG_RTE_LIBRTE_MLX5_DEBUG=n
> > > > CONFIG_RTE_LIBRTE_MLX5_TX_MP_CACHE=8
> > > > # Compile burst-oriented Broadcom PMD driver
> > > > CONFIG_RTE_LIBRTE_BNX2X_PMD=n
> > CONFIG_RTE_LIBRTE_BNX2X_DEBUG=n
> > > > CONFIG_RTE_LIBRTE_BNX2X_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_BNX2X_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_BNX2X_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_BNX2X_MF_SUPPORT=n
> > > > CONFIG_RTE_LIBRTE_BNX2X_DEBUG_PERIODIC=n
> > > > # Compile burst-oriented Chelsio Terminator (CXGBE) PMD
> > > > CONFIG_RTE_LIBRTE_CXGBE_PMD=y
> > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG=n
> > > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG_REG=n
> > > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG_MBOX=n
> > > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_CXGBE_TPUT=y
> > > > # Compile burst-oriented Cisco ENIC PMD driver
> > > > CONFIG_RTE_LIBRTE_ENIC_PMD=n CONFIG_RTE_LIBRTE_ENIC_DEBUG=n
> > > > CONFIG_RTE_LIBRTE_ENIC_DEBUG_FLOW=n
> > > > # Compile burst-oriented Netronome NFP PMD driver
> > > > CONFIG_RTE_LIBRTE_NFP_PMD=y CONFIG_RTE_LIBRTE_NFP_DEBUG=n #
> > > Compile
> > > > burst-oriented Broadcom BNXT PMD driver
> > > CONFIG_RTE_LIBRTE_BNXT_PMD=y #
> > > > Compile burst-oriented Solarflare libefx-based PMD
> > > > CONFIG_RTE_LIBRTE_SFC_EFX_PMD=n
> > > CONFIG_RTE_LIBRTE_SFC_EFX_DEBUG=n #
> > > > Compile software PMD backed by
> > > > SZEDATA2 device CONFIG_RTE_LIBRTE_PMD_SZEDATA2=n # Defines
> > > firmware
> > > > type address space.
> > > > # See documentation for supported values.
> > > > # Other values raise compile time error.
> > > > CONFIG_RTE_LIBRTE_PMD_SZEDATA2_AS=0
> > > > # Compile burst-oriented Cavium Thunderx NICVF PMD driver
> > > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_PMD=y
> > > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_MBOX=n
> > > > # Compile burst-oriented Cavium LiquidIO PMD driver
> > > > CONFIG_RTE_LIBRTE_LIO_PMD=y
> > > CONFIG_RTE_LIBRTE_LIO_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_LIO_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_LIO_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_LIO_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_LIO_DEBUG_MBOX=n
> > > > CONFIG_RTE_LIBRTE_LIO_DEBUG_REGS=n
> > > > # Compile NXP DPAA2 FSL-MC Bus
> > > > CONFIG_RTE_LIBRTE_FSLMC_BUS=n
> > > > # Compile Support Libraries for NXP DPAA2
> > > > CONFIG_RTE_LIBRTE_DPAA2_MEMPOOL=n
> > > > CONFIG_RTE_LIBRTE_DPAA2_USE_PHYS_IOVA=y
> > > > # Compile burst-oriented NXP DPAA2 PMD driver
> > > > CONFIG_RTE_LIBRTE_DPAA2_PMD=n
> > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_TX_FREE=n
> > > > # Compile burst-oriented VIRTIO PMD driver
> > > > CONFIG_RTE_LIBRTE_VIRTIO_PMD=y
> > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_DUMP=n
> > > > # Compile virtio device emulation inside virtio PMD driver
> > > > CONFIG_RTE_VIRTIO_USER=y # Compile burst-oriented VMXNET3 PMD
> > > driver
> > > > CONFIG_RTE_LIBRTE_VMXNET3_PMD=n
> > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_TX_FREE=n
> > > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_DRIVER=n
> > > > # Compile example software rings based PMD
> > > > CONFIG_RTE_LIBRTE_PMD_RING=y
> > > > CONFIG_RTE_PMD_RING_MAX_RX_RINGS=16
> > > > CONFIG_RTE_PMD_RING_MAX_TX_RINGS=16
> > > > # Compile software PMD backed by PCAP files
> > > > CONFIG_RTE_LIBRTE_PMD_PCAP=n # Compile link bonding PMD library
> > > > CONFIG_RTE_LIBRTE_PMD_BOND=y
> > > CONFIG_RTE_LIBRTE_BOND_DEBUG_ALB=n
> > > > CONFIG_RTE_LIBRTE_BOND_DEBUG_ALB_L1=n
> > > > # QLogic 10G/25G/40G/50G/100G PMD
> > > > CONFIG_RTE_LIBRTE_QEDE_PMD=y
> > > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_INFO=n
> > > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_RX=n
> > > > #Provides abs path/name of architecture we compile for. firmware file.
> > > > #Empty string denotes driver will use default firmware
> > > > CONFIG_RTE_LIBRTE_QEDE_FW=""
> > > > # Compile software PMD backed by AF_PACKET sockets (Linux only)
> > > > CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y # Compile ARK PMD
> > > > CONFIG_RTE_LIBRTE_ARK_PMD=y CONFIG_RTE_LIBRTE_ARK_PAD_TX=y
> > > > CONFIG_RTE_LIBRTE_ARK_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_ARK_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_ARK_DEBUG_STATS=n
> > > > CONFIG_RTE_LIBRTE_ARK_DEBUG_TRACE=n
> > > > # Compile WRS accelerated virtual port (AVP) guest PMD driver
> > > > CONFIG_RTE_LIBRTE_AVP_PMD=n
> > CONFIG_RTE_LIBRTE_AVP_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_AVP_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y
> > > > CONFIG_RTE_LIBRTE_AVP_DEBUG_BUFFERS=n
> > > > # Compile architecture we compile for. TAP PMD # It is enabled by
> > > > default
> > > for
> > > > Linux only.
> > > > CONFIG_RTE_LIBRTE_PMD_TAP=y
> > > > # Compile Xen PMD
> > > > CONFIG_RTE_LIBRTE_PMD_XENVIRT=n
> > > > # Compile null PMD
> > > > CONFIG_RTE_LIBRTE_PMD_NULL=y
> > > > # Compile fail-safe PMD
> > > > CONFIG_RTE_LIBRTE_PMD_FAILSAFE=y
> > > > # Do prefetch of packet data within PMD driver receive function
> > > > CONFIG_RTE_PMD_PACKET_PREFETCH=y # Compile generic crypto
> device
> > > > library CONFIG_RTE_LIBRTE_CRYPTODEV=y
> > > > CONFIG_RTE_LIBRTE_CRYPTODEV_DEBUG=n
> > > > CONFIG_RTE_CRYPTO_MAX_DEVS=64
> > > > CONFIG_RTE_CRYPTODEV_NAME_LEN=64
> > > > # Compile PMD for ARMv8 Crypto device
> > > > CONFIG_RTE_LIBRTE_PMD_ARMV8_CRYPTO=n
> > > > CONFIG_RTE_LIBRTE_PMD_ARMV8_CRYPTO_DEBUG=n
> > > > # Compile NXP DPAA2 crypto sec driver for CAAM HW
> > > > CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC=n
> > > > CONFIG_RTE_LIBRTE_DPAA2_SEC_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_DPAA2_SEC_DEBUG_DRIVER=n
> > > > CONFIG_RTE_LIBRTE_DPAA2_SEC_DEBUG_RX=n
> > > > # Compile PMD for QuickAssist based devices
> > > > CONFIG_RTE_LIBRTE_PMD_QAT=n
> > > CONFIG_RTE_LIBRTE_PMD_QAT_DEBUG_INIT=n
> > > > CONFIG_RTE_LIBRTE_PMD_QAT_DEBUG_TX=n
> > > > CONFIG_RTE_LIBRTE_PMD_QAT_DEBUG_RX=n
> > > > CONFIG_RTE_LIBRTE_PMD_QAT_DEBUG_DRIVER=n
> > > > # Number of sessions to create in architecture we compile for.
> > > > session
> > > memory
> > > > pool # on a single QuickAssist device.
> > > > CONFIG_RTE_QAT_PMD_MAX_NB_SESSIONS=2048
> > > > # Compile PMD for AESNI backed device
> > > > CONFIG_RTE_LIBRTE_PMD_AESNI_MB=n
> > > > CONFIG_RTE_LIBRTE_PMD_AESNI_MB_DEBUG=n
> > > > # Compile PMD for Software backed device
> > > > CONFIG_RTE_LIBRTE_PMD_OPENSSL=n
> > > CONFIG_RTE_LIBRTE_PMD_OPENSSL_DEBUG=n
> > > > # Compile PMD for AESNI GCM device
> > > > CONFIG_RTE_LIBRTE_PMD_AESNI_GCM=n
> > > > CONFIG_RTE_LIBRTE_PMD_AESNI_GCM_DEBUG=n
> > > > # Compile PMD for SNOW 3G device
> > > > CONFIG_RTE_LIBRTE_PMD_SNOW3G=n
> > > > CONFIG_RTE_LIBRTE_PMD_SNOW3G_DEBUG=n
> > > > # Compile PMD for KASUMI device
> > > > CONFIG_RTE_LIBRTE_PMD_KASUMI=n
> > > > CONFIG_RTE_LIBRTE_PMD_KASUMI_DEBUG=n
> > > > # Compile PMD for ZUC device
> > > > CONFIG_RTE_LIBRTE_PMD_ZUC=n
> > > > CONFIG_RTE_LIBRTE_PMD_ZUC_DEBUG=n
> > > > # Compile PMD for Crypto Scheduler device
> > > > CONFIG_RTE_LIBRTE_PMD_CRYPTO_SCHEDULER=y
> > > > CONFIG_RTE_LIBRTE_PMD_CRYPTO_SCHEDULER_DEBUG=n
> > > > # Compile PMD for NULL Crypto device
> > > > CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO=y
> > > > # Compile generic event device library
> > > > CONFIG_RTE_LIBRTE_EVENTDEV=y
> CONFIG_RTE_LIBRTE_EVENTDEV_DEBUG=n
> > > > CONFIG_RTE_EVENT_MAX_DEVS=16
> > > > CONFIG_RTE_EVENT_MAX_QUEUES_PER_DEV=64
> > > > # Compile PMD for skeleton event device
> > > > CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV=y
> > > > CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV_DEBUG=n
> > > > # Compile PMD for software event device
> > > > CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV=y
> > > > CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV_DEBUG=n
> > > > # Compile PMD for octeontx sso event device
> > > > CONFIG_RTE_LIBRTE_PMD_OCTEONTX_SSOVF=y
> > > > CONFIG_RTE_LIBRTE_PMD_OCTEONTX_SSOVF_DEBUG=n
> > > > # Compile librte_ring
> > > > CONFIG_RTE_LIBRTE_RING=y
> > > > # Compile librte_mempool
> > > > CONFIG_RTE_LIBRTE_MEMPOOL=y
> > > > CONFIG_RTE_MEMPOOL_CACHE_MAX_SIZE=512
> > > > CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG=n
> > > > # Compile Mempool drivers
> > > > CONFIG_RTE_DRIVER_MEMPOOL_RING=y
> > > > CONFIG_RTE_DRIVER_MEMPOOL_STACK=y
> > > > # Compile librte_mbuf
> > > > CONFIG_RTE_LIBRTE_MBUF=y
> > > > CONFIG_RTE_LIBRTE_MBUF_DEBUG=n
> > > > CONFIG_RTE_MBUF_DEFAULT_MEMPOOL_OPS="ring_mp_mc"
> > > > CONFIG_RTE_MBUF_REFCNT_ATOMIC=y
> > > > CONFIG_RTE_PKTMBUF_HEADROOM=128
> > > > # Compile librte_timer
> > > > CONFIG_RTE_LIBRTE_TIMER=y
> > > > CONFIG_RTE_LIBRTE_TIMER_DEBUG=n
> > > > # Compile librte_cfgfile
> > > > CONFIG_RTE_LIBRTE_CFGFILE=y
> > > > # Compile librte_cmdline
> > > > CONFIG_RTE_LIBRTE_CMDLINE=y
> > > > CONFIG_RTE_LIBRTE_CMDLINE_DEBUG=n
> > > > # Compile librte_hash
> > > > CONFIG_RTE_LIBRTE_HASH=y
> > > > CONFIG_RTE_LIBRTE_HASH_DEBUG=n
> > > > # Compile librte_efd
> > > > CONFIG_RTE_LIBRTE_EFD=y
> > > > # Compile librte_jobstats
> > > > CONFIG_RTE_LIBRTE_JOBSTATS=y
> > > > # Compile architecture we compile for. device metrics library
> > > > CONFIG_RTE_LIBRTE_METRICS=y # Compile architecture we compile for.
> > > > bitrate statistics library CONFIG_RTE_LIBRTE_BITRATE=y # Compile
> > > > architecture we compile for. latency statistics library
> > > > CONFIG_RTE_LIBRTE_LATENCY_STATS=y # Compile librte_lpm
> > > > CONFIG_RTE_LIBRTE_LPM=y CONFIG_RTE_LIBRTE_LPM_DEBUG=n #
> > > Compile
> > > > librte_acl CONFIG_RTE_LIBRTE_ACL=y
> > CONFIG_RTE_LIBRTE_ACL_DEBUG=n
> > > #
> > > > Compile librte_power CONFIG_RTE_LIBRTE_POWER=y
> > > > CONFIG_RTE_LIBRTE_POWER_DEBUG=n
> > > > CONFIG_RTE_MAX_LCORE_FREQS=64
> > > > # Compile librte_net
> > > > CONFIG_RTE_LIBRTE_NET=y
> > > > # Compile librte_ip_frag
> > > > CONFIG_RTE_LIBRTE_IP_FRAG=y
> > > > CONFIG_RTE_LIBRTE_IP_FRAG_DEBUG=n
> > > > CONFIG_RTE_LIBRTE_IP_FRAG_MAX_FRAG=4
> > > > CONFIG_RTE_LIBRTE_IP_FRAG_TBL_STAT=n
> > > > # Compile GRO library
> > > > CONFIG_RTE_LIBRTE_GRO=y
> > > > # Compile librte_meter
> > > > CONFIG_RTE_LIBRTE_METER=y
> > > > # Compile librte_sched
> > > > CONFIG_RTE_LIBRTE_SCHED=y
> > > > CONFIG_RTE_SCHED_DEBUG=n
> > > > CONFIG_RTE_SCHED_RED=n
> > > > CONFIG_RTE_SCHED_COLLECT_STATS=n
> > > > CONFIG_RTE_SCHED_SUBPORT_TC_OV=n
> > > > CONFIG_RTE_SCHED_PORT_N_GRINDERS=8
> > > > CONFIG_RTE_SCHED_VECTOR=n
> > > > # Compile architecture we compile for. distributor library
> > > > CONFIG_RTE_LIBRTE_DISTRIBUTOR=y # Compile architecture we compile
> > for.
> > > > reorder library CONFIG_RTE_LIBRTE_REORDER=y # Compile librte_port
> > > > CONFIG_RTE_LIBRTE_PORT=y CONFIG_RTE_PORT_STATS_COLLECT=n
> > > > CONFIG_RTE_PORT_PCAP=n # Compile librte_table
> > > > CONFIG_RTE_LIBRTE_TABLE=y CONFIG_RTE_TABLE_STATS_COLLECT=n #
> > > Compile
> > > > librte_pipeline CONFIG_RTE_LIBRTE_PIPELINE=y
> > > > CONFIG_RTE_PIPELINE_STATS_COLLECT=n
> > > > # Compile librte_kni
> > > > CONFIG_RTE_LIBRTE_KNI=y
> > > > CONFIG_RTE_LIBRTE_PMD_KNI=y
> > > > CONFIG_RTE_KNI_KMOD=y
> > > > CONFIG_RTE_KNI_KMOD_ETHTOOL=n
> > > > CONFIG_RTE_KNI_PREEMPT_DEFAULT=y
> > > > # Compile architecture we compile for. pdump library
> > > > CONFIG_RTE_LIBRTE_PDUMP=y # Compile vhost user library
> > > > CONFIG_RTE_LIBRTE_VHOST=y CONFIG_RTE_LIBRTE_VHOST_NUMA=y
> > > > CONFIG_RTE_LIBRTE_VHOST_DEBUG=n # Compile vhost PMD # To
> compile,
> > > > CONFIG_RTE_LIBRTE_VHOST should be enabled.
> > > > CONFIG_RTE_LIBRTE_PMD_VHOST=y
> > > > #Compile Xen domain0 support
> > > > CONFIG_RTE_LIBRTE_XEN_DOM0=n
> > > > # Compile architecture we compile for. test application
> > > > CONFIG_RTE_APP_TEST=y CONFIG_RTE_APP_TEST_RESOURCE_TAR=n
> > > > # Compile architecture we compile for. PMD test application
> > > > CONFIG_RTE_TEST_PMD=y
> > > CONFIG_RTE_TEST_PMD_RECORD_CORE_CYCLES=n
> > > > CONFIG_RTE_TEST_PMD_RECORD_BURST_STATS=n
> > > > # Compile architecture we compile for. crypto performance
> > > > application CONFIG_RTE_APP_CRYPTO_PERF=y # Compile architecture
> we
> > compile for.
> > > > eventdev application CONFIG_RTE_APP_EVENTDEV=y
> > > > CONFIG_RTE_EXEC_ENV_LINUXAPP=y CONFIG_RTE_ARCH_PPC_64=y
> > > > CONFIG_RTE_ARCH_64=y CONFIG_RTE_TOOLCHAIN_GCC=y # Note:
> Power
> > > doesn't
> > > > have this support # Note: Initially, all of architecture we
> > > compile for.
> > > > PMD drivers compilation are turned off on Power # Will turn on
> > > > them only
> > > after
> > > > architecture we compile for. successful testing on Power
> > > >
> > > > Please refer here for more information on running DPDK
> > > > multi-process
> > > > examples:
> > > >
> > > > https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2
> > > > Fu
> > > > rl
> > > > defense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttp-
> > > 3A__dpdk.org_doc_guides_s
> > > >
> > >
> >
> &data=02%7C01%7Cxuemingl%40mellanox.com%7C9cd11fda7a7f48df7cbd08d
> > > 4f9b4
> > > >
> > >
> >
> 86d8%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C6364080011387
> > > 51301&s
> > > >
> > data=4n76ha0PmSr3wP2c0MAo3PEVYRMKjJVcU9o5xETqhBc%3D&reserved=0
> > > > ample-5Fapp-5Fug_multi-5Fprocess.html&d=DwIFAg&c=jf_iaSHvJObTbx-
> > > siA1Z
> > > >
> > >
> >
> Og&r=4TYe4NpqlgVi0ArYpZ76FrWp7IEw8gfzq7k4itCX_Mg&m=lz_1z0LzwjqjIwu
> > > > uryoN7QPg9N-6aTY_jEvDZtMZR0o&s=gupwe5WWQ-
> > > ap2jObFko6UJymrcy4jTmF
> > > > 2r1dZ2fQN9E&e=
> > > >
> > > > Best Regards,
> > > > Xueming
> > >


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 0/2] ethdev new offloads API
  @ 2017-09-13  6:37  4% ` Shahaf Shuler
  2017-09-13  9:10  0%   ` Andrew Rybchenko
  2017-09-17  6:54  4%   ` [dpdk-dev] [PATCH v4 0/3] " Shahaf Shuler
  0 siblings, 2 replies; 200+ results
From: Shahaf Shuler @ 2017-09-13  6:37 UTC (permalink / raw)
  To: thomas; +Cc: dev

Tx offloads configuration is per queue. Tx offloads are enabled by default, 
and can be disabled using ETH_TXQ_FLAGS_NO* flags. 
This behaviour is not consistent with the Rx side where the Rx offloads
configuration is per port. Rx offloads are disabled by default and enabled 
according to bit field in rte_eth_rxmode structure.

Moreover, considering more Tx and Rx offloads will be added 
over time, the cost of managing them all inside the PMD will be tremendous,
as the PMD will need to check the matching for the entire offload set 
for each mbuf it handles.
In addition, on the current approach each Rx offload added breaks the
ABI compatibility as it requires to add entries to existing bit-fields.
 
The series address above issues by defining a new offloads API.
With the new API, Tx and Rx offloads configuration is per queue.
The offloads are disabled by default. Each offload can be enabled or
disabled using the existing DEV_TX_OFFLOADS_* or DEV_RX_OFFLOADS_* flags.
Such API will enable to easily add or remove offloads, without breaking the
ABI compatibility.

The new API does not have an equivalent for the below Tx flags:

* ETH_TXQ_FLAGS_NOREFCOUNT
* ETH_TXQ_FLAGS_NOMULTMEMP

The reason is that those flags are not to manage offloads, rather some
guarantee from application on the way it uses mbufs, therefore could not be
present as part of DEV_TX_OFFLOADS_*.
Such flags are useful only for benchmarks, and therefore provide a non-realistic    
performance for DPDK customers using simple benchmarks for evaluation.
Leveraging the work being done in this series to clean up those flags.

In order to provide a smooth transition between the APIs the following actions
were taken:
*  The old offloads API is kept for the meanwhile.
*  New capabilities were added for PMD to advertize it has moved to the new
   offloads API.
*  Helper function which copy from old to new API were added to ethdev,
   enabling the PMD to support only one of the APIs.

Per discussion made on the RFC of this series [1], the integration plan which was
decided is to do the transition in two phases:
* ethdev API will move on 17.11.
* Apps and examples will move on 18.02.

This to enable PMD maintainers sufficient time to adopt the new API.

[1]
http://dpdk.org/ml/archives/dev/2017-August/072643.html

on v3:
 - Introduce the DEV_TX_OFFLOAD_MBUF_FAST_FREE to act as an equivalent
   for the no refcnt and single mempool flags.
 - Fix features documentation.
 - Fix commnet style.

on v2:
 - Taking new approach of dividing offloads into per-queue and per-port one.
 - Postpone the Tx/Rx public struct renaming to 18.02
 - squash the helper functions into the Rx/Tx offloads intro patches.

Shahaf Shuler (2):
  ethdev: introduce Rx queue offloads API
  ethdev: introduce Tx queue offloads API

 doc/guides/nics/features.rst  |  66 +++++++----
 lib/librte_ether/rte_ethdev.c | 220 ++++++++++++++++++++++++++++++++++---
 lib/librte_ether/rte_ethdev.h |  89 ++++++++++++++-
 3 files changed, 335 insertions(+), 40 deletions(-)

-- 
2.12.0

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3 1/4] ethdev: increase port_id range
  @ 2017-09-13  2:26  0%       ` Yang, Zhiyong
  2017-09-14 12:49  4%         ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Yang, Zhiyong @ 2017-09-13  2:26 UTC (permalink / raw)
  To: Yigit, Ferruh, dev, Doherty, Declan, Lu, Wenzhuo
  Cc: thomas, hemant.agrawal, Hunt, David, Richardson, Bruce, Ananyev,
	Konstantin

Hi Ferruh,

> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Monday, September 11, 2017 6:22 PM
> To: Yang, Zhiyong <zhiyong.yang@intel.com>; dev@dpdk.org; Doherty, Declan
> <declan.doherty@intel.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>
> Cc: thomas@monjalon.net; hemant.agrawal@nxp.com; Hunt, David
> <david.hunt@intel.com>
> Subject: Re: [PATCH v3 1/4] ethdev: increase port_id range
> 
> On 9/9/2017 3:47 PM, Zhiyong Yang wrote:
> > Extend port_id definition from uint8_t to uint16_t in lib and drivers
> > data structures, specifically rte_eth_dev_data.
> > Modify the APIs, drivers and app using port_id at the same time.
> >
> > Fix some checkpatch issues from the original code and remove some
> > unnecessary cast operations.
> >
> > Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
> 
> <...>
> 
> > @@ -283,7 +283,7 @@ enum dcb_mode_enable  #define
> > MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128
> > rx_queues/port */
> >
> >  struct queue_stats_mappings {
> > -	uint8_t port_id;
> > +	uint16_t port_id;
> 
> Can this be "portid_t port_id;" ? For testpmd, portid_t can be used for all port_id
> declarations.
> 

Ferruh, the suggestion has been discussed in the following thread. Most of people agree on
The basic type uint16_t. :).  Your suggestion was my preference  previously.
At last, I make this decision to use uint16_t.  You know, whatever I use, some ones will stand out and
Say the other is better.  :)
http://www.dpdk.org/dev/patchwork/patch/23208/

> <...>
> 
> > --- a/drivers/net/bnx2x/bnx2x.c
> > +++ b/drivers/net/bnx2x/bnx2x.c
> > @@ -703,7 +703,7 @@ bnx2x_gpio_mult_write(struct bnx2x_softc *sc,
> > uint8_t pins, uint32_t mode)
> >
> >  static int
> >  bnx2x_gpio_int_write(struct bnx2x_softc *sc, int gpio_num, uint32_t mode,
> > -		   uint8_t port)
> > +		      uint8_t port)
> 
> If port storage type will not change, no need to update this line. It is good to fix
> syntax the lines touched, but for the lines not updated please don't fix the syntax
> in this patch.

Ok
> 
> >  {
> >  	/* The GPIO should be swapped if swap register is set and active */
> >  	int gpio_port = ((REG_RD(sc, NIG_REG_PORT_SWAP) && @@ -749,7
> +749,7
> > @@ bnx2x_gpio_int_write(struct bnx2x_softc *sc, int gpio_num, uint32_t
> > mode,  }
> >
> >  uint32_t
> > -elink_cb_gpio_read(struct bnx2x_softc * sc, uint16_t gpio_num,
> > uint8_t port)
> > +elink_cb_gpio_read(struct bnx2x_softc *sc, uint16_t gpio_num, uint8_t
> > +port)
> 
> Same here.

Ok.

> 
> >  {
> >  	return bnx2x_gpio_read(sc, gpio_num, port);  } diff --git
> > a/drivers/net/bnx2x/bnx2x_rxtx.h b/drivers/net/bnx2x/bnx2x_rxtx.h
> > index 2e38ec26a..48d540476 100644
> > --- a/drivers/net/bnx2x/bnx2x_rxtx.h
> > +++ b/drivers/net/bnx2x/bnx2x_rxtx.h
> > @@ -41,7 +41,7 @@ struct bnx2x_rx_queue {
> >  	uint16_t                   rx_cq_head;           /**< Index of current rcq bd. */
> >  	uint16_t                   rx_cq_tail;           /**< Index of last rcq bd. */
> >  	uint16_t                   queue_id;             /**< RX queue index. */
> > -	uint8_t                    port_id;              /**< Device port identifier. */
> > +	uint16_t                   port_id;	/**< Device port identifier. */
> 
> Please fix comment allignment.
> 

Ok.

> >  	struct bnx2x_softc           *sc;                  /**< Ptr to dev_private data. */
> >  };
> 
> <...>
> 
> > @@ -500,7 +501,7 @@ elink_status_t elink_phy_probe(struct elink_params
> > *params);
> >
> >  /* Checks if fan failure detection is required on one of the phys on
> > board */  uint8_t elink_fan_failure_det_req(struct bnx2x_softc *sc, uint32_t
> shmem_base,
> > -			     uint32_t shmem2_base, uint8_t port);
> > +				  uint32_t shmem2_base, uint8_t port);
> 
> no change, please drop.
> 

Ok

> <...>
> 
> > @@ -511,7 +511,6 @@ mux_machine(struct bond_dev_private *internals,
> uint8_t slave_id)
> >  		ACTOR_STATE_CLR(port, SYNCHRONIZATION);
> >  		MODE4_DEBUG("Out of sync -> ATTACHED\n");
> >  	}
> > -
> 
> Please drop this one.

Ok
> 
> <...>
> > @@ -1022,12 +1022,12 @@ bond_mode_8023ad_activate_slave(struct
> > rte_eth_dev *bond_dev, uint8_t slave_id)
> >
> >  int
> >  bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *bond_dev,
> > -		uint8_t slave_id)
> > +				   uint16_t slave_id)
> 
> The coding style for multiple lines in a function call is two tabs or alternatively
> allign to the paranthesis. Original code synyax looks good here, no need to
> update.
> 

Ok

> <...>
> 
> > @@ -1536,17 +1536,12 @@ rte_eth_bond_8023ad_setup_v1708(uint8_t
> port_id,
> >  	return 0;
> >  }
> >  BIND_DEFAULT_SYMBOL(rte_eth_bond_8023ad_setup, _v1708, 17.08);
> > -MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id,
> > +MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint16_t port_id,
> 
> Hmm, this is tricky!
> The macro MAP_STATIC_SYMBOL is used for ABI versioning, but changing the
> port_id storage type breaks the ABI already. ABI versioning can be removed
> completely. Cc'ed Declan.
> 
Do you mean that I should remove 
> > -MAP_STATIC_SYMBOL(int rte_eth_bond_8023ad_setup(uint8_t port_id, ?

> Which also reminds me that bonding LIBABIVER needs to be updated. This is also
> required for all i40e, ixgbe and bnxt. Please let me know if you need help here.
> 
Yes. I'm not clear about it. Need help Ferruh.

> <...>
> 
> > @@ -1622,12 +1618,13 @@ rte_eth_bond_8023ad_ext_collect(uint8_t
> port_id, uint8_t slave_id, int enabled)
> >  		ACTOR_STATE_SET(port, COLLECTING);
> >  	else
> >  		ACTOR_STATE_CLR(port, COLLECTING);
> > -
> > +	printf("enabled  port->actor_state = %d \r\n",  port->actor_state);
> 
> Is this a git rebase error ?
> 

My bad.  Remove it.
 
> <...>
> 
> > @@ -586,13 +588,14 @@ rte_eth_bond_active_slaves_get(uint8_t
> bonded_port_id, uint8_t slaves[],
> >  	if (internals->active_slave_count > len)
> >  		return -1;
> >
> > -	memcpy(slaves, internals->active_slaves, internals->active_slave_count);
> > +	memcpy(slaves, internals->active_slaves,
> > +	internals->active_slave_count *
> > +sizeof(internals->active_slaves[0]));
> 
> Good catch!
> I wonder if there are more like this, did you traced all memcpy, memset, etc..  ?
> 

The code caused failures when I test bonding driver in test code. and I will fix them if I trace. 

> <...>
> 
> > --- a/drivers/net/ixgbe/rte_pmd_ixgbe.c
> > +++ b/drivers/net/ixgbe/rte_pmd_ixgbe.c
> > @@ -38,7 +38,7 @@
> >  #include "rte_pmd_ixgbe.h"
> >
> >  int
> > -rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
> > +rte_pmd_ixgbe_set_vf_mac_addr(uint16_t port, uint16_t vf,
> >  			      struct ether_addr *mac_addr)
> 
> ixgbe LIBABIVER also needs to be updated.
> 
> I have just recognized that release notes missing this library, I will add.
> 
thanks
> <...>
> 
> > --- a/drivers/net/vmxnet3/vmxnet3_ring.h
> > +++ b/drivers/net/vmxnet3/vmxnet3_ring.h
> > @@ -143,8 +143,8 @@ typedef struct vmxnet3_tx_queue {
> >  	struct vmxnet3_txq_stats     stats;
> >  	const struct rte_memzone     *mz;
> >  	bool                         stopped;
> > -	uint16_t                     queue_id;      /**< Device TX queue index. */
> > -	uint8_t                      port_id;       /**< Device port identifier. */
> > +	uint16_t                     queue_id; /**< Device TX queue index. */
> 
> No need to change "queue_id" here, if this is for comment allignment, please
> allign the port_id one.
> 

Ok.

> > +	uint16_t                     port_id;  /**< Device port identifier. */
> >  	uint16_t		     txdata_desc_size;
> >  } vmxnet3_tx_queue_t;
> >
> > @@ -178,8 +178,8 @@ typedef struct vmxnet3_rx_queue {
> >  	struct vmxnet3_rxq_stats    stats;
> >  	const struct rte_memzone    *mz;
> >  	bool                        stopped;
> > -	uint16_t                    queue_id;      /**< Device RX queue index. */
> > -	uint8_t                     port_id;       /**< Device port identifier. */
> > +	uint16_t                    queue_id; /**< Device RX queue index. */
> 
> same as above.
> 
Ok.

> <...>
> 
> > @@ -94,8 +94,7 @@ rte_port_ethdev_reader_create(void *params, int
> > socket_id)  static int  rte_port_ethdev_reader_rx(void *port, struct
> > rte_mbuf **pkts, uint32_t n_pkts)  {
> > -	struct rte_port_ethdev_reader *p =
> > -		port;
> > +	struct rte_port_ethdev_reader *p = port;
> 
> This is a good syntax correction, but this patch is already big, please drop these
> ones.

 Ok. I should focus on port id range increase .  :)

> 
> >  	uint16_t rx_pkt_cnt;
> >
> >  	rx_pkt_cnt = rte_eth_rx_burst(p->port_id, p->queue_id, pkts,
> > n_pkts); @@ -119,8 +118,7 @@ rte_port_ethdev_reader_free(void *port)
> > static int rte_port_ethdev_reader_stats_read(void *port,
> >  		struct rte_port_in_stats *stats, int clear)  {
> > -	struct rte_port_ethdev_reader *p =
> > -			port;
> > +	struct rte_port_ethdev_reader *p = port;
> 
> same as above, and there are few more below.
> 
Ok
> <...>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] multi-process shared memory on PPC
  @ 2017-09-12 18:11  0%     ` Xueming(Steven) Li
  2017-09-13  8:56  0%       ` Xueming(Steven) Li
  0 siblings, 1 reply; 200+ results
From: Xueming(Steven) Li @ 2017-09-12 18:11 UTC (permalink / raw)
  To: Xueming(Steven) Li, Chao Zhu; +Cc: dev

It works for me after setting nr_overcommit_hugepages correctly, thanks again.

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Xueming(Steven) Li
> Sent: Tuesday, September 12, 2017 4:13 PM
> To: Chao Zhu <chaozhu@linux.vnet.ibm.com>
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] multi-process shared memory on PPC
> 
> Great, that might be something missing, will update later. Thanks!
> 
> > -----Original Message-----
> > From: Chao Zhu [mailto:chaozhu@linux.vnet.ibm.com]
> > Sent: Tuesday, September 12, 2017 4:02 PM
> > To: Xueming(Steven) Li <xuemingl@mellanox.com>
> > Cc: dev@dpdk.org
> > Subject: RE: multi-process shared memory on PPC
> >
> > Xueming,
> >
> > I tried it on my local server, it works fine.
> > Did you set this value
> > "/sys/kernel/mm/hugepages/hugepages-
> 16384kB/nr_overcommit_hugepages" ?
> > It should be the same value as "
> > /sys/kernel/mm/hugepages/hugepages-16384kB/nr_hugepages" on ppc64le.
> >
> > > -----Original Message-----
> > > From: Xueming(Steven) Li [mailto:xuemingl@mellanox.com]
> > > Sent: 2017年8月31日 22:40
> > > To: Chao Zhu <chaozhu@linux.vnet.ibm.com>
> > > Cc: dev@dpdk.org
> > > Subject: multi-process shared memory on PPC
> > >
> > > Hi all,
> > >
> > > I'm testing multi-process example on PowerPC system, looks like
> > > shared memory not working properly.
> > > Below are the error and debug info of the first multi-process
> > > example 'simple_mp' (works as expected on X86):
> > >
> > > // Build DPDK, master branch
> > > # make T=ppc_64-power8-linuxapp-gcc -j160 -C
> > > examples/multi_process/simple_mp/ #
> > > examples/multi_process/simple_mp/build/simple_mp  -w 0:0.0
> > > --proc-type=primary -l 1-2 --socket-mem
> > > 256,256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,256,256
> > > APP: Finished Process Init.
> > > Starting core 2
> > > simple_mp >
> > >
> > > // Open another terminal and run secondary process # gdb --args
> > > examples/multi_process/simple_mp/build/simple_mp -n 4 -w 0:0.0
> > > --proc-type=secondary -l 3-4 --socket-mem
> > > 256,256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,256,256
> > > GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1 Copyright (C) 2016
> > > Free Software Foundation, Inc.
> > > License GPLv3+: GNU GPL version 3 or later
> > >
> > <https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fur
> > ldef
> > ense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttp-
> >
> 3A__gnu.org_licenses_gpl&data=02%7C01%7Cxuemingl%40mellanox.com%7C
> >
> 9cd11fda7a7f48df7cbd08d4f9b486d8%7Ca652971c7d2e4d9ba6a4d149256f461
> >
> b%7C0%7C0%7C636408001138751301&sdata=bb3hwYz7ehCqt4QA6GGqTDMY
> > kY1qAJV%2BCMDBVbXmWzE%3D&reserved=0.
> > h
> > > tml&d=DwIFAg&c=jf_iaSHvJObTbx-
> > siA1ZOg&r=4TYe4NpqlgVi0ArYpZ76FrWp7IE
> > > w8gfzq7k4itCX_Mg&m=lz_1z0LzwjqjIwuuryoN7QPg9N-
> 6aTY_jEvDZtMZR0o&s
> > > =SbDQBN7qJ9z8fWCSePyvm5FFncp2P_9XZm-qs1lH5PE&e= > This is free
> > > software: you are free to change and redistribute it.
> > > There is NO WARRANTY, to the extent permitted by law.  Type "show
> > copying"
> > > and "show warranty" for details.
> > > This GDB was configured as "powerpc64le-linux-gnu".
> > > Type "show configuration" for configuration details.
> > > For bug reporting instructions, please see:
> > > <https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2F
> > > ur
> > > ldefense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttp-
> > 3A__www.gnu.org_softwar&
> > >
> >
> data=02%7C01%7Cxuemingl%40mellanox.com%7C9cd11fda7a7f48df7cbd08d4f
> > 9b48
> > >
> >
> 6d8%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C63640800113875
> > 1301&sd
> > >
> >
> ata=4DNDTyIcHpTIU60K7FM%2F1zuASSB1IdZDRyOaiVp1Y%2BY%3D&reserved=
> > 0
> > > e_gdb_bugs_&d=DwIFAg&c=jf_iaSHvJObTbx-
> > siA1ZOg&r=4TYe4NpqlgVi0ArYpZ
> > > 76FrWp7IEw8gfzq7k4itCX_Mg&m=lz_1z0LzwjqjIwuuryoN7QPg9N-
> > 6aTY_jEvDZt
> > > MZR0o&s=GAFKK3jSahAPFXMGcPGbVNTl0CesJy_qfs5TxXfGOX0&e= >.
> > > Find the GDB manual and other documentation resources online at:
> > > <https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2F
> > > ur
> > > ldefense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttp-
> > 3A__www.gnu.org_softwar&
> > >
> >
> data=02%7C01%7Cxuemingl%40mellanox.com%7C9cd11fda7a7f48df7cbd08d4f
> > 9b48
> > >
> >
> 6d8%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C63640800113875
> > 1301&sd
> > >
> >
> ata=4DNDTyIcHpTIU60K7FM%2F1zuASSB1IdZDRyOaiVp1Y%2BY%3D&reserved=
> > 0
> > > e_gdb_documentation_&d=DwIFAg&c=jf_iaSHvJObTbx-
> > siA1ZOg&r=4TYe4Npql
> > >
> gVi0ArYpZ76FrWp7IEw8gfzq7k4itCX_Mg&m=lz_1z0LzwjqjIwuuryoN7QPg9N-
> > 6a
> > > TY_jEvDZtMZR0o&s=JdkMMjGGl-
> > 3Z3BGnjCkOFP5lI5BIbRNBxH4EVI70YFc&e= > .
> > > For help, type "help".
> > > Type "apropos word" to search for commands related to "word"...
> > > Reading symbols from
> > > examples/multi_process/simple_mp/build/simple_mp...done.
> > > (gdb) r
> > > Starting program:
> > > /home/xueming/mlnx-
> > dpdk.org/examples/multi_process/simple_mp/build/sim
> > > ple_mp -n 4 -w 0:0.0 --proc-type=secondary -l 3-4 --socket-mem
> > > 256,256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,256,256
> > > [Thread debugging using libthread_db enabled] Using host
> > > libthread_db
> > library
> > > "/lib/powerpc64le-linux-gnu/libthread_db.so.1".
> > > EAL: Detected 144 lcore(s)
> > > EAL: Probing VFIO support...
> > > [New Thread 0x7ffff7a6eff0 (LWP 58811)] [New Thread 0x7ffff726eff0
> > > (LWP 58812)]
> > >
> > > Thread 1 "simple_mp" received signal SIGSEGV, Segmentation fault.
> > > 0x00007ffff7d2f3ec in ?? () from
> > > /lib/powerpc64le-linux-gnu/libc.so.6
> > >  (gdb) bt full
> > > #0  0x00007ffff7d2f3ec in ?? () from
> > > /lib/powerpc64le-linux-gnu/libc.so.6
> > > No symbol table info available.
> > > #1  0x0000000010077d54 in rte_ring_lookup (name=0x102a4e28
> > > "PRI_2_SEC")
> > >     at /home/xueming/mlnx-dpdk.org/lib/librte_ring/rte_ring.c:326
> > >         te = 0x7ef3eefd5e00
> > >         r = 0x0
> > >         ring_list = 0x7ffff7aa250c
> > > #2  0x0000000010032640 in main (argc=10, argv=0x7ffffffff3e8)
> > >     at
> > > /home/xueming/mlnx-
> > dpdk.org/examples/multi_process/simple_mp/main.c:12
> > > 8
> > >         flags = 0
> > >         ring_size = 64
> > >         pool_size = 1024
> > >         pool_cache = 32
> > >         priv_data_sz = 0
> > >         ret = 9
> > >         lcore_id = 32767
> > >         cl = 0x7ffff7fef718 <_dl_argv>
> > > (gdb) f 1
> > > #1  0x0000000010077d54 in rte_ring_lookup (name=0x102a4e28
> > > "PRI_2_SEC")
> > >     at /home/xueming/mlnx-dpdk.org/lib/librte_ring/rte_ring.c:326
> > > 326                     if (strncmp(name, r->name,
> > > RTE_RING_NAMESIZE) == 0)
> > > (gdb) l
> > > 321
> > > 322             rte_rwlock_read_lock(RTE_EAL_TAILQ_RWLOCK);
> > > 323
> > > 324             TAILQ_FOREACH(te, ring_list, next) {
> > > 325                     r = (struct rte_ring *) te->data;
> > > 326                     if (strncmp(name, r->name,
> > > RTE_RING_NAMESIZE) == 0)
> > > 327                             break;
> > > 328             }
> > > 329
> > > 330             rte_rwlock_read_unlock(RTE_EAL_TAILQ_RWLOCK);
> > > (gdb) p *te
> > > $1 = {next = {tqe_next = 0x0, tqe_prev = 0x0}, data = 0x0}
> > > (gdb) p *ring_list
> > > $2 = {tqh_first = 0x7ef3eefd5e00, tqh_last = 0x7ef3eec6d100}
> > >
> > > # uname -a
> > > Linux dragon-power-01 4.13.0-rc2 #1 SMP Tue Aug 29 17:27:05 IDT 2017
> > > ppc64le ppc64le ppc64le GNU/Linux
> > >
> > > # cat /etc/issue
> > > Ubuntu 16.04.2 LTS \n \l
> > >
> > > # gcc --version
> > > gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 Copyright (C)
> > > 2015 Free Software Foundation, Inc.
> > > This is free software; see the source for copying conditions.  There
> > > is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
> > > PARTICULAR PURPOSE.
> > >
> > > # lscpu
> > > Architecture:          ppc64le
> > > Byte Order:            Little Endian
> > > CPU(s):                144
> > > On-line CPU(s) list:   0-87,96-103,112-159
> > > Thread(s) per core:    8
> > > Core(s) per socket:    4
> > > Socket(s):             4
> > > NUMA node(s):          4
> > > Model:                 2.1 (pvr 004b 0201)
> > > Model name:            POWER8E (raw), altivec supported
> > > CPU max MHz:           3690.0000
> > > CPU min MHz:           2061.0000
> > > L1d cache:             64K
> > > L1i cache:             32K
> > > L2 cache:              512K
> > > L3 cache:              8192K
> > > NUMA node0 CPU(s):     0-39
> > > NUMA node1 CPU(s):     40-79
> > > NUMA node16 CPU(s):    80-87,96-103,112-119
> > > NUMA node17 CPU(s):    120-159
> > >
> > > # cat build/.config
> > > # RTE_EXEC_ENV values are the directories in mk/exec-env/
> > > CONFIG_RTE_EXEC_ENV="linuxapp"
> > > # RTE_ARCH values are architecture we compile for. directories in
> > > mk/arch/ CONFIG_RTE_ARCH="ppc_64"
> > > # machine can define specific variables or action for a specific
> > > board # RTE_MACHINE values are architecture we compile for.
> > > directories in mk/machine/ CONFIG_RTE_MACHINE="power8"
> > > # The compiler we use.
> > > # RTE_TOOLCHAIN values are architecture we compile for. directories
> > > in mk/toolchain/ CONFIG_RTE_TOOLCHAIN="gcc"
> > > # Use intrinsics or assembly code for key routines
> > > CONFIG_RTE_FORCE_INTRINSICS=n # Machine forces strict alignment
> > > constraints.
> > > CONFIG_RTE_ARCH_STRICT_ALIGN=n
> > > # Compile to share library
> > > CONFIG_RTE_BUILD_SHARED_LIB=n
> > > # Use newest code breaking previous ABI CONFIG_RTE_NEXT_ABI=y #
> > > Major ABI to overwrite library specific LIBABIVER
> > > CONFIG_RTE_MAJOR_ABI= # Machine's cache line size
> > > CONFIG_RTE_CACHE_LINE_SIZE=128
> > > # Compile Environment Abstraction Layer CONFIG_RTE_LIBRTE_EAL=y
> > > CONFIG_RTE_MAX_LCORE=256
> > > CONFIG_RTE_MAX_NUMA_NODES=32
> > > CONFIG_RTE_MAX_MEMSEG=256
> > > CONFIG_RTE_MAX_MEMZONE=2560
> > > CONFIG_RTE_MAX_TAILQ=32
> > > CONFIG_RTE_LOG_LEVEL=RTE_LOG_INFO
> > > CONFIG_RTE_LOG_DP_LEVEL=RTE_LOG_INFO
> > > CONFIG_RTE_LOG_HISTORY=256
> > > CONFIG_RTE_BACKTRACE=y
> > > CONFIG_RTE_LIBEAL_USE_HPET=n
> > > CONFIG_RTE_EAL_ALLOW_INV_SOCKET_ID=n
> > > CONFIG_RTE_EAL_ALWAYS_PANIC_ON_ERROR=n
> > > CONFIG_RTE_EAL_IGB_UIO=y
> > > CONFIG_RTE_EAL_VFIO=y
> > > CONFIG_RTE_MALLOC_DEBUG=n
> > > CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=y
> > > # Recognize/ignore architecture we compile for. AVX/AVX512 CPU flags
> > > for performance/power testing.
> > > # AVX512 is marked as experimental for now, will enable it after
> > > enough #
> > field
> > > test and possible optimization.
> > > CONFIG_RTE_ENABLE_AVX=y
> > > CONFIG_RTE_ENABLE_AVX512=n
> > > # Default driver path (or "" to disable) CONFIG_RTE_EAL_PMD_PATH=""
> > > # Compile Environment Abstraction Layer to support Vmware TSC map
> > > CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=n
> > > # Compile architecture we compile for. argument parser library
> > > CONFIG_RTE_LIBRTE_KVARGS=y # Compile generic ethernet library
> > > CONFIG_RTE_LIBRTE_ETHER=y CONFIG_RTE_LIBRTE_ETHDEV_DEBUG=n
> > > CONFIG_RTE_MAX_ETHPORTS=32
> > > CONFIG_RTE_MAX_QUEUES_PER_PORT=1024
> > > CONFIG_RTE_LIBRTE_IEEE1588=n
> > > CONFIG_RTE_ETHDEV_QUEUE_STAT_CNTRS=16
> > > CONFIG_RTE_ETHDEV_RXTX_CALLBACKS=y
> > > # Turn off Tx preparation stage
> > > # Warning: rte_eth_tx_prepare() can be safely disabled only if using
> > > a #
> > driver
> > > which do not implement any Tx preparation.
> > > CONFIG_RTE_ETHDEV_TX_PREPARE_NOOP=n
> > > # Compile burst-oriented Amazon ENA PMD driver
> > > CONFIG_RTE_LIBRTE_ENA_PMD=y
> CONFIG_RTE_LIBRTE_ENA_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_ENA_DEBUG_TX=n
> > CONFIG_RTE_LIBRTE_ENA_DEBUG_TX_FREE=n
> > > CONFIG_RTE_LIBRTE_ENA_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_ENA_COM_DEBUG=n
> > > # Compile burst-oriented IGB & EM PMD drivers
> > > CONFIG_RTE_LIBRTE_EM_PMD=y CONFIG_RTE_LIBRTE_IGB_PMD=y
> > > CONFIG_RTE_LIBRTE_E1000_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_E1000_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_E1000_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_E1000_DEBUG_TX_FREE=n
> > > CONFIG_RTE_LIBRTE_E1000_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_E1000_PF_DISABLE_STRIP_CRC=n
> > > # Compile burst-oriented IXGBE PMD driver
> > > CONFIG_RTE_LIBRTE_IXGBE_PMD=n
> > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_TX_FREE=n
> > > CONFIG_RTE_LIBRTE_IXGBE_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC=n
> > > CONFIG_RTE_IXGBE_INC_VECTOR=y
> > > CONFIG_RTE_LIBRTE_IXGBE_BYPASS=n
> > > # Compile burst-oriented I40E PMD driver
> > > CONFIG_RTE_LIBRTE_I40E_PMD=y
> CONFIG_RTE_LIBRTE_I40E_DEBUG_RX=n
> > CONFIG_RTE_LIBRTE_I40E_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_I40E_DEBUG_TX_FREE=n
> > > CONFIG_RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC=y
> > > CONFIG_RTE_LIBRTE_I40E_INC_VECTOR=y
> > > CONFIG_RTE_LIBRTE_I40E_16BYTE_RX_DESC=n
> > > CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_PF=64
> > > CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_VF=4
> > > CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM=4
> > > # interval up to 8160 us, aligned to 2 (or default value)
> > > CONFIG_RTE_LIBRTE_I40E_ITR_INTERVAL=-1
> > > # Compile burst-oriented FM10K PMD
> > > CONFIG_RTE_LIBRTE_FM10K_PMD=n
> > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_TX_FREE=n
> > > CONFIG_RTE_LIBRTE_FM10K_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE=y
> > > CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR=y
> > > # Compile burst-oriented Mellanox ConnectX-3 (MLX4) PMD
> > > CONFIG_RTE_LIBRTE_MLX4_PMD=n CONFIG_RTE_LIBRTE_MLX4_DEBUG=n
> > > CONFIG_RTE_LIBRTE_MLX4_DEBUG_BROKEN_VERBS=n
> > > CONFIG_RTE_LIBRTE_MLX4_SGE_WR_N=4
> > > CONFIG_RTE_LIBRTE_MLX4_MAX_INLINE=0
> > > CONFIG_RTE_LIBRTE_MLX4_TX_MP_CACHE=8
> > > CONFIG_RTE_LIBRTE_MLX4_SOFT_COUNTERS=1
> > > # Compile burst-oriented Mellanox ConnectX-4 & ConnectX-5 (MLX5) PMD
> > > CONFIG_RTE_LIBRTE_MLX5_PMD=y CONFIG_RTE_LIBRTE_MLX5_DEBUG=n
> > > CONFIG_RTE_LIBRTE_MLX5_TX_MP_CACHE=8
> > > # Compile burst-oriented Broadcom PMD driver
> > > CONFIG_RTE_LIBRTE_BNX2X_PMD=n
> CONFIG_RTE_LIBRTE_BNX2X_DEBUG=n
> > > CONFIG_RTE_LIBRTE_BNX2X_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_BNX2X_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_BNX2X_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_BNX2X_MF_SUPPORT=n
> > > CONFIG_RTE_LIBRTE_BNX2X_DEBUG_PERIODIC=n
> > > # Compile burst-oriented Chelsio Terminator (CXGBE) PMD
> > > CONFIG_RTE_LIBRTE_CXGBE_PMD=y
> > CONFIG_RTE_LIBRTE_CXGBE_DEBUG=n
> > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG_REG=n
> > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG_MBOX=n
> > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_CXGBE_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_CXGBE_TPUT=y
> > > # Compile burst-oriented Cisco ENIC PMD driver
> > > CONFIG_RTE_LIBRTE_ENIC_PMD=n CONFIG_RTE_LIBRTE_ENIC_DEBUG=n
> > > CONFIG_RTE_LIBRTE_ENIC_DEBUG_FLOW=n
> > > # Compile burst-oriented Netronome NFP PMD driver
> > > CONFIG_RTE_LIBRTE_NFP_PMD=y CONFIG_RTE_LIBRTE_NFP_DEBUG=n #
> > Compile
> > > burst-oriented Broadcom BNXT PMD driver
> > CONFIG_RTE_LIBRTE_BNXT_PMD=y #
> > > Compile burst-oriented Solarflare libefx-based PMD
> > > CONFIG_RTE_LIBRTE_SFC_EFX_PMD=n
> > CONFIG_RTE_LIBRTE_SFC_EFX_DEBUG=n #
> > > Compile software PMD backed by
> > > SZEDATA2 device CONFIG_RTE_LIBRTE_PMD_SZEDATA2=n # Defines
> > firmware
> > > type address space.
> > > # See documentation for supported values.
> > > # Other values raise compile time error.
> > > CONFIG_RTE_LIBRTE_PMD_SZEDATA2_AS=0
> > > # Compile burst-oriented Cavium Thunderx NICVF PMD driver
> > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_PMD=y
> > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_MBOX=n
> > > # Compile burst-oriented Cavium LiquidIO PMD driver
> > > CONFIG_RTE_LIBRTE_LIO_PMD=y
> > CONFIG_RTE_LIBRTE_LIO_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_LIO_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_LIO_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_LIO_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_LIO_DEBUG_MBOX=n
> > > CONFIG_RTE_LIBRTE_LIO_DEBUG_REGS=n
> > > # Compile NXP DPAA2 FSL-MC Bus
> > > CONFIG_RTE_LIBRTE_FSLMC_BUS=n
> > > # Compile Support Libraries for NXP DPAA2
> > > CONFIG_RTE_LIBRTE_DPAA2_MEMPOOL=n
> > > CONFIG_RTE_LIBRTE_DPAA2_USE_PHYS_IOVA=y
> > > # Compile burst-oriented NXP DPAA2 PMD driver
> > > CONFIG_RTE_LIBRTE_DPAA2_PMD=n
> > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_DPAA2_DEBUG_TX_FREE=n
> > > # Compile burst-oriented VIRTIO PMD driver
> > > CONFIG_RTE_LIBRTE_VIRTIO_PMD=y
> > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_DUMP=n
> > > # Compile virtio device emulation inside virtio PMD driver
> > > CONFIG_RTE_VIRTIO_USER=y # Compile burst-oriented VMXNET3 PMD
> > driver
> > > CONFIG_RTE_LIBRTE_VMXNET3_PMD=n
> > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_TX_FREE=n
> > > CONFIG_RTE_LIBRTE_VMXNET3_DEBUG_DRIVER=n
> > > # Compile example software rings based PMD
> > > CONFIG_RTE_LIBRTE_PMD_RING=y
> > > CONFIG_RTE_PMD_RING_MAX_RX_RINGS=16
> > > CONFIG_RTE_PMD_RING_MAX_TX_RINGS=16
> > > # Compile software PMD backed by PCAP files
> > > CONFIG_RTE_LIBRTE_PMD_PCAP=n # Compile link bonding PMD library
> > > CONFIG_RTE_LIBRTE_PMD_BOND=y
> > CONFIG_RTE_LIBRTE_BOND_DEBUG_ALB=n
> > > CONFIG_RTE_LIBRTE_BOND_DEBUG_ALB_L1=n
> > > # QLogic 10G/25G/40G/50G/100G PMD
> > > CONFIG_RTE_LIBRTE_QEDE_PMD=y
> > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_INFO=n
> > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_QEDE_DEBUG_RX=n
> > > #Provides abs path/name of architecture we compile for. firmware file.
> > > #Empty string denotes driver will use default firmware
> > > CONFIG_RTE_LIBRTE_QEDE_FW=""
> > > # Compile software PMD backed by AF_PACKET sockets (Linux only)
> > > CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y # Compile ARK PMD
> > > CONFIG_RTE_LIBRTE_ARK_PMD=y CONFIG_RTE_LIBRTE_ARK_PAD_TX=y
> > > CONFIG_RTE_LIBRTE_ARK_DEBUG_RX=n
> > CONFIG_RTE_LIBRTE_ARK_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_ARK_DEBUG_STATS=n
> > > CONFIG_RTE_LIBRTE_ARK_DEBUG_TRACE=n
> > > # Compile WRS accelerated virtual port (AVP) guest PMD driver
> > > CONFIG_RTE_LIBRTE_AVP_PMD=n
> CONFIG_RTE_LIBRTE_AVP_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_AVP_DEBUG_TX=n
> > CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y
> > > CONFIG_RTE_LIBRTE_AVP_DEBUG_BUFFERS=n
> > > # Compile architecture we compile for. TAP PMD # It is enabled by
> > > default
> > for
> > > Linux only.
> > > CONFIG_RTE_LIBRTE_PMD_TAP=y
> > > # Compile Xen PMD
> > > CONFIG_RTE_LIBRTE_PMD_XENVIRT=n
> > > # Compile null PMD
> > > CONFIG_RTE_LIBRTE_PMD_NULL=y
> > > # Compile fail-safe PMD
> > > CONFIG_RTE_LIBRTE_PMD_FAILSAFE=y
> > > # Do prefetch of packet data within PMD driver receive function
> > > CONFIG_RTE_PMD_PACKET_PREFETCH=y # Compile generic crypto device
> > > library CONFIG_RTE_LIBRTE_CRYPTODEV=y
> > > CONFIG_RTE_LIBRTE_CRYPTODEV_DEBUG=n
> > > CONFIG_RTE_CRYPTO_MAX_DEVS=64
> > > CONFIG_RTE_CRYPTODEV_NAME_LEN=64
> > > # Compile PMD for ARMv8 Crypto device
> > > CONFIG_RTE_LIBRTE_PMD_ARMV8_CRYPTO=n
> > > CONFIG_RTE_LIBRTE_PMD_ARMV8_CRYPTO_DEBUG=n
> > > # Compile NXP DPAA2 crypto sec driver for CAAM HW
> > > CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC=n
> > > CONFIG_RTE_LIBRTE_DPAA2_SEC_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_DPAA2_SEC_DEBUG_DRIVER=n
> > > CONFIG_RTE_LIBRTE_DPAA2_SEC_DEBUG_RX=n
> > > # Compile PMD for QuickAssist based devices
> > > CONFIG_RTE_LIBRTE_PMD_QAT=n
> > CONFIG_RTE_LIBRTE_PMD_QAT_DEBUG_INIT=n
> > > CONFIG_RTE_LIBRTE_PMD_QAT_DEBUG_TX=n
> > > CONFIG_RTE_LIBRTE_PMD_QAT_DEBUG_RX=n
> > > CONFIG_RTE_LIBRTE_PMD_QAT_DEBUG_DRIVER=n
> > > # Number of sessions to create in architecture we compile for.
> > > session
> > memory
> > > pool # on a single QuickAssist device.
> > > CONFIG_RTE_QAT_PMD_MAX_NB_SESSIONS=2048
> > > # Compile PMD for AESNI backed device
> > > CONFIG_RTE_LIBRTE_PMD_AESNI_MB=n
> > > CONFIG_RTE_LIBRTE_PMD_AESNI_MB_DEBUG=n
> > > # Compile PMD for Software backed device
> > > CONFIG_RTE_LIBRTE_PMD_OPENSSL=n
> > CONFIG_RTE_LIBRTE_PMD_OPENSSL_DEBUG=n
> > > # Compile PMD for AESNI GCM device
> > > CONFIG_RTE_LIBRTE_PMD_AESNI_GCM=n
> > > CONFIG_RTE_LIBRTE_PMD_AESNI_GCM_DEBUG=n
> > > # Compile PMD for SNOW 3G device
> > > CONFIG_RTE_LIBRTE_PMD_SNOW3G=n
> > > CONFIG_RTE_LIBRTE_PMD_SNOW3G_DEBUG=n
> > > # Compile PMD for KASUMI device
> > > CONFIG_RTE_LIBRTE_PMD_KASUMI=n
> > > CONFIG_RTE_LIBRTE_PMD_KASUMI_DEBUG=n
> > > # Compile PMD for ZUC device
> > > CONFIG_RTE_LIBRTE_PMD_ZUC=n
> > > CONFIG_RTE_LIBRTE_PMD_ZUC_DEBUG=n
> > > # Compile PMD for Crypto Scheduler device
> > > CONFIG_RTE_LIBRTE_PMD_CRYPTO_SCHEDULER=y
> > > CONFIG_RTE_LIBRTE_PMD_CRYPTO_SCHEDULER_DEBUG=n
> > > # Compile PMD for NULL Crypto device
> > > CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO=y
> > > # Compile generic event device library CONFIG_RTE_LIBRTE_EVENTDEV=y
> > > CONFIG_RTE_LIBRTE_EVENTDEV_DEBUG=n
> > > CONFIG_RTE_EVENT_MAX_DEVS=16
> > > CONFIG_RTE_EVENT_MAX_QUEUES_PER_DEV=64
> > > # Compile PMD for skeleton event device
> > > CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV=y
> > > CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV_DEBUG=n
> > > # Compile PMD for software event device
> > > CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV=y
> > > CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV_DEBUG=n
> > > # Compile PMD for octeontx sso event device
> > > CONFIG_RTE_LIBRTE_PMD_OCTEONTX_SSOVF=y
> > > CONFIG_RTE_LIBRTE_PMD_OCTEONTX_SSOVF_DEBUG=n
> > > # Compile librte_ring
> > > CONFIG_RTE_LIBRTE_RING=y
> > > # Compile librte_mempool
> > > CONFIG_RTE_LIBRTE_MEMPOOL=y
> > > CONFIG_RTE_MEMPOOL_CACHE_MAX_SIZE=512
> > > CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG=n
> > > # Compile Mempool drivers
> > > CONFIG_RTE_DRIVER_MEMPOOL_RING=y
> > > CONFIG_RTE_DRIVER_MEMPOOL_STACK=y
> > > # Compile librte_mbuf
> > > CONFIG_RTE_LIBRTE_MBUF=y
> > > CONFIG_RTE_LIBRTE_MBUF_DEBUG=n
> > > CONFIG_RTE_MBUF_DEFAULT_MEMPOOL_OPS="ring_mp_mc"
> > > CONFIG_RTE_MBUF_REFCNT_ATOMIC=y
> > > CONFIG_RTE_PKTMBUF_HEADROOM=128
> > > # Compile librte_timer
> > > CONFIG_RTE_LIBRTE_TIMER=y
> > > CONFIG_RTE_LIBRTE_TIMER_DEBUG=n
> > > # Compile librte_cfgfile
> > > CONFIG_RTE_LIBRTE_CFGFILE=y
> > > # Compile librte_cmdline
> > > CONFIG_RTE_LIBRTE_CMDLINE=y
> > > CONFIG_RTE_LIBRTE_CMDLINE_DEBUG=n
> > > # Compile librte_hash
> > > CONFIG_RTE_LIBRTE_HASH=y
> > > CONFIG_RTE_LIBRTE_HASH_DEBUG=n
> > > # Compile librte_efd
> > > CONFIG_RTE_LIBRTE_EFD=y
> > > # Compile librte_jobstats
> > > CONFIG_RTE_LIBRTE_JOBSTATS=y
> > > # Compile architecture we compile for. device metrics library
> > > CONFIG_RTE_LIBRTE_METRICS=y # Compile architecture we compile for.
> > > bitrate statistics library CONFIG_RTE_LIBRTE_BITRATE=y # Compile
> > > architecture we compile for. latency statistics library
> > > CONFIG_RTE_LIBRTE_LATENCY_STATS=y # Compile librte_lpm
> > > CONFIG_RTE_LIBRTE_LPM=y CONFIG_RTE_LIBRTE_LPM_DEBUG=n #
> > Compile
> > > librte_acl CONFIG_RTE_LIBRTE_ACL=y
> CONFIG_RTE_LIBRTE_ACL_DEBUG=n
> > #
> > > Compile librte_power CONFIG_RTE_LIBRTE_POWER=y
> > > CONFIG_RTE_LIBRTE_POWER_DEBUG=n
> > > CONFIG_RTE_MAX_LCORE_FREQS=64
> > > # Compile librte_net
> > > CONFIG_RTE_LIBRTE_NET=y
> > > # Compile librte_ip_frag
> > > CONFIG_RTE_LIBRTE_IP_FRAG=y
> > > CONFIG_RTE_LIBRTE_IP_FRAG_DEBUG=n
> > > CONFIG_RTE_LIBRTE_IP_FRAG_MAX_FRAG=4
> > > CONFIG_RTE_LIBRTE_IP_FRAG_TBL_STAT=n
> > > # Compile GRO library
> > > CONFIG_RTE_LIBRTE_GRO=y
> > > # Compile librte_meter
> > > CONFIG_RTE_LIBRTE_METER=y
> > > # Compile librte_sched
> > > CONFIG_RTE_LIBRTE_SCHED=y
> > > CONFIG_RTE_SCHED_DEBUG=n
> > > CONFIG_RTE_SCHED_RED=n
> > > CONFIG_RTE_SCHED_COLLECT_STATS=n
> > > CONFIG_RTE_SCHED_SUBPORT_TC_OV=n
> > > CONFIG_RTE_SCHED_PORT_N_GRINDERS=8
> > > CONFIG_RTE_SCHED_VECTOR=n
> > > # Compile architecture we compile for. distributor library
> > > CONFIG_RTE_LIBRTE_DISTRIBUTOR=y # Compile architecture we compile
> for.
> > > reorder library CONFIG_RTE_LIBRTE_REORDER=y # Compile librte_port
> > > CONFIG_RTE_LIBRTE_PORT=y CONFIG_RTE_PORT_STATS_COLLECT=n
> > > CONFIG_RTE_PORT_PCAP=n # Compile librte_table
> > > CONFIG_RTE_LIBRTE_TABLE=y CONFIG_RTE_TABLE_STATS_COLLECT=n #
> > Compile
> > > librte_pipeline CONFIG_RTE_LIBRTE_PIPELINE=y
> > > CONFIG_RTE_PIPELINE_STATS_COLLECT=n
> > > # Compile librte_kni
> > > CONFIG_RTE_LIBRTE_KNI=y
> > > CONFIG_RTE_LIBRTE_PMD_KNI=y
> > > CONFIG_RTE_KNI_KMOD=y
> > > CONFIG_RTE_KNI_KMOD_ETHTOOL=n
> > > CONFIG_RTE_KNI_PREEMPT_DEFAULT=y
> > > # Compile architecture we compile for. pdump library
> > > CONFIG_RTE_LIBRTE_PDUMP=y # Compile vhost user library
> > > CONFIG_RTE_LIBRTE_VHOST=y CONFIG_RTE_LIBRTE_VHOST_NUMA=y
> > > CONFIG_RTE_LIBRTE_VHOST_DEBUG=n # Compile vhost PMD # To compile,
> > > CONFIG_RTE_LIBRTE_VHOST should be enabled.
> > > CONFIG_RTE_LIBRTE_PMD_VHOST=y
> > > #Compile Xen domain0 support
> > > CONFIG_RTE_LIBRTE_XEN_DOM0=n
> > > # Compile architecture we compile for. test application
> > > CONFIG_RTE_APP_TEST=y CONFIG_RTE_APP_TEST_RESOURCE_TAR=n
> > > # Compile architecture we compile for. PMD test application
> > > CONFIG_RTE_TEST_PMD=y
> > CONFIG_RTE_TEST_PMD_RECORD_CORE_CYCLES=n
> > > CONFIG_RTE_TEST_PMD_RECORD_BURST_STATS=n
> > > # Compile architecture we compile for. crypto performance
> > > application CONFIG_RTE_APP_CRYPTO_PERF=y # Compile architecture we
> compile for.
> > > eventdev application CONFIG_RTE_APP_EVENTDEV=y
> > > CONFIG_RTE_EXEC_ENV_LINUXAPP=y CONFIG_RTE_ARCH_PPC_64=y
> > > CONFIG_RTE_ARCH_64=y CONFIG_RTE_TOOLCHAIN_GCC=y # Note: Power
> > doesn't
> > > have this support # Note: Initially, all of architecture we
> > compile for.
> > > PMD drivers compilation are turned off on Power # Will turn on them
> > > only
> > after
> > > architecture we compile for. successful testing on Power
> > >
> > > Please refer here for more information on running DPDK multi-process
> > > examples:
> > >
> > > https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fu
> > > rl
> > > defense.proofpoint.com%2Fv2%2Furl%3Fu%3Dhttp-
> > 3A__dpdk.org_doc_guides_s
> > >
> >
> &data=02%7C01%7Cxuemingl%40mellanox.com%7C9cd11fda7a7f48df7cbd08d
> > 4f9b4
> > >
> >
> 86d8%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C6364080011387
> > 51301&s
> > >
> data=4n76ha0PmSr3wP2c0MAo3PEVYRMKjJVcU9o5xETqhBc%3D&reserved=0
> > > ample-5Fapp-5Fug_multi-5Fprocess.html&d=DwIFAg&c=jf_iaSHvJObTbx-
> > siA1Z
> > >
> >
> Og&r=4TYe4NpqlgVi0ArYpZ76FrWp7IEw8gfzq7k4itCX_Mg&m=lz_1z0LzwjqjIwu
> > > uryoN7QPg9N-6aTY_jEvDZtMZR0o&s=gupwe5WWQ-
> > ap2jObFko6UJymrcy4jTmF
> > > 2r1dZ2fQN9E&e=
> > >
> > > Best Regards,
> > > Xueming
> >


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2 17/17] doc: add documentation on how to add new components to DPDK
    2017-09-12 10:38  3%   ` [dpdk-dev] [PATCH v2 16/17] build: add option to version libs using DPDK version Bruce Richardson
@ 2017-09-12 10:38  3%   ` Bruce Richardson
    2 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2017-09-12 10:38 UTC (permalink / raw)
  To: dev; +Cc: nhorman, luca.boccassi, harry.van.haaren, Bruce Richardson

Add to the contributors guide details on how to add libraries and drivers
and integrate them with the DPDK build system(s).

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Harry van Haaren <harry.van.haaren@intel.com>
---
 doc/guides/contributing/coding_style.rst | 214 +++++++++++++++++++++++++++++++
 1 file changed, 214 insertions(+)

diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index d8e4a0f9c..3c59cbca5 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -702,3 +702,217 @@ All Python code should work with Python 2.7+ and 3.2+ and be compliant with
 `PEP8 (Style Guide for Python Code) <https://www.python.org/dev/peps/pep-0008/>`_.
 
 The ``pep8`` tool can be used for testing compliance with the guidelines.
+
+Integrating with the Build System
+---------------------------------
+
+DPDK supports being built in two different ways:
+
+* using ``make`` - or more specifically "GNU make", i.e. ``gmake`` on FreeBSD
+* using the tools ``meson`` and ``ninja``
+
+Any new library or driver to be integrated into DPDK should support being
+built with both systems. While building using ``make`` is a legacy approach, and
+most build-system enhancements are being done using ``meson`` and ``ninja``
+there are no plans at this time to deprecate the legacy ``make`` build system.
+
+Therefore all new component additions should include both a ``Makefile`` and a
+``meson.build`` file, and should be added to the component lists in both the
+``Makefile`` and ``meson.build`` files in the relevant top-level directory:
+either ``lib`` directory or a ``driver`` subdirectory.
+
+Makefile Contents
+~~~~~~~~~~~~~~~~~
+
+The ``Makefile`` for the component should be of the following format, where
+``<name>`` corresponds to the name of the library in question, e.g. hash,
+lpm, etc. For drivers, the same format of Makefile is used.
+
+.. code-block:: makefile
+
+	# pull in basic DPDK definitions, including whether library is to be
+	# built or not
+	include $(RTE_SDK)/mk/rte.vars.mk
+
+	# library name
+	LIB = librte_<name>.a
+
+	# any library cflags needed. Generally add "-O3 $(WERROR_FLAGS)"
+	CFLAGS += -O3
+	CFLAGS += $(WERROR_FLAGS)
+
+	# the symbol version information for the library, and .so version
+	EXPORT_MAP := rte_<name>_version.map
+	LIBABIVER := 1
+
+	# all source filenames are stored in SRCS-y
+	SRCS-$(CONFIG_RTE_LIBRTE_<NAME>) += rte_<name>.c
+
+	# install includes
+	SYMLINK-$(CONFIG_RTE_LIBRTE_<NAME>)-include += rte_<name>.h
+
+	# pull in rules to build the library
+	include $(RTE_SDK)/mk/rte.lib.mk
+
+Meson Build File Contents - Libraries
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``meson.build`` file for a new DPDK library should be of the following basic
+format.
+
+.. code-block:: python
+
+	sources = files('file1.c', ...)
+	headers = files('file1.c', ...)
+
+
+The will build based on a number of conventions and assumptions within the DPDK
+itself, for example, that the library name is the same as the directory name in
+which the files are stored.
+
+For a library ``meson.build`` file, there are number of variables which can be
+set, some mandatory, others optional. The mandatory fields are:
+
+sources
+	**Default Value = []**.
+	This variable should list out the files to be compiled up to create the
+	library. Files must be specified using the meson ``files()`` function.
+
+
+The optional fields are:
+
+build
+	**Default Value = true.**
+	Used to optionally compile a library, based on its dependencies or
+	environment. A simple example of use would be:
+
+.. code-block:: python
+
+	if host_machine.system() != 'linux'
+	        build = false
+	endif
+
+
+cflags
+	**Default Value = []**.
+	Used to specify any additional cflags that need to be passed to compile
+	the sources in the library.
+
+deps
+	**Default Value = ['eal']**.
+	Used to list the internal library dependencies of the library. It should
+	be assigned to using ``+=`` rather than overwriting using ``=``.  The
+	dependencies should be specified as strings, each one giving the name of
+	a DPDK library, without the ``librte_`` prefix. Dependencies are handled
+	recursively, so specifying e.g. ``mempool``, will automatically also
+	make the library depend upon the mempool library's dependencies too -
+	``ring`` and ``eal``. For libraries that only depend upon EAL, this
+	variable may be omitted from the ``meson.build`` file.  For example:
+
+.. code-block:: python
+
+	deps += ['ethdev']
+
+
+ext_deps
+	**Default Value = []**.
+	Used to specify external dependencies of this library. They should be
+	returned as dependency objects, as returned from the meson
+	``dependency()`` or ``find_library()`` functions. Before returning
+	these, they should be checked to ensure the dependencies have been
+	found, and, if not, the ``build`` variable should be set to ``false``.
+	For example:
+
+.. code-block:: python
+
+	my_dep = dependency('libX', required: 'false')
+	if my_dep.found()
+		ext_deps += my_dep
+	else
+		build = false
+	endif
+
+
+headers
+	**Default Value = []**.
+	Used to return the list of header files for the library that should be
+	installed to $PREFIX/include when ``ninja install`` is run. As with
+	source files, these should be specified using the meson ``files()``
+	function.
+
+name
+	**Default Value = library name derived from the directory name**.
+	If a library's .so or .a file differs from that given in the directory
+	name, the name should be specified using this variable. In practice,
+	since the convention is that for a library called ``librte_xyz.so``, the
+	sources are stored in a directory ``lib/librte_xyz``, this value should
+	never be needed for new libraries.
+
+.. note::
+
+	The name value also provides the name used to find the function version
+	map file, as part of the build process, so if the directory name and
+	library names differ, the ``version.map`` file should be named
+	consistently with the library, not the directory
+
+objs
+	**Default Value = []**.
+	This variable can be used to pass to the library build some pre-built
+	objects that were compiled up as part of another target given in the
+	included library ``meson.build`` file.
+
+version
+	**Default Value = 1**.
+	Specifies the ABI version of the library, and is used as the major
+	version number of the resulting ``.so`` library.
+
+Meson Build File Contents - Drivers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For drivers, the values are largely the same as for libraries. The variables
+supported are:
+
+build
+	As above.
+
+cflags
+	As above.
+
+deps
+	As above.
+
+ext_deps
+	As above.
+
+includes
+	**Default Value = <driver directory>** Some drivers include a base
+	directory for additional source files and headers, so we have this
+	variable to allow the headers from that base directory to be found when
+	compiling driver sources. Should be appended to using ``+=`` rather than
+	overwritten using ``=``.  The values appended should be meson include
+	objects got using the ``include_directories()`` function. For example:
+
+.. code-block:: python
+
+	includes += include_directories('base')
+
+name
+	As above, though note that each driver class can define it's own naming
+	scheme for the resulting ``.so`` files.
+
+objs
+	As above, generally used for the contents of the ``base`` directory.
+
+pkgconfig_extra_libs
+	**Default Value = []**
+	This variable is used to pass additional library link flags through to
+	the DPDK pkgconfig file generated, for example, to track any additional
+	libraries that may need to be linked into the build - especially when
+	using static libraries. Anything added here will be appended to the end
+	of the ``pkgconfig --libs`` output.
+
+sources [mandatory]
+	As above
+
+version
+	As above
-- 
2.13.5

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2 16/17] build: add option to version libs using DPDK version
  @ 2017-09-12 10:38  3%   ` Bruce Richardson
  2017-09-13 11:32  5%     ` Luca Boccassi
  2017-09-12 10:38  3%   ` [dpdk-dev] [PATCH v2 17/17] doc: add documentation on how to add new components to DPDK Bruce Richardson
    2 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2017-09-12 10:38 UTC (permalink / raw)
  To: dev; +Cc: nhorman, luca.boccassi, harry.van.haaren, Bruce Richardson

Normally, each library has it's own version number based on the ABI.
Add an option to have all libs just use the DPDK version number as the
.so version.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Harry van Haaren <harry.van.haaren@intel.com>
---
 drivers/meson.build | 8 +++++++-
 lib/meson.build     | 8 +++++++-
 meson_options.txt   | 1 +
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/meson.build b/drivers/meson.build
index f19da16fb..0c251bd61 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -92,6 +92,12 @@ foreach class:driver_classes
 						depends: [pmdinfogen, tmp_lib])
 			endforeach
 
+			if get_option('per_library_versions')
+				so_version = '@0@.1'.format(version)
+			else
+				so_version = meson.project_version()
+			endif
+
 			# now build the driver itself, and add to the drivers list
 			lib_name = driver_name_fmt.format(name)
 			version_map = '@0@/@1@/@2@_version.map'.format(
@@ -105,7 +111,7 @@ foreach class:driver_classes
 				c_args: cflags,
 				link_args: '-Wl,--version-script=' + version_map,
 				link_depends: version_map,
-				version: '@0@.1'.format(version),
+				version: so_version,
 				install: true,
 				install_dir: driver_install_path)
 
diff --git a/lib/meson.build b/lib/meson.build
index d814721de..36652cfe1 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -76,6 +76,12 @@ foreach l:libraries
 			dep_objs += [get_variable('dep_rte_' + d)]
 		endforeach
 
+		if get_option('per_library_versions')
+			so_version = '@0@.1'.format(version)
+		else
+			so_version = meson.project_version()
+		endif
+
 		version_map = '@0@/@1@/rte_@2@_version.map'.format(
 				meson.current_source_dir(), dir_name, name)
 		libname = 'rte_' + name
@@ -87,7 +93,7 @@ foreach l:libraries
 				include_directories: include_directories(dir_name),
 				link_args: '-Wl,--version-script=' + version_map,
 				link_depends: version_map,
-				version: '@0@.1'.format(version),
+				version: so_version,
 				install: true)
 		dep = declare_dependency(link_with: lib,
 				include_directories: include_directories(dir_name),
diff --git a/meson_options.txt b/meson_options.txt
index 9c45b8159..636226ce8 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -6,3 +6,4 @@ option('allow_invalid_socket_id', type: 'boolean', value: false,
 	description: 'allow out-of-range NUMA socket id\'s for platforms that don\'t report the value correctly')
 option('enable_kmods', type: 'boolean', value: true, description: 'build kernel modules')
 option('kernel_dir', type: 'string', value: '', description: 'path to the kernel for building kernel modules')
+option('per_library_versions', type: 'boolean', value: true, description: 'true: each lib gets its own version number, false: DPDK version used for each lib')
-- 
2.13.5

^ permalink raw reply	[relevance 3%]

Results 10201-10400 of ~18000   |  | reverse | sort options + mbox downloads above
-- links below jump to the message on this page --
2016-11-16 16:23     [dpdk-dev] [PATCH 00/22] Generic flow API (rte_flow) Adrien Mazarguil
2016-12-16 16:24     ` [dpdk-dev] [PATCH v2 00/25] " Adrien Mazarguil
2016-12-16 16:24       ` [dpdk-dev] [PATCH v2 01/25] ethdev: introduce generic flow API Adrien Mazarguil
2017-10-23  8:53  0%     ` Zhao1, Wei
2017-05-15 19:57     [dpdk-dev] [PATCH] test/crypto: remove crypto perf tests Pablo de Lara
2017-10-04  6:48  1% ` [dpdk-dev] [PATCH v2] " Pablo de Lara
2017-08-10 13:29     [dpdk-dev] [PATCH v4 1/2] ethdev: add return code to rte_eth_stats_reset() David Harton
2017-09-01  2:26     ` [dpdk-dev] [PATCH v5] " David Harton
2017-09-19 17:14  0%   ` Ferruh Yigit
2017-09-20 14:01  0%     ` David Harton (dharton)
2017-09-20 16:55  0%       ` Ferruh Yigit
2017-09-20 14:11  3%   ` [dpdk-dev] [PATCH v6] " David C Harton
2017-08-12 10:22     [dpdk-dev] [PATCH] eal: bus scan and probe never fail Shreyansh Jain
2017-10-05 23:21     ` Thomas Monjalon
2017-10-06 13:12       ` Shreyansh Jain
2017-10-06 13:37         ` Thomas Monjalon
2017-10-06 17:34           ` Jan Blunck
2017-10-09 11:10             ` Shreyansh Jain
2017-10-09 18:21               ` Don Provan
2017-10-10  5:00                 ` Shreyansh Jain
2017-10-10 16:00  3%               ` Aaron Conole
2017-10-11 22:34  0%                 ` Thomas Monjalon
2017-10-12 13:08  0%                   ` Aaron Conole
2017-10-12  5:39  0%                 ` Shreyansh Jain
2017-10-12 13:20  0%                   ` Aaron Conole
2017-08-14 15:15     [dpdk-dev] [PATCH v1 0/4] make dpdk iova aware Santosh Shukla
2017-08-14 15:15     ` [dpdk-dev] [PATCH v1 4/4] doc: remove dpdk iova aware notice Santosh Shukla
2017-09-18 18:44  0%   ` Mcnamara, John
2017-09-05 10:31     ` [dpdk-dev] [PATCH v2 0/5] make dpdk iova aware Santosh Shukla
2017-09-05 10:31       ` [dpdk-dev] [PATCH v2 5/5] doc: remove dpdk iova aware notice Santosh Shukla
2017-09-19 13:38  0%     ` Mcnamara, John
2017-10-20 12:31       ` [dpdk-dev] [PATCH v3 0/6] make dpdk iova aware Santosh Shukla
2017-10-20 12:31         ` [dpdk-dev] [PATCH v3 4/6] eal/memory: rename memory API to iova types Santosh Shukla
2017-11-03 11:11  4%       ` Thomas Monjalon
2017-10-20 12:31 15%     ` [dpdk-dev] [PATCH v3 5/6] doc: remove dpdk iova aware notice Santosh Shukla
2017-10-23 20:29  0%       ` Thomas Monjalon
2017-10-24  5:06  0%         ` santosh
2017-10-25  9:45  0%           ` Thomas Monjalon
2017-10-25  9:50  3%             ` Richardson, Bruce
2017-10-25 10:01  3%               ` Thomas Monjalon
2017-10-25 10:05  4%                 ` Bruce Richardson
2017-10-25 10:12  0%                   ` Thomas Monjalon
2017-10-25 10:32  0%                     ` Bruce Richardson
2017-08-17 16:11     [dpdk-dev] [RFC PATCH 0/1] eventtimer: introduce event timer wheel Jerin Jacob
2017-09-22 15:17     ` [dpdk-dev] [RFC PATCH v2 0/1] eventtimer: introduce event timer adapter Erik Gabriel Carrillo
2017-09-22 15:17  1%   ` [dpdk-dev] [RFC PATCH v2 1/1] " Erik Gabriel Carrillo
2017-08-22 16:24     [dpdk-dev] [PATCH v2] vhost: added user callbacks for socket open/close Dariusz Stojaczyk
2017-08-30 10:50     ` [dpdk-dev] [PATCH v3] rte_vhost: " Dariusz Stojaczyk
2017-10-10  3:14  0%   ` Yuanhan Liu
2017-08-25  9:04     [dpdk-dev] [PATCH 00/13] Move PCI away from the EAL Gaetan Rivet
2017-09-18  9:31     ` [dpdk-dev] [PATCH v2 00/14] " Gaetan Rivet
2017-09-18  9:31  4%   ` [dpdk-dev] [PATCH v2 14/14] doc: add notes on EAL PCI API update Gaetan Rivet
2017-09-25 15:23       ` [dpdk-dev] [PATCH v3 00/13] Move PCI away from the EAL Gaetan Rivet
2017-09-25 15:24  4%     ` [dpdk-dev] [PATCH v3 13/13] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-12  8:17         ` [dpdk-dev] [PATCH v4 00/16] Move PCI away from the EAL Gaetan Rivet
2017-10-12  8:17  4%       ` [dpdk-dev] [PATCH v4 16/16] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-12 10:45           ` [dpdk-dev] [PATCH v5 00/20] Move PCI away from the EAL Gaetan Rivet
2017-10-12 10:45  4%         ` [dpdk-dev] [PATCH v5 19/20] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-25 22:38             ` [dpdk-dev] [PATCH v7 00/25] Move PCI away from the EAL Gaetan Rivet
2017-10-25 22:38  4%           ` [dpdk-dev] [PATCH v7 24/25] doc: add notes on EAL PCI API update Gaetan Rivet
2017-10-26 10:05               ` [dpdk-dev] [PATCH v8 00/25] Move PCI away from the EAL Gaetan Rivet
2017-10-26 10:06  4%             ` [dpdk-dev] [PATCH v8 24/25] doc: add notes on EAL PCI API update Gaetan Rivet
2017-08-25  9:40     [dpdk-dev] [PATCH 00/12] support to run vdev in the secondary process Jianfeng Tan
2017-08-25  9:40     ` [dpdk-dev] [PATCH 04/12] vdev: move to drivers/bus Jianfeng Tan
2017-08-29 13:04       ` Gaëtan Rivet
2017-08-29 22:47         ` Tan, Jianfeng
2017-09-18 11:47  0%       ` De Lara Guarch, Pablo
2017-09-19  6:01  0%         ` Tan, Jianfeng
2017-09-28 13:55  2% ` [dpdk-dev] [PATCH v2 00/12] support to run vdev in the secondary process Jianfeng Tan
2017-09-28 13:55  2%   ` [dpdk-dev] [PATCH v2 03/12] cryptodev: avoid dependency on rte_vdev.h Jianfeng Tan
2017-10-05 13:13  0%     ` Jan Blunck
2017-10-09  1:04  0%       ` Tan, Jianfeng
2017-08-25 13:46     [dpdk-dev] [RFC] Wireless Base Band Device (bbdev) Amr Mokhtar
2017-09-21 14:56  3% ` Thomas Monjalon
2017-10-03 14:29  0%   ` Mokhtar, Amr
2017-10-03 15:17  4%     ` Thomas Monjalon
2017-10-04 17:11  0%       ` Flavio Leitner
2017-10-05 21:55  0%       ` Mokhtar, Amr
2017-10-05 22:22  0%         ` Thomas Monjalon
2017-10-06 23:27  0%           ` Mokhtar, Amr
2017-10-07 11:42  0%             ` Thomas Monjalon
2017-08-25 16:07     [dpdk-dev] [PATCH 0/6] devargs cleanup Gaetan Rivet
2017-10-12  8:21     ` [dpdk-dev] [PATCH v2 00/18] " Gaetan Rivet
2017-10-12  8:21 10%   ` [dpdk-dev] [PATCH v2 18/18] doc: remove devargs deprecation notices Gaetan Rivet
2017-10-17 18:18       ` [dpdk-dev] [PATCH v2 00/18] devargs cleanup Aaron Conole
2017-10-18  8:36  4%     ` Gaëtan Rivet
2017-08-25 20:26     [dpdk-dev] [PATCH v2 0/3] *** timer library enhancements *** Gabriel Carrillo
2017-09-13 22:05     ` [dpdk-dev] [PATCH v3 0/3] timer library enhancement Erik Gabriel Carrillo
2017-09-13 22:05  3%   ` [dpdk-dev] [PATCH v3 3/3] doc: update timer lib docs Erik Gabriel Carrillo
2017-09-19 17:02       ` [dpdk-dev] [PATCH v4 0/3] timer library enhancement Erik Gabriel Carrillo
2017-09-19 17:02  3%     ` [dpdk-dev] [PATCH v4 3/3] doc: update timer lib docs Erik Gabriel Carrillo
2017-08-26  0:06     [dpdk-dev] [PATCH 1/3] ethdev: add new eth_dev_ops function for mtr ops get Cristian Dumitrescu
2017-10-05 13:09     ` [dpdk-dev] [PATCH V2 0/5] rte_mtr: generic ethdev api for metering and policing Cristian Dumitrescu
2017-10-05 13:09  1%   ` [dpdk-dev] [PATCH V2 3/5] ethdev: add new api for traffic " Cristian Dumitrescu
2017-08-31 14:40     [dpdk-dev] multi-process shared memory on PPC Xueming(Steven) Li
2017-09-12  8:01     ` Chao Zhu
2017-09-12  8:12       ` Xueming(Steven) Li
2017-09-12 18:11  0%     ` Xueming(Steven) Li
2017-09-13  8:56  0%       ` Xueming(Steven) Li
2017-09-01  2:36     [dpdk-dev] [PATCH v4] ethdev: allow returning error on VLAN offload configuration David Harton
2017-10-25  3:01  4% ` [dpdk-dev] [PATCH v5] ethdev: allow returning error on VLAN offload ops Ferruh Yigit
2017-09-01 10:03     [dpdk-dev] [PATCH 00/17] build DPDK libs and some drivers with meson/ninja Bruce Richardson
2017-09-12 10:37     ` [dpdk-dev] [PATCH v2 " Bruce Richardson
2017-09-12 10:38  3%   ` [dpdk-dev] [PATCH v2 16/17] build: add option to version libs using DPDK version Bruce Richardson
2017-09-13 11:32  5%     ` Luca Boccassi
2017-09-13 13:11  0%       ` Bruce Richardson
2017-09-13 17:02  0%         ` Luca Boccassi
2017-09-12 10:38  3%   ` [dpdk-dev] [PATCH v2 17/17] doc: add documentation on how to add new components to DPDK Bruce Richardson
2017-09-13 14:12       ` [dpdk-dev] [PATCH v3 00/17] build DPDK libs and some drivers with meson/ninja Bruce Richardson
2017-09-13 14:12  1%     ` [dpdk-dev] [PATCH v3 04/17] build: add DPDK libraries to build Bruce Richardson
2017-09-13 14:12  3%     ` [dpdk-dev] [PATCH v3 16/17] build: add option to version libs using DPDK version Bruce Richardson
2017-09-13 14:12  3%     ` [dpdk-dev] [PATCH v3 17/17] doc: add documentation on how to add new components to DPDK Bruce Richardson
2017-09-01 15:02     [dpdk-dev] [PATCH v2 0/4] net/i40e: implement dynamic mapping of flow types to pctypes Kirill Rybalchenko
2017-09-20 14:32     ` [dpdk-dev] [PATCH v3 0/6] " Kirill Rybalchenko
2017-09-20 14:33  4%   ` [dpdk-dev] [PATCH v3 3/6] net/i40e: implement dynamic mapping of sw flow types to hw pctypes Kirill Rybalchenko
2017-09-25  9:44  0%     ` Xing, Beilei
2017-10-02 15:08       ` [dpdk-dev] [PATCH v4 0/5] net/i40e: implement dynamic mapping of flow types to pctypes Kirill Rybalchenko
2017-10-02 15:08  3%     ` [dpdk-dev] [PATCH v4 2/5] net/i40e: implement dynamic mapping of sw flow types to hw pctypes Kirill Rybalchenko
2017-10-04 12:52         ` [dpdk-dev] [PATCH v5 0/5] net/i40e: implement dynamic mapping of flow types to pctypes Kirill Rybalchenko
2017-10-04 12:52  3%       ` [dpdk-dev] [PATCH v5 2/5] net/i40e: implement dynamic mapping of sw flow types to hw pctypes Kirill Rybalchenko
2017-09-04  5:57     [dpdk-dev] [PATCH v2 0/4] increase port_id range Zhiyong Yang
2017-09-09 14:47     ` [dpdk-dev] [PATCH v3 " Zhiyong Yang
2017-09-09 14:47       ` [dpdk-dev] [PATCH v3 1/4] ethdev: " Zhiyong Yang
2017-09-11 10:21         ` Ferruh Yigit
2017-09-13  2:26  0%       ` Yang, Zhiyong
2017-09-14 12:49  4%         ` Ferruh Yigit
2017-09-15  5:11  0%           ` Yang, Zhiyong
2017-09-09 14:47       ` [dpdk-dev] [PATCH v3 3/4] examples: " Zhiyong Yang
2017-09-14 14:41  3%     ` Ferruh Yigit
2017-09-21  8:32  4%   ` [dpdk-dev] [PATCH v4 0/5] " Zhiyong Yang
2017-09-21  8:32  8%     ` [dpdk-dev] [PATCH v4 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
2017-09-21 10:36  4%       ` Ferruh Yigit
2017-09-22  2:02  4%         ` Yang, Zhiyong
2017-09-21  8:32  1%     ` [dpdk-dev] [PATCH v4 2/5] ethdev: increase port_id range Zhiyong Yang
2017-09-25  3:22  4%     ` [dpdk-dev] [PATCH v5 0/5] " Zhiyong Yang
2017-09-25  3:22  7%       ` [dpdk-dev] [PATCH v5 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
2017-09-25 11:34  4%         ` Ferruh Yigit
2017-09-25  3:22  1%       ` [dpdk-dev] [PATCH v5 2/5] ethdev: increase port_id range Zhiyong Yang
2017-09-29  7:17  4%       ` [dpdk-dev] [PATCH v6 0/5] " Zhiyong Yang
2017-09-29  7:17  7%         ` [dpdk-dev] [PATCH v6 1/5] net/bonding: remove bonding APIs using ABI versioning Zhiyong Yang
2017-09-29  7:17  1%         ` [dpdk-dev] [PATCH v6 2/5] ethdev: increase port_id range Zhiyong Yang
2017-10-06  2:15  0%         ` [dpdk-dev] [PATCH v6 0/5] " Ferruh Yigit
2017-10-06 13:31  0%           ` Gaëtan Rivet
2017-10-06 14:29  0%           ` Thomas Monjalon
2017-10-06 16:02  0%           ` Thomas Monjalon
2017-10-11 21:21  0%           ` Ferruh Yigit
2017-10-12  1:33  0%             ` Yang, Zhiyong
2017-09-08 15:36     [dpdk-dev] [PATCH v3 0/4] eventdev: add attribute based get APIs Harry van Haaren
2017-09-14 16:08  4% ` [dpdk-dev] [PATCH v4 " Harry van Haaren
2017-09-14 16:09  3%   ` [dpdk-dev] [PATCH v4 4/4] eventdev: add device started attribute Harry van Haaren
2017-09-15  6:14  0%   ` [dpdk-dev] [PATCH v4 0/4] eventdev: add attribute based get APIs Nipun Gupta
2017-09-15 12:33  0%   ` Jerin Jacob
2017-09-20 13:35  4%   ` [dpdk-dev] [PATCH v5 0/5] Harry van Haaren
2017-09-20 13:36  3%     ` [dpdk-dev] [PATCH v5 4/5] eventdev: add device started attribute Harry van Haaren
2017-09-20 13:36  4%     ` [dpdk-dev] [PATCH v5 5/5] eventdev: bump library version Harry van Haaren
2017-09-10 12:07     [dpdk-dev] [PATCH v2 0/2] ethdev new offloads API Shahaf Shuler
2017-09-13  6:37  4% ` [dpdk-dev] [PATCH v3 " Shahaf Shuler
2017-09-13  9:10  0%   ` Andrew Rybchenko
2017-09-17  6:54  4%   ` [dpdk-dev] [PATCH v4 0/3] " Shahaf Shuler
2017-09-18  7:51  0%     ` Andrew Rybchenko
2017-09-28 18:54  4%     ` [dpdk-dev] [PATCH v5 " Shahaf Shuler
2017-10-04  8:17  4%       ` [dpdk-dev] [PATCH v6 0/4] " Shahaf Shuler
2017-10-04 16:12  0%         ` Ananyev, Konstantin
2017-10-05  0:55  0%           ` Ferruh Yigit
2017-09-11  8:18     [dpdk-dev] [PATCH v2] devtools: rework abi checker script Olivier MATZ
2017-09-11  8:46     ` [dpdk-dev] [PATCH v3] " Olivier Matz
2017-09-13 15:00  9%   ` Neil Horman
2017-09-19  9:15  7%     ` Olivier MATZ
2017-09-20  9:12 27%   ` [dpdk-dev] [PATCH v4] " Olivier Matz
2017-09-21 15:40  7%     ` Neil Horman
2017-09-25  9:11  9%       ` Olivier MATZ
2017-09-25 11:21  4%         ` Neil Horman
2017-10-05  7:53 27%     ` [dpdk-dev] [PATCH v5] " Olivier Matz
2017-10-05 13:15  4%       ` Neil Horman
2017-09-11 13:39     [dpdk-dev] [PATCH] doc: announce ABI change for ring structure Olivier Matz
2017-09-18  9:16  4% ` Bruce Richardson
2017-09-18  9:24  4% ` Mcnamara, John
2017-09-18  9:30  4% ` Burakov, Anatoly
2017-09-11 13:44     [dpdk-dev] [PATCH] net/nfp: remove firmware ABI check Alejandro Lucero
2017-09-18 19:00  4% ` Ferruh Yigit
2017-09-12 15:06     [dpdk-dev] [PATCH 1/2] reorder: fix ready buffers not being nulled out Pavan Nikhilesh
2017-10-12  8:32  3% ` Bruce Richardson
2017-09-13 10:44     [dpdk-dev] [PATCH v2 1/4] lib/librte_power: add turbo boost API David Hunt
2017-10-03 14:08  3% ` [dpdk-dev] [PATCH v3 0/9] Policy Based Power Control for Guest David Hunt
2017-10-11 16:18  2% ` [dpdk-dev] [PATCH v9 " David Hunt
2017-10-12  0:23  0%   ` Ferruh Yigit
2017-09-14  2:40     [dpdk-dev] [PATCH v2 0/6] remove xen dom0 support in DPDK Jianfeng Tan
2017-09-14  2:40  3% ` [dpdk-dev] [PATCH v2 5/6] eal: remove API rte_mem_phy2mch Jianfeng Tan
2017-09-14  2:40  1% ` [dpdk-dev] [PATCH v2 6/6] eal: remove xen dom0 support Jianfeng Tan
2017-09-14  8:26     [dpdk-dev] [PATCH 00/11] introduce security offload library Akhil Goyal
2017-09-14  8:26     ` [dpdk-dev] [PATCH 05/11] lib/librte_mbuf: add security crypto flags and mbuf fields Akhil Goyal
2017-09-18  7:54       ` Boris Pismenny
2017-09-20  9:43  4%     ` Olivier MATZ
2017-09-14 14:55     [dpdk-dev] [PATCH] ethdev: fix LIBABIVER Ferruh Yigit
2017-09-27  2:06     ` Yang, Zhiyong
2017-10-04 21:54  3%   ` Thomas Monjalon
2017-09-15 13:41 21% [dpdk-dev] [PATCH] doc: add note on hardware support deprecation Bruce Richardson
2017-09-18 13:49  0% ` Mcnamara, John
2017-09-18 13:59 21% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
2017-10-13 20:46  0%   ` Thomas Monjalon
2017-09-22 10:47     [dpdk-dev] DPDK Community Survey 2017 Jain, Deepak K
2017-09-28 13:58  3% ` Kevin Traynor
2017-09-22 18:09  1% [dpdk-dev] [pull-request] next-net 17.11 PRE-RC1 Ferruh Yigit
2017-09-25 12:27     [dpdk-dev] [PATCH v2] Policy Based Power Control for Guest David Hunt
2017-10-04  9:15  2% ` [dpdk-dev] [PATCH v4] " David Hunt
2017-10-04 15:25  2%   ` [dpdk-dev] [PATCH v5 0/9] " David Hunt
2017-10-05 12:25  2%     ` [dpdk-dev] [PATCH v6 " David Hunt
2017-10-05 13:28  2%       ` [dpdk-dev] [PATCH v7 " David Hunt
2017-10-05 13:54  0%         ` Ananyev, Konstantin
2017-10-05 14:34  2%         ` [dpdk-dev] [PATCH v8 " David Hunt
2017-10-09 22:34  0%           ` Ferruh Yigit
2017-09-28  2:17     [dpdk-dev] [PATCH v4 0/8] GPT-C and GTP-U enabling Beilei Xing
2017-09-29  5:18     ` [dpdk-dev] [PATCH v6 " Beilei Xing
2017-09-29  5:18       ` [dpdk-dev] [PATCH v6 4/8] ethdev: add GTP items to support flow API Beilei Xing
2017-09-29  8:15         ` Sean Harte
2017-09-29  8:54           ` Xing, Beilei
2017-09-29  9:29             ` Sean Harte
2017-10-02 12:27               ` Adrien Mazarguil
2017-10-03  8:56                 ` Sean Harte
2017-10-05  8:06                   ` Wu, Jingjing
2017-10-05  8:30  3%                 ` Adrien Mazarguil
2017-10-05  8:39  0%                   ` Wu, Jingjing
2017-10-02 12:20     [dpdk-dev] [PATCH] lib/power: add turbo functions to version.map David Hunt
2017-10-02 14:55     ` Thomas Monjalon
2017-10-02 15:06       ` Hunt, David
2017-10-02 15:39         ` Thomas Monjalon
2017-10-02 16:25  3%       ` Hunt, David
2017-10-02 16:52  0%         ` Thomas Monjalon
2017-10-03 14:59     [dpdk-dev] [PATCH v5 0/3] run-time Linking support Xiaoyun Li
2017-10-04 22:58     ` [dpdk-dev] [PATCH v6 " Xiaoyun Li
2017-10-04 22:58       ` [dpdk-dev] [PATCH v6 1/3] eal/x86: run-time dispatch over memcpy Xiaoyun Li
2017-10-05  9:37         ` Ananyev, Konstantin
2017-10-05 11:19           ` Li, Xiaoyun
2017-10-05 11:26  3%         ` Richardson, Bruce
2017-10-05  9:49     [dpdk-dev] [PATCH v1 0/7] Flow API helpers enhancements Adrien Mazarguil
2017-10-05  9:49     ` [dpdk-dev] [PATCH v1 1/7] ethdev: expose flow API error helper Adrien Mazarguil
2017-10-11  9:23       ` Thomas Monjalon
2017-10-11 11:56  5%     ` Adrien Mazarguil
2017-10-11 19:05  5%       ` Aaron Conole
2017-10-12 13:37  4%         ` Neil Horman
2017-10-12 14:02  5%         ` Adrien Mazarguil
2017-10-05 13:09     [dpdk-dev] [PATCH V2 1/5] ethdev: add new flow action for metering and policing Cristian Dumitrescu
2017-10-06 14:45     ` [dpdk-dev] [PATCH V3 0/5] rte_mtr: generic ethdev api " Cristian Dumitrescu
2017-10-06 14:45  1%   ` [dpdk-dev] [PATCH V3 3/5] ethdev: add new api for traffic " Cristian Dumitrescu
2017-10-06 14:45     [dpdk-dev] [PATCH V3 1/5] ethdev: add new flow action for " Cristian Dumitrescu
2017-10-13 12:22     ` [dpdk-dev] [PATCH V4 0/5] rte_mtr: generic ethdev api " Cristian Dumitrescu
2017-10-13 12:22  1%   ` [dpdk-dev] [PATCH V4 3/5] ethdev: add new api for traffic " Cristian Dumitrescu
2017-10-06 16:21  9% [dpdk-dev] ABI/API stability in DPDK Mcnamara, John
2017-10-06 16:27  4% ` Ferruh Yigit
2017-10-06 17:15  4% ` Thomas Monjalon
2017-10-09  3:20     [dpdk-dev] [PATCH v3 0/5] move vdev into drivers/bus Jianfeng Tan
2017-10-13 11:51     ` [dpdk-dev] [PATCH v7 0/4] " Jianfeng Tan
2017-10-13 11:51  4%   ` [dpdk-dev] [PATCH v7 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
2017-10-23 10:06  3%     ` De Lara Guarch, Pablo
2017-10-25 17:10     ` [dpdk-dev] [PATCH v8 0/4] move vdev into drivers/bus Jianfeng Tan
2017-10-25 17:10  4%   ` [dpdk-dev] [PATCH v8 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
2017-10-25 17:10  1%   ` [dpdk-dev] [PATCH v8 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
2017-10-25 21:32  3%     ` De Lara Guarch, Pablo
2017-10-27  1:06     ` [dpdk-dev] [PATCH v0 0/4] move vdev into drivers/bus Jianfeng Tan
2017-10-27  1:06  4%   ` [dpdk-dev] [PATCH v9 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
2017-10-27  1:06  1%   ` [dpdk-dev] [PATCH v9 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
2017-10-27  3:23     ` [dpdk-dev] [PATCH v10 0/4] move vdev into drivers/bus Jianfeng Tan
2017-10-27  3:23  4%   ` [dpdk-dev] [PATCH v10 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
2017-10-27  3:23  1%   ` [dpdk-dev] [PATCH v10 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
2017-10-30  8:28     ` [dpdk-dev] [PATCH v11 0/4] move vdev into drivers/bus Jianfeng Tan
2017-10-30  8:28  4%   ` [dpdk-dev] [PATCH v11 1/4] cryptodev: remove crypto vdev init API Jianfeng Tan
2017-10-30  8:28  1%   ` [dpdk-dev] [PATCH v11 3/4] bus/vdev: move to vdev bus to drivers/bus Jianfeng Tan
2017-10-09 16:12     [dpdk-dev] [PATCH 1/2] ethdev: add return value to stats get dev op Matan Azrad
2017-10-09 16:12  4% ` [dpdk-dev] [PATCH 2/2] doc: update stats get API change Matan Azrad
2017-10-10 20:20  1% ` [dpdk-dev] [PATCH v2] ethdev: add return value to stats get dev op Matan Azrad
2017-10-10 14:15     [dpdk-dev] [PATCH] drivers: update DPAA2 libs ABIVER and build reproducibility Hemant Agrawal
2017-10-10 15:48  5% ` Thomas Monjalon
2017-10-11  9:36  3% [dpdk-dev] next techboard meeting (13th, October) Olivier MATZ
2017-10-11 12:41  0% ` Wiles, Keith
2017-10-11 12:48  0%   ` [dpdk-dev] [dpdk-techboard] " Thomas Monjalon
2017-10-11 12:53  0%     ` Wiles, Keith
2017-10-12  8:18  4% [dpdk-dev] [PATCH v1 0/8] Bus control framework Gaetan Rivet
2017-10-12  8:18  4% ` [dpdk-dev] [PATCH v1 2/8] bus: introduce opaque " Gaetan Rivet
2017-10-14  0:09  3% [dpdk-dev] [PATCH] doc: fix highlight of bumped libs in release notes Thomas Monjalon
2017-10-16  8:33  0% ` Yang, Zhiyong
2017-10-18 20:57  0% ` Ferruh Yigit
2017-10-23 10:13  0%   ` Thomas Monjalon
2017-10-23 10:15  3% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
2017-10-23 16:26  0%   ` Ferruh Yigit
2017-10-23 20:39  0%     ` Thomas Monjalon
2017-10-16 13:42     [dpdk-dev] [PATCH v1 1/2] mempool/octeontx: move mbox from event to mempool Santosh Shukla
2017-10-16 13:42  3% ` [dpdk-dev] [PATCH v1 2/2] event/octeontx: bump library version Santosh Shukla
2017-10-17  9:50  0%   ` Hemant Agrawal
2017-10-23 14:38  3%   ` Thomas Monjalon
2017-10-20 21:21     [dpdk-dev] [PATCH 0/3] Break dependency on bus infrastructure* Declan Doherty
2017-10-25 12:00     ` [dpdk-dev] [PATCH v2 0/3] Break cryptodev dependency on bus infrastructure Declan Doherty
2017-10-25 12:00  3%   ` [dpdk-dev] [PATCH v2 1/3] cryptodev: add new APIs to assist PMD initialisation Declan Doherty
2017-10-25 12:00  1%   ` [dpdk-dev] [PATCH v2 2/3] cryptodev: break dependency on virtual device bus Declan Doherty
2017-10-25 12:00  3%   ` [dpdk-dev] [PATCH v2 3/3] cryptodev: break dependency on PCI " Declan Doherty
2017-10-22 13:32     [dpdk-dev] [PATCH v9 0/4] flow classification library Bernard Iremonger
2017-10-23 15:16     ` [dpdk-dev] [PATCH v10 " Bernard Iremonger
2017-10-23 20:59       ` Thomas Monjalon
2017-10-24  8:40  3%     ` Iremonger, Bernard
2017-10-24  9:23  0%       ` Mcnamara, John
2017-10-24  9:38  0%         ` Thomas Monjalon
2017-10-24  9:53  0%           ` Iremonger, Bernard
2017-10-24 10:25  0%             ` Thomas Monjalon
2017-10-23  9:56 10% [dpdk-dev] [PATCH] eal: remove deprecated log functions Olivier Matz
2017-10-23 11:50  3% [dpdk-dev] DPDK techboard minutes of October 13 Olivier MATZ
2017-10-23 12:16  2% [dpdk-dev] [PATCH] mbuf: rename deprecated VLAN flags Olivier Matz
2017-10-25 15:12  2% ` [dpdk-dev] [PATCH v2] " Olivier Matz
2017-10-25 12:29  4% [dpdk-dev] [PATCH] eal: fix version map experimental export section Harry van Haaren
2017-10-30 11:06  3% [dpdk-dev] rte_security deprecation Thomas Monjalon
2017-10-30 11:30  0% ` Akhil Goyal
2017-10-30 12:27  8% [dpdk-dev] [PATCH] doc: update release notes for rte_security Akhil Goyal
2017-10-30 14:22  0% ` Thomas Monjalon
2017-11-01  6:20  0%   ` Akhil Goyal
2017-11-02 16:36  0%     ` Mcnamara, John
2017-11-02 14:31     [dpdk-dev] [PATCH ] examples/l3fwd: fix aliasing in port grouping Guduri Prathyusha
2017-11-02 14:46     ` Ananyev, Konstantin
2017-11-02 15:33       ` Guduri Prathyusha
2017-11-02 15:52         ` Ananyev, Konstantin
2017-11-03  3:21           ` Jianbo.Liu
2017-11-03  5:42  3%         ` Guduri Prathyusha
2017-11-03 11:24     [dpdk-dev] [PATCH] mem: remove old function from symbol list Thomas Monjalon
2017-11-03 11:34  3% ` Gonzalez Monroy, Sergio

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).