diff options
author | Pierre Pfister <ppfister@cisco.com> | 2017-08-09 10:42:06 +0200 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2017-08-29 12:27:44 +0000 |
commit | 50b60ebcc306b162a5d7b0916830638a2e99d378 (patch) | |
tree | 04a5549f516399993ebccd6b4cd398aeabd9188f /src/plugins/flowprobe/node.c | |
parent | 4ba75f54461c31fbb32b8ef9c05fe38da74cb295 (diff) |
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 <ppfister@cisco.com>
Diffstat (limited to 'src/plugins/flowprobe/node.c')
-rw-r--r-- | src/plugins/flowprobe/node.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/plugins/flowprobe/node.c b/src/plugins/flowprobe/node.c index c4610a77..2f7d0025 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); } |