#define MFIB_TABLE_N_LOCKS (MFIB_N_SOURCES+1)
#define MFIB_TABLE_TOTAL_LOCKS MFIB_N_SOURCES
+/**
+ * Flags for the source data
+ */
+typedef enum mfib_table_attribute_t_ {
+ /**
+ * Marker. Add new values after this one.
+ */
+ MFIB_TABLE_ATTRIBUTE_FIRST,
+ /**
+ * the table is currently resync-ing
+ */
+ MFIB_TABLE_ATTRIBUTE_RESYNC = MFIB_TABLE_ATTRIBUTE_FIRST,
+ /**
+ * Marker. add new entries before this one.
+ */
+ MFIB_TABLE_ATTRIBUTE_LAST = MFIB_TABLE_ATTRIBUTE_RESYNC,
+} mfib_table_attribute_t;
+
+#define MFIB_TABLE_ATTRIBUTE_MAX (MFIB_TABLE_ATTRIBUTE_LAST+1)
+
+#define MFIB_TABLE_ATTRIBUTES { \
+ [MFIB_TABLE_ATTRIBUTE_RESYNC] = "resync", \
+}
+
+#define FOR_EACH_MFIB_TABLE_ATTRIBUTE(_item) \
+ for (_item = MFIB_TABLE_ATTRIBUTE_FIRST; \
+ _item < MFIB_TABLE_ATTRIBUTE_MAX; \
+ _item++)
+
+typedef enum mfib_table_flags_t_ {
+ MFIB_TABLE_FLAG_NONE = 0,
+ MFIB_TABLE_FLAG_RESYNC = (1 << MFIB_TABLE_ATTRIBUTE_RESYNC),
+} __attribute__ ((packed)) mfib_table_flags_t;
+
+extern u8* format_mfib_table_flags(u8 *s, va_list *args);
+
/**
* @brief
* A protocol Independent IP multicast FIB table
*/
fib_protocol_t mft_proto;
+ /**
+ * table falgs
+ */
+ mfib_table_flags_t mft_flags;
+
/**
* number of locks on the table
*/
*/
u32 mft_table_id;
+ /**
+ * resync epoch
+ */
+ u32 mft_epoch;
+
/**
* Index into FIB vector.
*/
extern fib_node_index_t mfib_table_entry_path_update(u32 fib_index,
const mfib_prefix_t *prefix,
mfib_source_t source,
- const fib_route_path_t *rpath,
- mfib_itf_flags_t flags);
+ const fib_route_path_t *rpath);
+extern fib_node_index_t mfib_table_entry_paths_update(u32 fib_index,
+ const mfib_prefix_t *prefix,
+ mfib_source_t source,
+ const fib_route_path_t *rpath);
/**
* @brief
const mfib_prefix_t *prefix,
mfib_source_t source,
const fib_route_path_t *paths);
+extern void mfib_table_entry_paths_remove(u32 fib_index,
+ const mfib_prefix_t *prefix,
+ mfib_source_t source,
+ const fib_route_path_t *paths);
fib_protocol_t proto,
mfib_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 mfib_table_mark(u32 fib_index,
+ fib_protocol_t proto,
+ mfib_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 mfib_table_sweep(u32 fib_index,
+ fib_protocol_t proto,
+ mfib_source_t source);
+
/**
* @brief
* Get the index of the FIB bound to the interface
extern u32 mfib_table_get_index_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 mfib_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 u32 mfib_table_find(fib_protocol_t proto, u32 table_id);
+/**
+ * @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 mfib_table_get_table_id(u32 fib_index, fib_protocol_t proto);
/**
* @brief
/**
* @brief Call back function when walking entries in a FIB table
*/
-typedef int (*mfib_table_walk_fn_t)(fib_node_index_t fei,
- void *ctx);
+typedef walk_rc_t (*mfib_table_walk_fn_t)(fib_node_index_t fei,
+ void *ctx);
/**
* @brief Walk all entries in a FIB table