[dpdk-dev] [PATCH] net/bonding: fix slave tx burst for mode 4

2019-02-11 Thread wangyunjian
From: Yunjian Wang 

Now sending 0 packet it doesn't consider for LACPDUs,
but the LACPDUs should be checked and sended.

Fixes: 09150784a776 ("net/bonding: burst mode hash calculation")
Cc: sta...@dpdk.org

Reported-by: Hui Zhao 
Signed-off-by: Yunjian Wang 
---
 drivers/net/bonding/rte_eth_bond_pmd.c | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c 
b/drivers/net/bonding/rte_eth_bond_pmd.c
index 44deaf1..a77af19 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -1298,9 +1298,6 @@ struct bwg_slave {
 
uint16_t i;
 
-   if (unlikely(nb_bufs == 0))
-   return 0;
-
/* Copy slave list to protect against slave up/down changes during tx
 * bursting */
slave_count = internals->active_slave_count;
@@ -1310,6 +1307,9 @@ struct bwg_slave {
memcpy(slave_port_ids, internals->active_slaves,
sizeof(slave_port_ids[0]) * slave_count);
 
+   if (unlikely(nb_bufs == 0))
+   goto lacp_send;
+
dist_slave_count = 0;
for (i = 0; i < slave_count; i++) {
struct port *port = &bond_mode_8023ad_ports[slave_port_ids[i]];
@@ -1365,6 +1365,7 @@ struct bwg_slave {
}
}
 
+lacp_send:
/* Check for LACP control packets and send if available */
for (i = 0; i < slave_count; i++) {
struct port *port = &bond_mode_8023ad_ports[slave_port_ids[i]];
-- 
1.8.3.1




[dpdk-dev] [PATCH] compress/isal: add ISA-L lib version display

2019-02-11 Thread Tomasz Cel
Display information about ISA-L lib version in UTs.

Signed-off-by: Tomasz Cel 
---
 drivers/compress/isal/isal_compress_pmd.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/compress/isal/isal_compress_pmd.c 
b/drivers/compress/isal/isal_compress_pmd.c
index 4748238..8879a42 100644
--- a/drivers/compress/isal/isal_compress_pmd.c
+++ b/drivers/compress/isal/isal_compress_pmd.c
@@ -19,6 +19,12 @@
 #define CHKSUM_SZ_CRC 8
 #define CHKSUM_SZ_ADLER 4
 
+#define STRINGIFY(s) #s
+#define ISAL_TOSTRING(maj, min, patch) \
+   STRINGIFY(maj)"."STRINGIFY(min)"."STRINGIFY(patch)
+#define ISAL_VERSION_STRING \
+   ISAL_TOSTRING(ISAL_MAJOR_VERSION, ISAL_MINOR_VERSION, 
ISAL_PATCH_VERSION)
+
 int isal_logtype_driver;
 
 /* Verify and set private xform parameters */
@@ -684,6 +690,8 @@ compdev_isal_create(const char *name, struct 
rte_vdev_device *vdev,
dev->dequeue_burst = isal_comp_pmd_dequeue_burst;
dev->enqueue_burst = isal_comp_pmd_enqueue_burst;
 
+   ISAL_PMD_LOG(INFO, "\nISA-L library version used: "ISAL_VERSION_STRING);
+
return 0;
 }
 
-- 
2.7.4



Re: [dpdk-dev] [PATCH] compress/isal: add ISA-L lib version display

2019-02-11 Thread Daly, Lee
Hi Tomasz,
Looks good to me.
> -Original Message-
> From: Cel, TomaszX
> Sent: Monday, February 11, 2019 9:19 AM
> To: dev@dpdk.org
> Cc: sta...@dpdk.org; Trahe, Fiona ; Daly, Lee
> ; De Lara Guarch, Pablo
> ; Jozwiak, TomaszX
> ; Cel, TomaszX 
> Subject: [PATCH] compress/isal: add ISA-L lib version display
> 
> Display information about ISA-L lib version in UTs.
> 
> Signed-off-by: Tomasz Cel 
> ---
>  drivers/compress/isal/isal_compress_pmd.c | 8 
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/compress/isal/isal_compress_pmd.c
> b/drivers/compress/isal/isal_compress_pmd.c
> index 4748238..8879a42 100644
> --- a/drivers/compress/isal/isal_compress_pmd.c
> +++ b/drivers/compress/isal/isal_compress_pmd.c
<...>

> 2.7.4

Acked-by: Lee Daly 



Re: [dpdk-dev] [EXT] [PATCH v1] hash: optimize signature compare by using neon intrinsic

2019-02-11 Thread Ruifeng Wang (Arm Technology China)
Hi Jerin,

> -Original Message-
> From: Jerin Jacob Kollanukkaran 
> Sent: Monday, February 11, 2019 15:49
> To: Ruifeng Wang (Arm Technology China) ;
> yipeng1.w...@intel.com
> Cc: Honnappa Nagarahalli ; nd
> ; dev@dpdk.org
> Subject: Re: [EXT] [PATCH v1] hash: optimize signature compare by using
> neon intrinsic
> 
> On Mon, 2019-02-11 at 15:30 +0800, Ruifeng Wang wrote:
> >
> > ---
> > ---
> > Implemented signature compare function based on neon intrinsic.
> > Hash bulk lookup had 3% - 6% performance gain after optimization.
> >
> > Signed-off-by: Ruifeng Wang 
> > ---
> >  lib/librte_hash/rte_cuckoo_hash.c | 32
> > ++-
> >  lib/librte_hash/rte_cuckoo_hash.h |  1 +
> >  2 files changed, 32 insertions(+), 1 deletion(-)
> >
> > diff --git a/lib/librte_hash/rte_cuckoo_hash.c
> > b/lib/librte_hash/rte_cuckoo_hash.c
> > index c01489ba5..5745a254f 100644
> > --- a/lib/librte_hash/rte_cuckoo_hash.c
> > +++ b/lib/librte_hash/rte_cuckoo_hash.c
> > @@ -26,6 +26,9 @@
> >  #include 
> >  #include 
> >  #include 
> > +#if defined(RTE_ARCH_ARM64)
> > +#include 
> > +#endif
> 
> 
> The use of rte_vector.h will remove the need for #if defined...
> 

OK. Will change to rte_vect.h in next version.

> 
> >
> >  #include "rte_hash.h"
> >  #include "rte_cuckoo_hash.h"
> > @@ -407,6 +410,10 @@ rte_hash_create(const struct
> rte_hash_parameters
> > *params)
> > if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE2))
> > h->sig_cmp_fn = RTE_HASH_COMPARE_SSE;
> > else
> > +#elif defined(RTE_ARCH_ARM64)
> > +   if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON))
> > +   h->sig_cmp_fn = RTE_HASH_COMPARE_NEON;
> > +   else
> >  #endif
> > h->sig_cmp_fn = RTE_HASH_COMPARE_SCALAR;
> >
> > @@ -1578,10 +1585,15 @@ compare_signatures(uint32_t
> > *prim_hash_matches, uint32_t *sec_hash_matches,
> > enum rte_hash_sig_compare_function sig_cmp_fn)
> {
> > unsigned int i;
> > +#ifdef RTE_MACHINE_CPUFLAG_NEON
> > +   uint16x8_t vmat, vsig, x;
> > +   uint64x2_t x64;
> > +   int16x8_t shift = {-15, -13, -11, -9, -7, -5, -3, -1}; #endif
> 
> Is it possible move down the variable declaration? to avoid the need for
> #ifdef here
> 

Will move down the variable declaration into 'case' block.

> >
> > /* For match mask the first bit of every two bits indicates the
> > match */
> > switch (sig_cmp_fn) {
> > -#ifdef RTE_MACHINE_CPUFLAG_SSE2
> > +#if defined(RTE_MACHINE_CPUFLAG_SSE2)
> > case RTE_HASH_COMPARE_SSE:
> > /* Compare all signatures in the bucket */
> > *prim_hash_matches =
> _mm_movemask_epi8(_mm_cmpeq_epi16(
> > @@ -1594,6 +1606,24 @@ compare_signatures(uint32_t
> *prim_hash_matches,
> > uint32_t *sec_hash_matches,
> > (__m128i const *)sec_bkt-
> > >sig_current),
> > _mm_set1_epi16(sig)));
> > break;
> > +#elif defined(RTE_MACHINE_CPUFLAG_NEON)
> > +   case RTE_HASH_COMPARE_NEON:
> > +   vsig = vld1q_dup_u16((uint16_t const *)&sig);
> > +   /* Compare all signatures in the primary bucket */
> > +   vmat = vceqq_u16(vsig,
> > +   vld1q_u16((uint16_t const *)prim_bkt-
> > >sig_current));
> > +   x = vshlq_u16(vandq_u16(vmat, vdupq_n_u16(0x8000)),
> > shift);
> > +   x64 = vpaddlq_u32(vpaddlq_u16(x));
> > +   *prim_hash_matches = (uint32_t)(vgetq_lane_u64(x64, 0)
> > +
> > +   vgetq_lane_u64(x64, 1));
> > +   /* Compare all signatures in the secondary bucket */
> > +   vmat = vceqq_u16(vsig,
> > +   vld1q_u16((uint16_t const *)sec_bkt-
> > >sig_current));
> > +   x = vshlq_u16(vandq_u16(vmat, vdupq_n_u16(0x8000)),
> > shift);
> > +   x64 = vpaddlq_u32(vpaddlq_u16(x));
> > +   *sec_hash_matches = (uint32_t)(vgetq_lane_u64(x64, 0) +
> > +   vgetq_lane_u64(x64, 1));
> > +   break;
> >  #endif
> > default:
> > for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { diff --git
> > a/lib/librte_hash/rte_cuckoo_hash.h
> > b/lib/librte_hash/rte_cuckoo_hash.h
> > index eacdaa8d4..0548c97f0 100644
> > --- a/lib/librte_hash/rte_cuckoo_hash.h
> > +++ b/lib/librte_hash/rte_cuckoo_hash.h
> > @@ -141,6 +141,7 @@ struct rte_hash_key {  enum
> > rte_hash_sig_compare_function {
> > RTE_HASH_COMPARE_SCALAR = 0,
> > RTE_HASH_COMPARE_SSE,
> > +   RTE_HASH_COMPARE_NEON,
> > RTE_HASH_COMPARE_NUM
> >  };
> >


Re: [dpdk-dev] [PATCH] doc/qat: fix table of kernel drivers

2019-02-11 Thread Jozwiak, TomaszX



> -Original Message-
> From: Trahe, Fiona
> Sent: Thursday, February 7, 2019 7:46 PM
> To: dev@dpdk.org
> Cc: Trahe, Fiona ; Jozwiak, TomaszX
> ; Kusztal, ArkadiuszX
> ; akhil.go...@nxp.com; sta...@dpdk.org
> Subject: [PATCH] doc/qat: fix table of kernel drivers
> 
> Added missing line informing which kernel driver can be used for device
> DH895xcc for compression service.
> Moved service columns to start of table for better visibility and to prepare 
> for
> future asymmetric crypto service.
> 
> Fixes: e2e35849ea78 ("compress/qat: add compression on DH895x")
> Cc: sta...@dpdk.org
> 
> Signed-off-by: Fiona Trahe 
> ---
> 2.13.6


Acked-by: Tomasz Jozwiak 


Re: [dpdk-dev] [PATCH] app/testbbdev: fix sprintf with snprintf

2019-02-11 Thread Mokhtar, Amr


> -Original Message-
> From: Poornima, PallantlaX
> Sent: Monday 4 February 2019 07:16
> To: dev@dpdk.org
> Cc: Pattan, Reshma ; Mokhtar, Amr
> ; Poornima, PallantlaX
> ; sta...@dpdk.org
> Subject: [PATCH] app/testbbdev: fix sprintf with snprintf
> 
> sprintf function is not secure as it doesn't check the length of string.
> More secure function snprintf is used.
> 
> Fixes: f714a18885 ("app/testbbdev: add test application for bbdev")
> Cc: sta...@dpdk.org
> 
> Signed-off-by: Pallantla Poornima 
> ---

Acked-by: Amr Mokhtar 



Re: [dpdk-dev] [PATCH] net/bonding: fix slave tx burst for mode 4

2019-02-11 Thread Chas Williams

How strange. I was just looking at this issue this weekend. I think
we can just move the control packet handling before the data packet
handling. That avoids the goto and is a little more sensible -- we should
try to prioritize control traffic (even if we can't guarantee there will
be space it's better than nothing). Something like this:

diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c 
b/drivers/net/bonding/rte_eth_bond_pmd.c

index 44deaf119..89ad67266 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -1298,9 +1298,6 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct 
rte_mbuf **bufs,


uint16_t i;

-   if (unlikely(nb_bufs == 0))
-   return 0;
-
/* Copy slave list to protect against slave up/down changes during tx
 * bursting */
slave_count = internals->active_slave_count;
@@ -1310,6 +1307,30 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct 
rte_mbuf **bufs,

memcpy(slave_port_ids, internals->active_slaves,
sizeof(slave_port_ids[0]) * slave_count);

+   /* Check for LACP control packets and send if available */
+   for (i = 0; i < slave_count; i++) {
+   struct port *port = &bond_mode_8023ad_ports[slave_port_ids[i]];
+   struct rte_mbuf *ctrl_pkt = NULL;
+
+   if (likely(rte_ring_empty(port->tx_ring)))
+   continue;
+
+   if (rte_ring_dequeue(port->tx_ring,
+(void **)&ctrl_pkt) != -ENOENT) {
+   slave_tx_count = rte_eth_tx_burst(slave_port_ids[i],
+   bd_tx_q->queue_id, &ctrl_pkt, 1);
+   /*
+* re-enqueue LAG control plane packets to buffering
+* ring if transmission fails so the packet isn't lost.
+*/
+   if (slave_tx_count != 1)
+   rte_ring_enqueue(port->tx_ring,  ctrl_pkt);
+   }
+   }
+
+   if (unlikely(nb_bufs == 0))
+   return 0;
+
dist_slave_count = 0;
for (i = 0; i < slave_count; i++) {
struct port *port = &bond_mode_8023ad_ports[slave_port_ids[i]];
@@ -1365,27 +1386,6 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct 
rte_mbuf **bufs,

}
}

-   /* Check for LACP control packets and send if available */
-   for (i = 0; i < slave_count; i++) {
-   struct port *port = &bond_mode_8023ad_ports[slave_port_ids[i]];
-   struct rte_mbuf *ctrl_pkt = NULL;
-
-   if (likely(rte_ring_empty(port->tx_ring)))
-   continue;
-
-   if (rte_ring_dequeue(port->tx_ring,
-(void **)&ctrl_pkt) != -ENOENT) {
-   slave_tx_count = rte_eth_tx_burst(slave_port_ids[i],
-   bd_tx_q->queue_id, &ctrl_pkt, 1);
-   /*
-* re-enqueue LAG control plane packets to buffering
-* ring if transmission fails so the packet isn't lost.
-*/
-   if (slave_tx_count != 1)
-   rte_ring_enqueue(port->tx_ring,  ctrl_pkt);
-   }
-   }
-
return total_tx_count;
 }


On 2/11/19 3:01 AM, wangyunjian wrote:

From: Yunjian Wang 

Now sending 0 packet it doesn't consider for LACPDUs,
but the LACPDUs should be checked and sended.

Fixes: 09150784a776 ("net/bonding: burst mode hash calculation")
Cc: sta...@dpdk.org

Reported-by: Hui Zhao 
Signed-off-by: Yunjian Wang 
---
  drivers/net/bonding/rte_eth_bond_pmd.c | 7 ---
  1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c 
b/drivers/net/bonding/rte_eth_bond_pmd.c
index 44deaf1..a77af19 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -1298,9 +1298,6 @@ struct bwg_slave {
  
  	uint16_t i;
  
-	if (unlikely(nb_bufs == 0))

-   return 0;
-
/* Copy slave list to protect against slave up/down changes during tx
 * bursting */
slave_count = internals->active_slave_count;
@@ -1310,6 +1307,9 @@ struct bwg_slave {
memcpy(slave_port_ids, internals->active_slaves,
sizeof(slave_port_ids[0]) * slave_count);
  
+	if (unlikely(nb_bufs == 0))

+   goto lacp_send;
+
dist_slave_count = 0;
for (i = 0; i < slave_count; i++) {
struct port *port = &bond_mode_8023ad_ports[slave_port_ids[i]];
@@ -1365,6 +1365,7 @@ struct bwg_slave {
}
}
  
+lacp_send:

/* Check for LACP control packets and send if available */
for (i = 0; i < slave_count; i++) {
struct port *port = &bond_mode_8023ad_ports[slave_port_ids[i]

[dpdk-dev] [PATCH] net/bonding: fix transmit in 802.3ad mode

2019-02-11 Thread Chas Williams
We can transmit if there is at least one distributing slave.

Fixes: 09150784a776 ("net/bonding: burst mode hash calculation")
Cc: sta...@dpdk.org

Signed-off-by: Chas Williams 
---
 drivers/net/bonding/rte_eth_bond_pmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c 
b/drivers/net/bonding/rte_eth_bond_pmd.c
index 23cec2549..2304172d0 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -1319,7 +1319,7 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf 
**bufs,
slave_port_ids[i];
}
 
-   if (likely(dist_slave_count > 1)) {
+   if (likely(dist_slave_count > 0)) {
 
/*
 * Populate slaves mbuf with the packets which are to be sent
-- 
2.17.2



[dpdk-dev] [Bug 205] make test fails with DPDK 19.02 (KeyError: 'Command')

2019-02-11 Thread bugzilla
https://bugs.dpdk.org/show_bug.cgi?id=205

Bug ID: 205
   Summary: make test fails with DPDK 19.02 (KeyError: 'Command')
   Product: DPDK
   Version: 19.02
  Hardware: x86
OS: Linux
Status: CONFIRMED
  Severity: normal
  Priority: Normal
 Component: other
  Assignee: dev@dpdk.org
  Reporter: ramir...@gmail.com
  Target Milestone: ---

With DPDK 19.02 release, When running: 

make config T=x86_64-native-linuxapp-gcc
make
make test
I consistently get the following error message:
...

 INSTALL-MAP test.map
/work/src/dpdk-19.02/build/app/test -c f -n 4
Traceback (most recent call last):
  File "/work/src/dpdk-19.02/test/test/autotest.py", line 49, in 
num_fails = runner.run_all_tests()
  File "/work/src/dpdk-19.02/test/test/autotest_runner.py", line 345, in
run_all_tests
self.parallel_tests)
  File "/work/src/dpdk-19.02/test/test/autotest_runner.py", line 264, in
__filter_test
test_cmd = test["Command"]
KeyError: 'Command'
make[1]: *** [/work/src/dpdk-19.02/mk/rte.sdktest.mk:49: test] Error 1
make: *** [/work/src/dpdk-19.02/mk/rte.sdkroot.mk:73: test] Error 2
...

Regards,
Rami Rosen

-- 
You are receiving this mail because:
You are the assignee for the bug.

[dpdk-dev] [PATCH] test: fix broken "make test"

2019-02-11 Thread Rami Rosen
This patch fixes a broken build; when running
make test
we get the following error:
...
Traceback (most recent call last):
  File "/work/src/dpdk-19.02/test/test/autotest.py", line 49, in 
num_fails = runner.run_all_tests()
  File "/work/src/dpdk-19.02/test/test/autotest_runner.py", line 345, in
run_all_tests
self.parallel_tests)
  File "/work/src/dpdk-19.02/test/test/autotest_runner.py", line 264, in
__filter_test
test_cmd = test["Command"]
KeyError: 'Command'
...
The reason is that the pdump autotest entry uses "Comamnd"
instead of "Command"; this patch fixes it.

Bugzilla ID: 205
Fixes: 086eb64db39e ("test/pdump: add unit test for pdump library")
Signed-off-by: Rami Rosen 
---
 test/test/autotest_data.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/test/autotest_data.py b/test/test/autotest_data.py
index 948a625b5..5f87bb94d 100644
--- a/test/test/autotest_data.py
+++ b/test/test/autotest_data.py
@@ -508,7 +508,7 @@
 },
 {
 "Name":"Pdump autotest",
-"Comamnd": "pdump_autotest",
+"Command": "pdump_autotest",
 "Func":default_autotest,
 "Report":  None,
 },
-- 
2.19.2



[dpdk-dev] [PATCH ] mbuf: fix a typo

2019-02-11 Thread Rami Rosen
This trivial patch fixes a typo in rte_mbuf.h.

Fixes: f20b50b946da ("mbuf: optimize refcnt update")
Cc: sta...@dpdk.org 
Signed-off-by: Rami Rosen 
---
 lib/librte_mbuf/rte_mbuf.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index a7f67023a..d961ccaf6 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -973,7 +973,7 @@ rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value)
 {
/*
 * The atomic_add is an expensive operation, so we don't want to
-* call it in the case where we know we are the uniq holder of
+* call it in the case where we know we are the unique holder of
 * this mbuf (i.e. ref_cnt == 1). Otherwise, an atomic
 * operation has to be used because concurrent accesses on the
 * reference counter can occur.
-- 
2.19.2



Re: [dpdk-dev] [PATCH] net/bonding: fix slave tx burst for mode 4

2019-02-11 Thread wangyunjian
I agree with you. Can you fix it?

Thanks
Yunjian

> -Original Message-
> From: Chas Williams [mailto:3ch...@gmail.com]
> Sent: Monday, February 11, 2019 11:35 PM
> To: wangyunjian ; dev@dpdk.org
> Cc: ch...@att.com; xudingke ; sta...@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH] net/bonding: fix slave tx burst for mode 4
> 
> How strange. I was just looking at this issue this weekend. I think we can 
> just
> move the control packet handling before the data packet handling. That
> avoids the goto and is a little more sensible -- we should try to prioritize
> control traffic (even if we can't guarantee there will be space it's better 
> than
> nothing). Something like this:
> 
> diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c
> b/drivers/net/bonding/rte_eth_bond_pmd.c
> index 44deaf119..89ad67266 100644
> --- a/drivers/net/bonding/rte_eth_bond_pmd.c
> +++ b/drivers/net/bonding/rte_eth_bond_pmd.c
> @@ -1298,9 +1298,6 @@ bond_ethdev_tx_burst_8023ad(void *queue,
> struct rte_mbuf **bufs,
> 
>   uint16_t i;
> 
> - if (unlikely(nb_bufs == 0))
> - return 0;
> -
>   /* Copy slave list to protect against slave up/down changes during tx
>* bursting */
>   slave_count = internals->active_slave_count; @@ -1310,6 +1307,30
> @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
>   memcpy(slave_port_ids, internals->active_slaves,
>   sizeof(slave_port_ids[0]) * slave_count);
> 
> + /* Check for LACP control packets and send if available */
> + for (i = 0; i < slave_count; i++) {
> + struct port *port =
> &bond_mode_8023ad_ports[slave_port_ids[i]];
> + struct rte_mbuf *ctrl_pkt = NULL;
> +
> + if (likely(rte_ring_empty(port->tx_ring)))
> + continue;
> +
> + if (rte_ring_dequeue(port->tx_ring,
> +  (void **)&ctrl_pkt) != -ENOENT) {
> + slave_tx_count = rte_eth_tx_burst(slave_port_ids[i],
> + bd_tx_q->queue_id, &ctrl_pkt, 1);
> + /*
> +  * re-enqueue LAG control plane packets to buffering
> +  * ring if transmission fails so the packet isn't lost.
> +  */
> + if (slave_tx_count != 1)
> + rte_ring_enqueue(port->tx_ring,
>   ctrl_pkt);
> + }
> + }
> +
> + if (unlikely(nb_bufs == 0))
> + return 0;
> +
>   dist_slave_count = 0;
>   for (i = 0; i < slave_count; i++) {
>   struct port *port =
> &bond_mode_8023ad_ports[slave_port_ids[i]];
> @@ -1365,27 +1386,6 @@ bond_ethdev_tx_burst_8023ad(void *queue,
> struct rte_mbuf **bufs,
>   }
>   }
> 
> - /* Check for LACP control packets and send if available */
> - for (i = 0; i < slave_count; i++) {
> - struct port *port =
> &bond_mode_8023ad_ports[slave_port_ids[i]];
> - struct rte_mbuf *ctrl_pkt = NULL;
> -
> - if (likely(rte_ring_empty(port->tx_ring)))
> - continue;
> -
> - if (rte_ring_dequeue(port->tx_ring,
> -  (void **)&ctrl_pkt) != -ENOENT) {
> - slave_tx_count = rte_eth_tx_burst(slave_port_ids[i],
> - bd_tx_q->queue_id, &ctrl_pkt, 1);
> - /*
> -  * re-enqueue LAG control plane packets to buffering
> -  * ring if transmission fails so the packet isn't lost.
> -  */
> - if (slave_tx_count != 1)
> - rte_ring_enqueue(port->tx_ring,
>   ctrl_pkt);
> - }
> - }
> -
>   return total_tx_count;
>   }
> 
> 
> On 2/11/19 3:01 AM, wangyunjian wrote:
> > From: Yunjian Wang 
> >
> > Now sending 0 packet it doesn't consider for LACPDUs, but the LACPDUs
> > should be checked and sended.
> >
> > Fixes: 09150784a776 ("net/bonding: burst mode hash calculation")
> > Cc: sta...@dpdk.org
> >
> > Reported-by: Hui Zhao 
> > Signed-off-by: Yunjian Wang 
> > ---
> >   drivers/net/bonding/rte_eth_bond_pmd.c | 7 ---
> >   1 file changed, 4 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c
> > b/drivers/net/bonding/rte_eth_bond_pmd.c
> > index 44deaf1..a77af19 100644
> > --- a/drivers/net/bonding/rte_eth_bond_pmd.c
> > +++ b/drivers/net/bonding/rte_eth_bond_pmd.c
> > @@ -1298,9 +1298,6 @@ struct bwg_slave {
> >
> > uint16_t i;
> >
> > -   if (unlikely(nb_bufs == 0))
> > -   return 0;
> > -
> > /* Copy slave list to protect against slave up/down changes during tx
> >  * bursting */
> > slave_count = internals->active_slave_count; @@ -1310,6 +1307,9
> @@
> > struct bwg_slave {
> > memcpy(slave_port_ids, internals->active_slaves,
> > sizeof(slave_port_ids[0]) *

Re: [dpdk-dev] [PATCH 0/3] adding op-type crt sign and decrypt

2019-02-11 Thread Shally Verma
HI Arek,

From: Kusztal, ArkadiuszX  
Sent: 11 February 2019 17:11
To: Ayuj Verma ; Trahe, Fiona ; 
Shally Verma 
Cc: akhil.go...@nxp.com
Subject: [EXT] RE: [PATCH 0/3] adding op-type crt sign and decrypt

External Email 

Hi Ayuj,

Few comments from me. 

Some PMDs can only support RSA private key operations using CRT keys
(quintuple) only. Thus it is required to add in PMD RSA xform
capability which key type is supported to perform sign and decrypt ops.


Thus add an another op_type RTE_CRYPTO_OP_TYPE_SIGN_CRT and
RTE_CRYPTO_OP_TYPE_DECRYPT_CRT, which would mean perform an private
key op using CRT keys (quintuple) only.
[AK] - What would be the purpose of enum rte_crypto_rsa_priv_key_type key_type 
in RSA XFORM then?

[Shally] PMDs, like openssl, can support private key ops with both key type 
i.e. one can invoke RSA_Sign() with quintuple keys or exponent keys. 
Openssl in its capability would reflect it support ops with both key types. 
that's why key_type is still required in xform. 

PMD would reflect its capability to support these operations using its
op_type mask. App should query RSA xform capability API to check if
specific op_type is supported, thus call operation with relevant key
type.

Another proposal is, it is not known if non-crt keys is used at all to
perform otherwise naturally slow RSA private keys operations.
So, it is also possible to deprecate RSA_KEY_TYPE_EXPONENT altogether
and just use quintuple key type for private key operations.
In that case, there is no need to add another SIGN/DECRYPT_CRT variant,
current SIGN and DECRYPT operation default to using quintuple RSA keys.
[AK] - even if I generally agree that all drivers will be using CRT by default 
(when quintuple keys provided) I think that if some PMD cannot support mod exp, 
it should fail on session init or should receive unsupported error on dequeue.

[Shally] Sorry this isn't clear to me when you say "if some PMD cannot support 
mod exp, it should fail on session init" . modexp is exported as separate xform 
on lib, if PMD doesn't support this xform, it will not be in its capability.
Or do you mean to say, we can leave exponent key type support , if PMD doesn't 
support operations using this type, it can will fail during session_init()?
modexp is base for all RSA operation, so any PMD has to support it internally 
in any case.

Ayuj Verma (3):
  lib/cryptodev: add crt sign and decrypt ops
  crypto/openssl: update op-type mask with crt ops
  test/crypto: check for rsa capa for op-type

 drivers/crypto/openssl/rte_openssl_pmd_ops.c |  4 +-
 lib/librte_cryptodev/rte_crypto_asym.h   |  8 
 test/test/test_cryptodev_asym.c  | 47 
 3 files changed, 58 insertions(+), 1 deletion(-)

-- 
2.20.0

Regards,
Arek


Re: [dpdk-dev] [PATCH 1/2] net/ixgbe: do not start on unsupported loopback mode

2019-02-11 Thread Zhao1, Wei


Hi,  Meunier
   Only a little change need for this patch.

Acked-by: Wei Zhao 

> -Original Message-
> From: Julien Meunier [mailto:julien.meun...@nokia.com]
> Sent: Friday, February 8, 2019 1:30 AM
> To: Ananyev, Konstantin ; Lu, Wenzhuo
> ; Zhao1, Wei ; Zhang, Qi Z
> 
> Cc: dev@dpdk.org
> Subject: [PATCH 1/2] net/ixgbe: do not start on unsupported loopback mode
> 
> Only TX->RX loopback is supported currently on 82599EB. If a user wants to
> apply an another loopback configuration (!= IXGBE_LPBK_82599_TX_RX),
> ixgbe PMD ignores it and continues the configuration without raising any
> error.
> 
> Let's robustify this part by checking if the requested loopback mode is 
> correct
> for the current device, before starting it. If it is not valid, PMD will 
> refuse to
> start.
> 
> Signed-off-by: Julien Meunier 
> ---
> v2:
> - factorize code
> - check if loopback is really supported
> ---
>  drivers/net/ixgbe/ixgbe_ethdev.c | 13 +
>  drivers/net/ixgbe/ixgbe_rxtx.c   | 37 +--
> --
>  drivers/net/ixgbe/ixgbe_rxtx.h   |  2 ++
>  3 files changed, 40 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
> b/drivers/net/ixgbe/ixgbe_ethdev.c
> index 7493110..558f60b 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -2652,10 +2652,15 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
>   goto error;
>   }
> 
> - /* Skip link setup if loopback mode is enabled for 82599. */
> - if (hw->mac.type == ixgbe_mac_82599EB &&
> - dev->data->dev_conf.lpbk_mode ==
> IXGBE_LPBK_82599_TX_RX)
> - goto skip_link_setup;
> + /* Skip link setup if loopback mode is enabled. */
> + if (dev->data->dev_conf.lpbk_mode != 0) {
> + err = ixgbe_check_supported_loopback_mode(dev);
> + if (err < 0) {
> + PMD_INIT_LOG(ERR, "Unsupported loopback
> mode");
> + goto error;
> + } else
> + goto skip_link_setup;
> + }
> 
>   if (ixgbe_is_sfp(hw) && hw->phy.multispeed_fiber) {
>   err = hw->mac.ops.setup_sfp(hw);
> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
> index 9a79d18..c9a70a8 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> @@ -4879,13 +4879,18 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
>   hlreg0 &= ~IXGBE_HLREG0_JUMBOEN;
> 
>   /*
> -  * If loopback mode is configured for 82599, set LPBK bit.
> +  * If loopback mode is configured, set LPBK bit.
>*/
> - if (hw->mac.type == ixgbe_mac_82599EB &&
> - dev->data->dev_conf.lpbk_mode ==
> IXGBE_LPBK_82599_TX_RX)
> + if (dev->data->dev_conf.lpbk_mode != 0) {
> + rc = ixgbe_check_supported_loopback_mode(dev);
> + if (rc < 0) {
> + PMD_INIT_LOG(ERR, "Unsupported loopback
> mode");
> + return rc;
> + }
>   hlreg0 |= IXGBE_HLREG0_LPBK;
> - else
> + } else {
>   hlreg0 &= ~IXGBE_HLREG0_LPBK;
> + }
> 
>   IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
> 
> @@ -5062,6 +5067,21 @@ ixgbe_dev_tx_init(struct rte_eth_dev *dev)  }
> 
>  /*
> + * Check if requested loopback mode is supported  */ int
> +ixgbe_check_supported_loopback_mode(struct rte_eth_dev *dev) {
> + struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data-
> >dev_private);
> +
> + if (dev->data->dev_conf.lpbk_mode == IXGBE_LPBK_82599_TX_RX)
> + if (hw->mac.type == ixgbe_mac_82599EB)
> + return 0;
> +
> + return -ENOTSUP;
> +}
> +
> +/*
>   * Set up link for 82599 loopback mode Tx->Rx.
>   */
>  static inline void __attribute__((cold)) @@ -5148,10 +5168,11 @@
> ixgbe_dev_rxtx_start(struct rte_eth_dev *dev)
>   rxctrl |= IXGBE_RXCTRL_RXEN;
>   hw->mac.ops.enable_rx_dma(hw, rxctrl);
> 
> - /* If loopback mode is enabled for 82599, set up the link accordingly
> */
> - if (hw->mac.type == ixgbe_mac_82599EB &&
> - dev->data->dev_conf.lpbk_mode ==
> IXGBE_LPBK_82599_TX_RX)
> - ixgbe_setup_loopback_link_82599(hw);
> + /* If loopback mode is enabled, set up the link accordingly */
> + if (dev->data->dev_conf.lpbk_mode != 0) {
> + if (hw->mac.type == ixgbe_mac_82599EB)
> + ixgbe_setup_loopback_link_82599(hw);
> + }
> 
>  #ifdef RTE_LIBRTE_SECURITY
>   if ((dev->data->dev_conf.rxmode.offloads & diff --git
> a/drivers/net/ixgbe/ixgbe_rxtx.h b/drivers/net/ixgbe/ixgbe_rxtx.h index
> 39378f7..2d8011d 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.h
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.h
> @@ -276,6 +276,8 @@ void ixgbe_set_tx_function(struct rte_eth_dev *dev,
> struct ixgbe_tx_queue *txq);
>   */
>  void ixgbe_set_rx_function(struct rte_eth_dev *dev);
> 
> +int ixgbe_check_supported_loopback_m

Re: [dpdk-dev] [PATCH 2/2] net/ixgbe: add support of loopback for X540/X550

2019-02-11 Thread Zhao1, Wei
HI,  Meunier && qi

> -Original Message-
> From: Julien Meunier [mailto:julien.meun...@nokia.com]
> Sent: Friday, February 8, 2019 1:30 AM
> To: Ananyev, Konstantin ; Lu, Wenzhuo
> ; Zhao1, Wei ; Zhang, Qi Z
> 
> Cc: dev@dpdk.org
> Subject: [PATCH 2/2] net/ixgbe: add support of loopback for X540/X550
> 
> Loopback mode is also supported on X540 and X550 NICs, according to their
> datasheet (section 15.2). The way to set it up is a little different of the 
> 82599.
> 
> Signed-off-by: Julien Meunier 
> ---
> v2:
> - disable / enable autoneg when loopback is requested for X540 / X550
> ---
>  drivers/net/ixgbe/base/ixgbe_type.h |  1 +
> drivers/net/ixgbe/base/ixgbe_x540.c | 26 
> drivers/net/ixgbe/base/ixgbe_x540.h |  2 ++
> drivers/net/ixgbe/base/ixgbe_x550.c | 26 
> drivers/net/ixgbe/base/ixgbe_x550.h |  1 +
>  drivers/net/ixgbe/ixgbe_ethdev.h|  5 ++-
>  drivers/net/ixgbe/ixgbe_rxtx.c  | 61
> +++--
>  7 files changed, 117 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/ixgbe/base/ixgbe_type.h
> b/drivers/net/ixgbe/base/ixgbe_type.h
> index 077b8f0..c4af31e 100644
> --- a/drivers/net/ixgbe/base/ixgbe_type.h
> +++ b/drivers/net/ixgbe/base/ixgbe_type.h
> @@ -1649,6 +1649,7 @@ struct ixgbe_dmac_config {
>  #define IXGBE_MII_5GBASE_T_ADVERTISE 0x0800
>  #define IXGBE_MII_100BASE_T_ADVERTISE0x0100 /* full duplex,
> bit:8 */
>  #define IXGBE_MII_100BASE_T_ADVERTISE_HALF   0x0080 /* half duplex,
> bit:7 */
> +#define IXGBE_MII_AUTONEG_ENABLE 0x1000
>  #define IXGBE_MII_RESTART0x200
>  #define IXGBE_MII_AUTONEG_COMPLETE   0x20
>  #define IXGBE_MII_AUTONEG_LINK_UP0x04
> diff --git a/drivers/net/ixgbe/base/ixgbe_x540.c
> b/drivers/net/ixgbe/base/ixgbe_x540.c
> index f00f0ea..a241d41 100644
> --- a/drivers/net/ixgbe/base/ixgbe_x540.c
> +++ b/drivers/net/ixgbe/base/ixgbe_x540.c


Is it possible to add these two function of ixgbe_setup_phy_autoneg_x540 and 
ixgbe_setup_phy_autoneg_x550 in a file out of base folder? We need to avoid
change code in that, is that right? @qi
And also, it seems these 2 function do not have much difference, 
can we use one instead of two function?(This point is not so important)



> @@ -1032,3 +1032,29 @@ s32 ixgbe_blink_led_stop_X540(struct ixgbe_hw
> *hw, u32 index)
> 
>   return IXGBE_SUCCESS;
>  }
> +
> +/*
> + *  ixgbe_setup_phy_link_x540 - Enable/disable the autoneg
> + *  @hw: pointer to hardware structure
> + *  enable: enable/disable the autoneg
> + **/
> +s32 ixgbe_setup_phy_autoneg_x540(struct ixgbe_hw *hw, bool enable) {
> + s32 status = IXGBE_SUCCESS;
> + u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
> +
> + DEBUGFUNC("ixgbe_setup_phy_autoneg_x540");
> +
> + hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
> +  IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
> &autoneg_reg);
> +
> + if (enable)
> + autoneg_reg |= IXGBE_MII_AUTONEG_ENABLE;
> + else
> + autoneg_reg &= ~IXGBE_MII_AUTONEG_ENABLE;
> +
> + hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
> +   IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
> autoneg_reg);
> +
> + return status;
> +}
> diff --git a/drivers/net/ixgbe/base/ixgbe_x540.h
> b/drivers/net/ixgbe/base/ixgbe_x540.h
> index 231dfe5..ef939ce 100644
> --- a/drivers/net/ixgbe/base/ixgbe_x540.h
> +++ b/drivers/net/ixgbe/base/ixgbe_x540.h
> @@ -34,5 +34,7 @@ void ixgbe_init_swfw_sync_X540(struct ixgbe_hw *hw);
> 
>  s32 ixgbe_blink_led_start_X540(struct ixgbe_hw *hw, u32 index);
>  s32 ixgbe_blink_led_stop_X540(struct ixgbe_hw *hw, u32 index);
> +
> +s32 ixgbe_setup_phy_autoneg_x540(struct ixgbe_hw *hw, bool enable);

The Space line seems not needed.

>  #endif /* _IXGBE_X540_H_ */
> 
> diff --git a/drivers/net/ixgbe/base/ixgbe_x550.c
> b/drivers/net/ixgbe/base/ixgbe_x550.c
> index a920a14..f4ee188 100644
> --- a/drivers/net/ixgbe/base/ixgbe_x550.c
> +++ b/drivers/net/ixgbe/base/ixgbe_x550.c
> @@ -4652,3 +4652,29 @@ bool ixgbe_fw_recovery_mode_X550(struct
> ixgbe_hw *hw)
> 
>   return !!(fwsm & IXGBE_FWSM_FW_NVM_RECOVERY_MODE);  }
> +
> +/*
> + *  ixgbe_setup_phy_link_x550 - Enable/disable the autoneg
> + *  @hw: pointer to hardware structure
> + *  enable: enable/disable the autoneg
> + **/
> +s32 ixgbe_setup_phy_autoneg_x550(struct ixgbe_hw *hw, bool enable) {
> + s32 status = IXGBE_SUCCESS;
> + u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
> +
> + DEBUGFUNC("ixgbe_setup_phy_autoneg_x550");
> +
> + hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
> +  IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
> &autoneg_reg);
> +
> + if (enable)
> + autoneg_reg |= IXGBE_MII_AUTONEG_ENABLE;
> + else
> + autoneg_reg &= ~IXGBE_MII_AUTONEG_ENABLE;
> +
> + hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
> +   IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
> autone

[dpdk-dev] [PATCH v2] hash: optimize signature compare by using neon intrinsic

2019-02-11 Thread Ruifeng Wang
Implemented signature compare function based on neon intrinsic.
Hash bulk lookup had 3% - 6% performance gain after optimization.

Signed-off-by: Ruifeng Wang 
Reviewed-by: Gavin Hu 
---
v2:
* Use 'rte_vect.h' instead of 'arm_neon.h'.
* Moved down variable declaration to avoid extra #ifdef.

 lib/librte_hash/rte_cuckoo_hash.c | 29 -
 lib/librte_hash/rte_cuckoo_hash.h |  1 +
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/lib/librte_hash/rte_cuckoo_hash.c 
b/lib/librte_hash/rte_cuckoo_hash.c
index c01489ba5..0dddce226 100644
--- a/lib/librte_hash/rte_cuckoo_hash.c
+++ b/lib/librte_hash/rte_cuckoo_hash.c
@@ -26,6 +26,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "rte_hash.h"
 #include "rte_cuckoo_hash.h"
@@ -407,6 +408,10 @@ rte_hash_create(const struct rte_hash_parameters *params)
if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE2))
h->sig_cmp_fn = RTE_HASH_COMPARE_SSE;
else
+#elif defined(RTE_ARCH_ARM64)
+   if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON))
+   h->sig_cmp_fn = RTE_HASH_COMPARE_NEON;
+   else
 #endif
h->sig_cmp_fn = RTE_HASH_COMPARE_SCALAR;
 
@@ -1581,7 +1586,7 @@ compare_signatures(uint32_t *prim_hash_matches, uint32_t 
*sec_hash_matches,
 
/* For match mask the first bit of every two bits indicates the match */
switch (sig_cmp_fn) {
-#ifdef RTE_MACHINE_CPUFLAG_SSE2
+#if defined(RTE_MACHINE_CPUFLAG_SSE2)
case RTE_HASH_COMPARE_SSE:
/* Compare all signatures in the bucket */
*prim_hash_matches = _mm_movemask_epi8(_mm_cmpeq_epi16(
@@ -1594,6 +1599,28 @@ compare_signatures(uint32_t *prim_hash_matches, uint32_t 
*sec_hash_matches,
(__m128i const *)sec_bkt->sig_current),
_mm_set1_epi16(sig)));
break;
+#elif defined(RTE_MACHINE_CPUFLAG_NEON)
+   case RTE_HASH_COMPARE_NEON: {
+   uint16x8_t vmat, vsig, x;
+   uint64x2_t x64;
+   int16x8_t shift = {-15, -13, -11, -9, -7, -5, -3, -1};
+
+   vsig = vld1q_dup_u16((uint16_t const *)&sig);
+   /* Compare all signatures in the primary bucket */
+   vmat = vceqq_u16(vsig,
+   vld1q_u16((uint16_t const *)prim_bkt->sig_current));
+   x = vshlq_u16(vandq_u16(vmat, vdupq_n_u16(0x8000)), shift);
+   x64 = vpaddlq_u32(vpaddlq_u16(x));
+   *prim_hash_matches = (uint32_t)(vgetq_lane_u64(x64, 0) +
+   vgetq_lane_u64(x64, 1));
+   /* Compare all signatures in the secondary bucket */
+   vmat = vceqq_u16(vsig,
+   vld1q_u16((uint16_t const *)sec_bkt->sig_current));
+   x = vshlq_u16(vandq_u16(vmat, vdupq_n_u16(0x8000)), shift);
+   x64 = vpaddlq_u32(vpaddlq_u16(x));
+   *sec_hash_matches = (uint32_t)(vgetq_lane_u64(x64, 0) +
+   vgetq_lane_u64(x64, 1)); }
+   break;
 #endif
default:
for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) {
diff --git a/lib/librte_hash/rte_cuckoo_hash.h 
b/lib/librte_hash/rte_cuckoo_hash.h
index eacdaa8d4..0548c97f0 100644
--- a/lib/librte_hash/rte_cuckoo_hash.h
+++ b/lib/librte_hash/rte_cuckoo_hash.h
@@ -141,6 +141,7 @@ struct rte_hash_key {
 enum rte_hash_sig_compare_function {
RTE_HASH_COMPARE_SCALAR = 0,
RTE_HASH_COMPARE_SSE,
+   RTE_HASH_COMPARE_NEON,
RTE_HASH_COMPARE_NUM
 };
 
-- 
2.17.1