fib: Allow the creation of new source on the API
[vpp.git] / src / vnet / fib / fib_table.h
index ffad3c4..11137e1 100644 (file)
 #include <vnet/mpls/mpls.h>
 #include <vnet/mpls/packet.h>
 
-/**
- * Keep a lock per-source and a total
- */
-#define FIB_TABLE_N_LOCKS (FIB_SOURCE_MAX+1)
-#define FIB_TABLE_TOTAL_LOCKS FIB_SOURCE_MAX
-
 /**
  * Flags for the source data
  */
@@ -40,16 +34,21 @@ typedef enum fib_table_attribute_t_ {
      * the table is for IP6 link local addresses
      */
     FIB_TABLE_ATTRIBUTE_IP6_LL = FIB_TABLE_ATTRIBUTE_FIRST,
+    /**
+     * the table is currently resync-ing
+     */
+    FIB_TABLE_ATTRIBUTE_RESYNC,
     /**
      * Marker. add new entries before this one.
      */
-    FIB_TABLE_ATTRIBUTE_LAST = FIB_TABLE_ATTRIBUTE_IP6_LL,
+    FIB_TABLE_ATTRIBUTE_LAST = FIB_TABLE_ATTRIBUTE_RESYNC,
 } fib_table_attribute_t;
 
 #define FIB_TABLE_ATTRIBUTE_MAX (FIB_TABLE_ATTRIBUTE_LAST+1)
 
 #define FIB_TABLE_ATTRIBUTES {                  \
     [FIB_TABLE_ATTRIBUTE_IP6_LL]  = "ip6-ll",   \
+    [FIB_TABLE_ATTRIBUTE_RESYNC]  = "resync",    \
 }
 
 #define FOR_EACH_FIB_TABLE_ATTRIBUTE(_item)            \
@@ -60,8 +59,11 @@ typedef enum fib_table_attribute_t_ {
 typedef enum fib_table_flags_t_ {
     FIB_TABLE_FLAG_NONE   = 0,
     FIB_TABLE_FLAG_IP6_LL  = (1 << FIB_TABLE_ATTRIBUTE_IP6_LL),
+    FIB_TABLE_FLAG_RESYNC  = (1 << FIB_TABLE_ATTRIBUTE_RESYNC),
 } __attribute__ ((packed)) fib_table_flags_t;
 
+extern u8* format_fib_table_flags(u8 *s, va_list *args);
+
 /**
  * @brief 
  *   A protocol Independent FIB table
@@ -81,7 +83,8 @@ typedef struct fib_table_t_
     /**
      * per-source number of locks on the table
      */
-    u16 ft_locks[FIB_TABLE_N_LOCKS];
+    u32 *ft_locks;
+    u32 ft_total_locks;
 
     /**
      * Table ID (hash key) for this FIB.
@@ -101,13 +104,18 @@ typedef struct fib_table_t_
     /**
      * Per-source route counters
      */
-    u32 ft_src_route_counts[FIB_SOURCE_MAX];
+    u32 *ft_src_route_counts;
 
     /**
      * Total route counters
      */
     u32 ft_total_route_counts;
 
+    /**
+     * Epoch - number of resyncs performed
+     */
+    u32 ft_epoch;
+
     /**
      * Table description
      */
@@ -594,6 +602,17 @@ extern void fib_table_entry_delete(u32 fib_index,
 extern void fib_table_entry_delete_index(fib_node_index_t entry_index,
                                         fib_source_t source);
 
+/**
+ * @brief
+ *  Return the stats index for a FIB entry
+ * @param fib_index
+ *  The table's FIB index
+ * @param prefix
+ *  The entry's prefix's
+ */
+extern u32 fib_table_entry_get_stats_index(u32 fib_index,
+                                           const fib_prefix_t *prefix);
+
 /**
  * @brief
  *  Flush all entries from a table for the source
@@ -611,6 +630,46 @@ extern void fib_table_flush(u32 fib_index,
                            fib_protocol_t proto,
                            fib_source_t source);
 
+/**
+ * @brief
+ *  Resync all entries from a table for the source
+ *  this is the mark part of the mark and sweep algorithm.
+ *  All entries in this FIB that are sourced by 'source' are marked
+ *  as stale.
+ *
+ * @param fib_index
+ *  The index of the FIB
+ *
+ * @paran proto
+ *  The protocol of the entries in the table
+ *
+ * @param source
+ *  the source to flush
+ */
+extern void fib_table_mark(u32 fib_index,
+                           fib_protocol_t proto,
+                           fib_source_t source);
+
+/**
+ * @brief
+ *  Signal that the table has converged, i.e. all updates are complete.
+ *  this is the sweep part of the mark and sweep algorithm.
+ *  All entries in this FIB that are sourced by 'source' and marked
+ *  as stale are flushed.
+ *
+ * @param fib_index
+ *  The index of the FIB
+ *
+ * @paran proto
+ *  The protocol of the entries in the table
+ *
+ * @param source
+ *  the source to flush
+ */
+extern void fib_table_sweep(u32 fib_index,
+                            fib_protocol_t proto,
+                            fib_source_t source);
+
 /**
  * @brief
  *  Get the index of the FIB bound to the interface
@@ -643,6 +702,21 @@ extern u32 fib_table_get_index_for_sw_if_index(fib_protocol_t proto,
 extern u32 fib_table_get_table_id_for_sw_if_index(fib_protocol_t proto,
                                                  u32 sw_if_index);
 
+/**
+ * @brief
+ *  Get the Table-ID of the FIB from protocol and index
+ *
+ * @param fib_index
+ *  The FIB index
+ *
+ * @paran proto
+ *  The protocol of the FIB (and thus the entries therein)
+ *
+ * @return fib_index
+ *  The tableID of the FIB
+ */
+extern u32 fib_table_get_table_id(u32 fib_index, fib_protocol_t proto);
+
 /**
  * @brief
  *  Get the index of the FIB for a Table-ID. This DOES NOT create the
@@ -866,6 +940,17 @@ extern void fib_table_walk(u32 fib_index,
                            fib_table_walk_fn_t fn,
                            void *ctx);
 
+/**
+ * @brief Walk all entries in a FIB table
+ * N.B: This is NOT safe to deletes. If you need to delete walk the whole
+ * table and store elements in a vector, then delete the elements
+ */
+extern void fib_table_walk_w_src(u32 fib_index,
+                                 fib_protocol_t proto,
+                                 fib_source_t src,
+                                 fib_table_walk_fn_t fn,
+                                 void *ctx);
+
 /**
  * @brief Walk all entries in a sub-tree FIB table. The 'root' paraneter
  * is the prefix at the root of the sub-tree.
@@ -883,4 +968,12 @@ extern void fib_table_sub_tree_walk(u32 fib_index,
  */
 extern u8 *format_fib_table_memory(u8 *s, va_list *args);
 
+/**
+ * Debug function
+ */
+#if CLIB_DEBUG > 0
+extern void fib_table_assert_empty(const fib_table_t *fib_table);
+#endif
+
+
 #endif