Fix L2FIB learn counter and memory cleanup of mac_by_ip6 hash table
Fix global_learn_count to be incremented or decremented by add and
deletion of non-static MAC entries from L2FIB only. Without this fix,
the counter may reach the threshold of 1M and stop MAC leanring even
though number of MAC entries in L2FIB is less than the threshold.
Cleanup indirect hash key memory used by mac_by_ip6 hash table on
BD deletion.
Change-Id: I13986c4e6304c7956122520dd3f83d6bb6e65a15
Signed-off-by: John Lo <loj@cisco.com>
diff --git a/src/vnet/l2/l2_bd.c b/src/vnet/l2/l2_bd.c
index 4d54022..351e698 100644
--- a/src/vnet/l2/l2_bd.c
+++ b/src/vnet/l2/l2_bd.c
@@ -94,8 +94,11 @@
{
l2_bridge_domain_t *bd = &l2input_main.bd_configs[bd_index];
u32 bd_id = bd->bd_id;
- l2fib_flush_bd_mac (vlib_get_main (), bd_index);
+ u64 mac_addr;
+ ip6_address_t *ip6_addr_key;
+ /* flush non-static MACs in BD and removed bd_id from hash table */
+ l2fib_flush_bd_mac (vlib_get_main (), bd_index);
hash_unset (bdm->bd_index_by_bd_id, bd_id);
/* mark this index clear */
@@ -105,9 +108,15 @@
bd->bd_id = ~0;
bd->feature_bitmap = 0;
- /* free memory used by BD and flush non-static MACs in BD */
+ /* free memory used by BD */
vec_free (bd->members);
hash_free (bd->mac_by_ip4);
+ /* *INDENT-OFF* */
+ hash_foreach_mem (ip6_addr_key, mac_addr, bd->mac_by_ip6,
+ ({
+ clib_mem_free (ip6_addr_key); /* free memory used for ip6 addr key */
+ }));
+ /* *INDENT-ON* */
hash_free (bd->mac_by_ip6);
return 0;