FIB: recusrive paths must lock the table to prevent its deletion 42/14942/4
authorNeale Ranns <neale.ranns@cisco.com>
Tue, 11 Sep 2018 02:14:07 +0000 (19:14 -0700)
committerDamjan Marion <dmarion@me.com>
Tue, 25 Sep 2018 19:47:53 +0000 (19:47 +0000)
Change-Id: I958bf057be751dc7b3a0d93080021b3addc405b7
Signed-off-by: Neale Ranns <neale.ranns@cisco.com>
src/vnet/fib/fib_path.c
src/vnet/fib/fib_table.c

index 226de2a..88dddbc 100644 (file)
@@ -879,6 +879,9 @@ fib_path_unresolve (fib_path_t *path)
            fib_table_entry_special_remove(path->recursive.fp_tbl_id,
                                           fib_entry_get_prefix(path->fp_via_fib),
                                           FIB_SOURCE_RR);
+            fib_table_unlock(path->recursive.fp_tbl_id,
+                             dpo_proto_to_fib(path->fp_nh_proto),
+                             FIB_SOURCE_RR);
            path->fp_via_fib = FIB_NODE_INDEX_INVALID;
        }
        break;
@@ -1897,6 +1900,9 @@ fib_path_resolve (fib_node_index_t path_index)
            fib_prefix_from_ip46_addr(&path->recursive.fp_nh.fp_ip, &pfx);
        }
 
+        fib_table_lock(path->recursive.fp_tbl_id,
+                       dpo_proto_to_fib(path->fp_nh_proto),
+                       FIB_SOURCE_RR);
        fei = fib_table_entry_special_add(path->recursive.fp_tbl_id,
                                          &pfx,
                                          FIB_SOURCE_RR,
index d8e8d63..47f2011 100644 (file)
@@ -1269,6 +1269,9 @@ fib_table_lock (u32 fib_index,
     fib_table_t *fib_table;
 
     fib_table = fib_table_get(fib_index, proto);
+
+    ASSERT(fib_table->ft_locks[source] < (0xffff - 1));
+
     fib_table->ft_locks[source]++;
     fib_table->ft_locks[FIB_TABLE_TOTAL_LOCKS]++;
 }