ipsec: IPSec protection for multi-point tunnel interfaces
[vpp.git] / src / vnet / adj / adj_midchain.h
index 27ca1d3..1f5deae 100644 (file)
  * @param adj_index
  *  The index of the neighbour adjacency.
  *
- * @param post_rewrite_node
- *  The VLIB graph node that provides the post-encap fixup.
- *  where 'fixup' is e.g., correcting chksum, length, etc.
+ * @param fixup
+ *  The function that will be invoked at paket switch time to 'fixup'
+ *  the rewrite applied with necessary per-packet info (i.e. length, checksums).
+ * @param fixup_data
+ *  Context data set by the caller that is provided as an argument in the
+ *  fixup function.
+ *
+ * @param flags
+ *  Flags controlling the adjacency behaviour
  *
  * @param rewrite
  *  The rewrite.
  */
 extern void adj_nbr_midchain_update_rewrite(adj_index_t adj_index,
                                            adj_midchain_fixup_t fixup,
+                                            const void *fixup_data,
                                            adj_flags_t flags,
                                            u8 *rewrite);
 
 /**
  * @brief
  *  [re]stack a midchain. 'Stacking' is the act of forming parent-child
- *  relationships in the data-plane graph.
+ *  relationships in the data-plane graph. Do NOT use this function to
+ *  stack on a DPO type that might form a loop.
  *
  * @param adj_index
  *  The index of the midchain to stack
@@ -57,6 +65,25 @@ extern void adj_nbr_midchain_update_rewrite(adj_index_t adj_index,
 extern void adj_nbr_midchain_stack(adj_index_t adj_index,
                                   const dpo_id_t *dpo);
 
+/**
+ * @brief
+ *  [re]stack a midchain. 'Stacking' is the act of forming parent-child
+ *  relationships in the data-plane graph. Since function performs recursive
+ *  loop detection.
+ *
+ * @param adj_index
+ *  The index of the midchain to stack
+ *
+ * @param fei
+ *  The FIB entry to stack on
+ *
+ * @param fct
+ *  The chain type to use from the fib entry fowarding
+ */
+extern void adj_nbr_midchain_stack_on_fib_entry(adj_index_t adj_index,
+                                                fib_node_index_t fei,
+                                                fib_forward_chain_type_t fct);
+
 /**
  * @brief
  *  unstack a midchain. This will break the chain between the midchain and
@@ -67,6 +94,18 @@ extern void adj_nbr_midchain_stack(adj_index_t adj_index,
  */
 extern void adj_nbr_midchain_unstack(adj_index_t adj_index);
 
+/**
+ * @brief descend the FIB graph looking for loops
+ *
+ * @param ai
+ *  The adj index to traverse
+ *
+ * @param entry_indicies)
+ *  A pointer to a vector of FIB entries already visited.
+ */
+extern int adj_ndr_midchain_recursive_loop_detect(adj_index_t ai,
+                                                  fib_node_index_t **entry_indicies);
+
 /**
  * @brief
  *  Module initialisation
@@ -79,4 +118,25 @@ extern void adj_midchain_module_init(void);
  */
 extern u8* format_adj_midchain(u8* s, va_list *ap);
 
+/**
+ * @brief
+ *  create/attach a midchain delegate and stack it on the prefix passed
+ * @param ai - the index of the adjacency to stack
+ * @param fib_index - The FIB index of the prefix on which to stack
+ * @param pfx - The prefix on which to stack
+ */
+extern void adj_midchain_delegate_stack(adj_index_t ai,
+                                        u32 fib_index,
+                                        const fib_prefix_t *pfx);
+
+/**
+ * @brief restack a midchain delegate
+ */
+extern void adj_midchain_delegate_restack(adj_index_t ai);
+
+/**
+ * @brief unstack a midchain delegate (this stacks it on a drop)
+ */
+extern void adj_midchain_delegate_unstack(adj_index_t ai);
+
 #endif