#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
*/
* 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) \
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
/**
* 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.
/**
* 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
*/
u32 next_hop_sw_if_index,
u32 next_hop_fib_index,
u32 next_hop_weight,
- mpls_label_t *next_hop_label_stack,
+ fib_mpls_label_t *next_hop_label_stack,
fib_route_path_flags_t pf);
/**
* @brief
u32 next_hop_sw_if_index,
u32 next_hop_fib_index,
u32 next_hop_weight,
- mpls_label_t *next_hop_label_stack,
+ fib_mpls_label_t *next_hop_label_stack,
fib_route_path_flags_t pf);
/**
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
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
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
*/
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