IP mcast: allow unicast address as a next-hop
[vpp.git] / src / vnet / mfib / mfib_itf.h
index 5f26a47..fe39c89 100644 (file)
@@ -25,7 +25,7 @@
 typedef struct mfib_itf_t_
 {
     /**
-     * @brief Falags on the entry
+     * @brief Forwarding Flags on the entry - checked in the data-path
      */
     mfib_itf_flags_t mfi_flags;
 
@@ -38,22 +38,43 @@ typedef struct mfib_itf_t_
      * The index of the signal in the pending list
      */
     u32 mfi_si;
+
+    /**
+     * A hash table of path-inidices that are contributing flags to this interface.
+     * Since paths with next-hops can be on the same interface and each of those
+     * paths can contribute different flags, we need to maintain the flag
+     * contribution from each path, and use a combination for forwarding.
+     */
+    uword *mfi_hash;
 } mfib_itf_t;
 
+/**
+ * update an interface from a path.
+ * returns 1 if the entry is removed, i.e. has no flags left, as a result
+ * of the update.
+ */
+extern int mfib_itf_update(mfib_itf_t *itf,
+                           fib_node_index_t path_index,
+                           mfib_itf_flags_t mfi_flags);
 
-extern index_t mfib_itf_create(u32 sw_if_index,
+extern index_t mfib_itf_create(fib_node_index_t path_index,
                                mfib_itf_flags_t mfi_flags);
-extern void mfib_itf_delete(mfib_itf_t *mfi);
+
+extern void mfib_itf_delete(mfib_itf_t *itf);
 
 extern u8 *format_mfib_itf(u8 * s, va_list * args);
 
 extern mfib_itf_t *mfib_itf_pool;
 
+/**
+ * Get the MFIB interface representation
+ */
 static inline mfib_itf_t *
 mfib_itf_get (index_t mi)
 {
     return (pool_elt_at_index(mfib_itf_pool, mi));
 }
+
 static inline index_t
 mfib_itf_get_index (const mfib_itf_t *mfi)
 {