From 4df509f87a4b077e3a5d53080e2412dc066ed8d6 Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Fri, 27 Jul 2012 11:22:03 +0200 Subject: [PATCH] defrag: use IP ID in hash This patch fixes the collision issue observed on an intensive network trafic. When there is fragmentation it is the case for all data exchanged between two hosts. Thus using a hash func only involving IP addresses (and protocol) was leading to a collision for all exchanges between the hosts. At a larger scale, it was resulting in a packet loss. By using the IP ID instead of the protocol family, we introduce a real difference between the trackers. --- src/defrag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/defrag.c b/src/defrag.c index 0aafe4b84f..99a320a848 100644 --- a/src/defrag.c +++ b/src/defrag.c @@ -231,12 +231,12 @@ DefragHashFunc(HashListTable *ht, void *data, uint16_t datalen) uint32_t key; if (p->af == AF_INET) { - key = (defrag_hash_rand + p->af + + key = (defrag_hash_rand + p->id + p->src_addr.addr_data32[0] + p->dst_addr.addr_data32[0]) % defrag_hash_size; } else if (p->af == AF_INET6) { - key = (defrag_hash_rand + p->af + + key = (defrag_hash_rand + p->id + p->src_addr.addr_data32[0] + p->src_addr.addr_data32[1] + p->src_addr.addr_data32[2] + p->src_addr.addr_data32[3] + p->dst_addr.addr_data32[0] + p->dst_addr.addr_data32[1] +