diff options
author | Christophe Fontaine <christophe.fontaine@enea.com> | 2017-05-31 11:27:19 +0200 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-06-12 11:56:02 +0000 |
commit | b4bd28a490012ecbce292561da404d4e9b02d24b (patch) | |
tree | 410ace570b86fb0f0d9138807b719edd3464a4ac /src/vnet/map | |
parent | c9b622fbace7482c59f28fe516eefcb6acb83a1b (diff) |
Remove calls to crc_u32 and add clib_crc32c for armv8+crc
crc_u32 was not defined for non x86_64 with SSE4.2 processors.
Calls to "crc_u32" are removed and replaced by either a call to
clib_crc32c or a call to clib_xxhash, as the result is not used
as a check value but as a hash.
Change-Id: I3af4d68e2e5ebd0c9b0a6090f848d043cb0f20a2
Signed-off-by: Christophe Fontaine <christophe.fontaine@enea.com>
Diffstat (limited to 'src/vnet/map')
-rw-r--r-- | src/vnet/map/map.c | 42 |
1 files changed, 16 insertions, 26 deletions
diff --git a/src/vnet/map/map.c b/src/vnet/map/map.c index 8579cdf6a7b..d246f6c8254 100644 --- a/src/vnet/map/map.c +++ b/src/vnet/map/map.c @@ -19,29 +19,10 @@ #include <vnet/fib/ip6_fib.h> #include <vnet/adj/adj.h> #include <vnet/map/map_dpo.h> +#include <vppinfra/crc32.h> #include "map.h" -#ifdef __SSE4_2__ -static inline u32 -crc_u32 (u32 data, u32 value) -{ - __asm__ volatile ("crc32l %[data], %[value];":[value] "+r" (value):[data] - "rm" (data)); - return value; -} -#else -#include <vppinfra/xxhash.h> - -static inline u32 -crc_u32 (u32 data, u32 value) -{ - u64 tmp = ((u64) data << 32) | (u64) value; - return (u32) clib_xxhash (tmp); -} -#endif - - /* * This code supports the following MAP modes: * @@ -1488,10 +1469,12 @@ map_ip4_reass_get (u32 src, u32 dst, u16 fragment_id, }; u32 h = 0; - h = crc_u32 (k.as_u32[0], h); - h = crc_u32 (k.as_u32[1], h); - h = crc_u32 (k.as_u32[2], h); - h = crc_u32 (k.as_u32[3], h); +#ifdef clib_crc32c_uses_intrinsics + h = clib_crc32c ((u8 *) k.as_u32, 16); +#else + u64 tmp = k.as_u32[0] ^ k.as_u32[1] ^ k.as_u32[2] ^ k.as_u32[3]; + h = clib_xxhash (tmp); +#endif h = h >> (32 - mm->ip4_reass_ht_log2len); f64 now = vlib_time_now (mm->vlib_main); @@ -1660,8 +1643,15 @@ map_ip6_reass_get (ip6_address_t * src, ip6_address_t * dst, u32 fragment_id, u32 h = 0; int i; - for (i = 0; i < 10; i++) - h = crc_u32 (k.as_u32[i], h); + +#ifdef clib_crc32c_uses_intrinsics + h = clib_crc32c ((u8 *) k.as_u32, 40); +#else + u64 tmp = + k.as_u64[0] ^ k.as_u64[1] ^ k.as_u64[2] ^ k.as_u64[3] ^ k.as_u64[4]; + h = clib_xxhash (tmp); +#endif + h = h >> (32 - mm->ip6_reass_ht_log2len); f64 now = vlib_time_now (mm->vlib_main); |