FIB: 1) fix pool realloc during prefix export. 2) don't walk off the end of the path... 11/5511/2
authorNeale Ranns <nranns@cisco.com>
Fri, 24 Feb 2017 14:16:01 +0000 (06:16 -0800)
committerNeale Ranns <nranns@cisco.com>
Fri, 24 Feb 2017 16:37:23 +0000 (16:37 +0000)
Change-Id: I8bd8f6917ace089edb1f65bd017b478ee198c03f
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/fib/fib_attached_export.c
src/vnet/fib/fib_entry.c
src/vnet/fib/fib_entry_src.c

index 574131d..715e63e 100644 (file)
@@ -544,7 +544,7 @@ fib_ae_import_format (fib_entry_t *fib_entry,
        {
            s = format(s, "%d, ", *index);
        }
-           s = format(s, "]]");
+        s = format(s, "]]");
     }
 
     return (s);
index 8ef4ea8..25005e1 100644 (file)
@@ -551,11 +551,18 @@ fib_entry_alloc (u32 fib_index,
     return (fib_entry);
 }
 
-static void
+static fib_entry_t*
 fib_entry_post_flag_update_actions (fib_entry_t *fib_entry,
                                    fib_source_t source,
                                    fib_entry_flag_t old_flags)
 {
+    fib_node_index_t fei;
+
+    /*
+     * save the index so we can recover from pool reallocs
+     */
+    fei = fib_entry_get_index(fib_entry);
+
     /*
      * handle changes to attached export for import entries
      */
@@ -591,6 +598,11 @@ fib_entry_post_flag_update_actions (fib_entry_t *fib_entry,
      *   no change. nothing to do.
      */
 
+    /*
+     * reload the entry address post possible pool realloc
+     */
+    fib_entry = fib_entry_get(fei);
+
     /*
      * handle changes to attached export for export entries
      */
@@ -605,6 +617,8 @@ fib_entry_post_flag_update_actions (fib_entry_t *fib_entry,
        // FIXME
     }
     // else FIXME
+
+    return (fib_entry);
 }
 
 static void
@@ -612,7 +626,9 @@ fib_entry_post_install_actions (fib_entry_t *fib_entry,
                                fib_source_t source,
                                fib_entry_flag_t old_flags)
 {
-    fib_entry_post_flag_update_actions(fib_entry, source, old_flags);
+    fib_entry = fib_entry_post_flag_update_actions(fib_entry,
+                                                   source,
+                                                   old_flags);
     fib_entry_src_action_installed(fib_entry, source);
 }
 
@@ -909,7 +925,9 @@ fib_entry_path_remove (fib_node_index_t fib_entry_index,
                 * no more sources left. this entry is toast.
                 */
                fib_entry_src_action_uninstall(fib_entry);
-               fib_entry_post_flag_update_actions(fib_entry, source, bflags);
+               fib_entry = fib_entry_post_flag_update_actions(fib_entry,
+                                                               source,
+                                                               bflags);
 
                return (FIB_ENTRY_SRC_FLAG_NONE);
            }
@@ -997,7 +1015,9 @@ fib_entry_special_remove (fib_node_index_t fib_entry_index,
                 * no more sources left. this entry is toast.
                 */
                fib_entry_src_action_uninstall(fib_entry);
-               fib_entry_post_flag_update_actions(fib_entry, source, bflags);
+               fib_entry = fib_entry_post_flag_update_actions(fib_entry,
+                                                               source,
+                                                               bflags);
 
                return (FIB_ENTRY_SRC_FLAG_NONE);
            }
index 5710915..6f5b7fe 100644 (file)
@@ -266,6 +266,7 @@ fib_entry_src_collect_forwarding (fib_node_index_t pl_index,
 {
     fib_entry_src_collect_forwarding_ctx_t *ctx;
     fib_path_ext_t *path_ext;
+    int have_path_ext;
 
     ctx = arg;
 
@@ -285,14 +286,17 @@ fib_entry_src_collect_forwarding (fib_node_index_t pl_index,
     /*
      * get the matching path-extension for the path being visited.
      */
+    have_path_ext = 0;
     vec_foreach(path_ext, ctx->esrc->fes_path_exts)
     {
         if (path_ext->fpe_path_index == path_index)
+        {
+            have_path_ext = 1;
             break;
+        }
     }
     
-    if (NULL != path_ext &&
-        path_ext->fpe_path_index == path_index &&
+    if (have_path_ext &&
         fib_entry_src_valid_out_label(path_ext->fpe_label_stack[0]))
     {
         /*