X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fadj%2Fadj_midchain.h;h=5fb0ee8efb3334942dde0de29a213bcdb2c50ab1;hb=a91cb4590;hp=65892314f409a8edb03b43556da17b814642ee92;hpb=db14f5aff69311d13a0a90baa3567e92f3faa783;p=vpp.git diff --git a/src/vnet/adj/adj_midchain.h b/src/vnet/adj/adj_midchain.h index 65892314f40..5fb0ee8efb3 100644 --- a/src/vnet/adj/adj_midchain.h +++ b/src/vnet/adj/adj_midchain.h @@ -50,10 +50,32 @@ extern void adj_nbr_midchain_update_rewrite(adj_index_t adj_index, adj_flags_t flags, u8 *rewrite); +/** + * @brief + * Return the adjacency's next node to its default value + * + * @param adj_index + * The index of the neighbour adjacency. + */ +extern void adj_nbr_midchain_reset_next_node(adj_index_t adj_index); + +/** + * @brief + * Update the VLIB node to which packets are sent post processing + * + * @param adj_index + * The index of the neighbour adjacency. + * + * @param node node-index to send to + */ +extern void adj_nbr_midchain_update_next_node(adj_index_t adj_index, + u32 node_index); + /** * @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 @@ -64,6 +86,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 @@ -74,6 +115,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 @@ -86,4 +139,27 @@ 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); + +extern u8 adj_is_midchain (adj_index_t ai); + #endif