MFIB: changes to improve route add/delete performance
[vpp.git] / src / vnet / mfib / mfib_entry.c
index acbe90b..1aa8e08 100644 (file)
@@ -292,6 +292,8 @@ mfib_entry_src_flush (mfib_entry_src_t *msrc)
     ({
         mfib_itf_delete(mfib_itf_get(mfii));
     }));
+    hash_free(msrc->mfes_itfs);
+    msrc->mfes_itfs = NULL;
     fib_path_list_unlock(msrc->mfes_pl);
 }
 
@@ -404,14 +406,21 @@ mfib_entry_alloc (u32 fib_index,
     mfib_entry_t *mfib_entry;
 
     pool_get(mfib_entry_pool, mfib_entry);
-    memset(mfib_entry, 0, sizeof(*mfib_entry));
 
     fib_node_init(&mfib_entry->mfe_node,
                   FIB_NODE_TYPE_MFIB_ENTRY);
 
+    /*
+     * Some of the members require non-default initialisation
+     * so we also init those that don't and thus save on the call to memset.
+     */
+    mfib_entry->mfe_flags = 0;
     mfib_entry->mfe_fib_index = fib_index;
     mfib_entry->mfe_prefix = *prefix;
     mfib_entry->mfe_parent = FIB_NODE_INDEX_INVALID;
+    mfib_entry->mfe_sibling = FIB_NODE_INDEX_INVALID;
+    mfib_entry->mfe_srcs = NULL;
+    mfib_entry->mfe_itfs = NULL;
 
     dpo_reset(&mfib_entry->mfe_rep);
 
@@ -1050,9 +1059,15 @@ mfib_entry_encode (fib_node_index_t mfib_entry_index,
     mfib_entry_t *mfib_entry;
 
     mfib_entry = mfib_entry_get(mfib_entry_index);
-    fib_path_list_walk(mfib_entry->mfe_parent, fib_path_encode, api_rpaths);
+    if (FIB_NODE_INDEX_INVALID != mfib_entry->mfe_parent)
+    {
+        fib_path_list_walk(mfib_entry->mfe_parent,
+                           fib_path_encode,
+                           api_rpaths);
+    }
 }
 
+
 void
 mfib_entry_get_prefix (fib_node_index_t mfib_entry_index,
                       mfib_prefix_t *pfx)