From 648ae391b6725445b4bf57715b7917950dc29011 Mon Sep 17 00:00:00 2001 From: ahdj007 Date: Thu, 8 Mar 2018 10:02:17 +0800 Subject: when exceed max reass, frag packet can't get reass. adding bihash,it can rewrite new hash value. so need to delete hash after compare hash value. Change-Id: I83b5c47890110e9a598b78cfbe8fcd27bbe291bb Signed-off-by: ahdj007 (cherry picked from commit 5e85c54d229e443d30dabe9bca39625587add8a5) --- src/plugins/nat/nat_reass.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/plugins/nat/nat_reass.c b/src/plugins/nat/nat_reass.c index 2e804477b26..1b412de0b18 100755 --- a/src/plugins/nat/nat_reass.c +++ b/src/plugins/nat/nat_reass.c @@ -227,7 +227,7 @@ nat_ip4_reass_find_or_create (ip4_address_t src, ip4_address_t dst, dlist_elt_t *oldest_elt, *elt; dlist_elt_t *per_reass_list_head_elt; u32 oldest_index, elt_index; - clib_bihash_kv_16_8_t kv; + clib_bihash_kv_16_8_t kv, value; k.src.as_u32 = src.as_u32; k.dst.as_u32 = dst.as_u32; @@ -272,12 +272,18 @@ nat_ip4_reass_find_or_create (ip4_address_t src, ip4_address_t dst, clib_dlist_addtail (srm->ip4_reass_lru_list_pool, srm->ip4_reass_head_index, oldest_index); - kv.key[0] = k.as_u64[0]; - kv.key[1] = k.as_u64[1]; - if (clib_bihash_add_del_16_8 (&srm->ip4_reass_hash, &kv, 0)) + kv.key[0] = reass->key.as_u64[0]; + kv.key[1] = reass->key.as_u64[1]; + if (!clib_bihash_search_16_8 (&srm->ip4_reass_hash, &kv, &value)) { - reass = 0; - goto unlock; + if (value.value == (reass - srm->ip4_reass_pool)) + { + if (clib_bihash_add_del_16_8 (&srm->ip4_reass_hash, &kv, 0)) + { + reass = 0; + goto unlock; + } + } } nat_ip4_reass_get_frags_inline (reass, bi_to_drop); -- cgit 1.2.3-korg