summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorahdj007 <dong.juan1@zte.com.cn>2018-03-08 10:02:17 +0800
committerDamjan Marion <dmarion.lists@gmail.com>2018-03-09 13:05:27 +0000
commit5e85c54d229e443d30dabe9bca39625587add8a5 (patch)
tree61393541c8304bf1fcb7e6a316e0c9248e03fa00
parent31ed74407643595fdce206e9d7487108fb8b33ab (diff)
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 <dong.juan1@zte.com.cn>
-rwxr-xr-xsrc/plugins/nat/nat_reass.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/plugins/nat/nat_reass.c b/src/plugins/nat/nat_reass.c
index 50bfced2b45..eb1b4925521 100755
--- a/src/plugins/nat/nat_reass.c
+++ b/src/plugins/nat/nat_reass.c
@@ -228,7 +228,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;
@@ -273,12 +273,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);