FIB Interpose Source
[vpp.git] / src / vnet / dpo / dpo.h
index 21a2ae2..0eeca67 100644 (file)
@@ -224,6 +224,14 @@ extern void dpo_lock(dpo_id_t *dpo);
  */
 extern void dpo_unlock(dpo_id_t *dpo);
 
+/**
+ * @brief
+ *  Make an interpose DPO from an original
+ */
+extern void dpo_mk_interpose(const dpo_id_t *original,
+                             const dpo_id_t *parent,
+                             dpo_id_t *clone);
+
 /**
  * @brief Set/create a DPO ID
  * The DPO will be locked.
@@ -373,6 +381,18 @@ typedef u32* (*dpo_get_next_node_t)(const dpo_id_t *dpo);
  */
 typedef u32 (*dpo_get_urpf_t)(const dpo_id_t *dpo);
 
+/**
+ * @brief Called during FIB interposition when the originally
+ * registered DPO is used to 'clone' an instance for interposition
+ * at a particular location in the FIB graph.
+ * The parent is the next DPO in the chain that the clone will
+ * be used instead of. The clone may then choose to stack itself
+ * on the parent.
+ */
+typedef void (*dpo_mk_interpose_t)(const dpo_id_t *original,
+                                   const dpo_id_t *parent,
+                                   dpo_id_t *clone);
+
 /**
  * @brief A virtual function table regisitered for a DPO type
  */
@@ -405,6 +425,10 @@ typedef struct dpo_vft_t_
      * Get uRPF interface
      */
     dpo_get_urpf_t dv_get_urpf;
+    /**
+     * Signal on an interposed child that the parent has changed
+     */
+    dpo_mk_interpose_t dv_mk_interpose;
 } dpo_vft_t;