From 50b60ebcc306b162a5d7b0916830638a2e99d378 Mon Sep 17 00:00:00 2001 From: Pierre Pfister Date: Wed, 9 Aug 2017 10:42:06 +0200 Subject: Flowprobe: Fix flow start time and hash computation Upon hash collision, the flow start time was not reset. The hash computation techniques (crc32 or xxhash) also both had bugs which are now fixed. Change-Id: I94d72997f34018d1699324264f7dded2a5cbd776 Signed-off-by: Pierre Pfister --- src/plugins/flowprobe/node.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src/plugins/flowprobe/node.c') diff --git a/src/plugins/flowprobe/node.c b/src/plugins/flowprobe/node.c index c4610a77fa4..2f7d002561a 100644 --- a/src/plugins/flowprobe/node.c +++ b/src/plugins/flowprobe/node.c @@ -289,10 +289,13 @@ flowprobe_hash (flowprobe_key_t * k) u32 h = 0; #ifdef clib_crc32c_uses_intrinsics - h = clib_crc32c ((u8 *) k->as_u32, FLOWPROBE_KEY_IN_U32); + h = clib_crc32c ((u8 *) k, sizeof (*k)); #else - u64 tmp = - k->as_u32[0] ^ k->as_u32[1] ^ k->as_u32[2] ^ k->as_u32[3] ^ k->as_u32[4]; + int i; + u64 tmp = 0; + for (i = 0; i < sizeof (*k) / 8; i++) + tmp ^= ((u64 *) k)[i]; + h = clib_xxhash (tmp); #endif @@ -370,7 +373,7 @@ add_to_flow_record_state (vlib_main_t * vm, vlib_node_runtime_t * node, ethernet_header_t *eth = vlib_buffer_get_current (b); u16 ethertype = clib_net_to_host_u16 (eth->type); /* *INDENT-OFF* */ - flowprobe_key_t k = { {0} }; + flowprobe_key_t k = {}; /* *INDENT-ON* */ ip4_header_t *ip4 = 0; ip6_header_t *ip6 = 0; @@ -472,6 +475,7 @@ add_to_flow_record_state (vlib_main_t * vm, vlib_node_runtime_t * node, if (e->packetcount) flowprobe_export_entry (vm, e); e->key = k; + e->flow_start = timestamp; vlib_node_increment_counter (vm, node->node_index, FLOWPROBE_ERROR_COLLISION, 1); } -- cgit 1.2.3-korg