X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdpo%2Fdpo.h;h=0eeca67b74bf379e4b390fb2b1cdb5c6de96a425;hb=2303cb1;hp=3290a5d239ea258c15b26077446e0e4d29c00811;hpb=f068c3ed296c49dfbfe17677fc1ad2428fb4e3e4;p=vpp.git diff --git a/src/vnet/dpo/dpo.h b/src/vnet/dpo/dpo.h index 3290a5d239e..0eeca67b74b 100644 --- a/src/vnet/dpo/dpo.h +++ b/src/vnet/dpo/dpo.h @@ -111,8 +111,8 @@ typedef enum dpo_type_t_ { DPO_LOOKUP, DPO_LISP_CP, DPO_CLASSIFY, - DPO_MPLS_LABEL, - DPO_MPLS_DISPOSITION, + DPO_MPLS_DISPOSITION_PIPE, + DPO_MPLS_DISPOSITION_UNIFORM, DPO_MFIB_ENTRY, DPO_INTERFACE_RX, DPO_INTERFACE_TX, @@ -123,6 +123,7 @@ typedef enum dpo_type_t_ { DPO_BIER_IMP, DPO_BIER_DISP_TABLE, DPO_BIER_DISP_ENTRY, + DPO_IP6_LL, DPO_LAST, } __attribute__((packed)) dpo_type_t; @@ -145,8 +146,8 @@ typedef enum dpo_type_t_ { [DPO_REPLICATE] = "dpo-replicate", \ [DPO_LISP_CP] = "dpo-lisp-cp", \ [DPO_CLASSIFY] = "dpo-classify", \ - [DPO_MPLS_LABEL] = "dpo-mpls-label", \ - [DPO_MPLS_DISPOSITION] = "dpo-mpls-diposition", \ + [DPO_MPLS_DISPOSITION_PIPE] = "dpo-mpls-diposition-pipe", \ + [DPO_MPLS_DISPOSITION_UNIFORM] = "dpo-mpls-diposition-uniform", \ [DPO_MFIB_ENTRY] = "dpo-mfib-entry", \ [DPO_INTERFACE_RX] = "dpo-interface-rx", \ [DPO_INTERFACE_TX] = "dpo-interface-tx", \ @@ -157,6 +158,7 @@ typedef enum dpo_type_t_ { [DPO_BIER_IMP] = "bier-imposition", \ [DPO_BIER_DISP_ENTRY] = "bier-disp-entry", \ [DPO_BIER_DISP_TABLE] = "bier-disp-table", \ + [DPO_IP6_LL] = "ip6-link-local", \ } /** @@ -222,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. @@ -371,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 */ @@ -403,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; @@ -444,4 +470,29 @@ extern void dpo_register(dpo_type_t type, extern dpo_type_t dpo_register_new_type(const dpo_vft_t *vft, const char * const * const * nodes); +/** + * @brief Return already stacked up next node index for a given + * child_type/child_proto and parent_type/patent_proto. + * The VLIB graph arc used is taken from the parent and child types + * passed. + * + * @param child_type + * Child DPO type. + * + * @param child_proto + * Child DPO proto + * + * @param parent_type + * Parent DPO type. + * + * @param parent_proto + * Parent DPO proto + * + * @return The VLIB Graph node index + */ +extern u32 +dpo_get_next_node_by_type_and_proto (dpo_type_t child_type, + dpo_proto_t child_proto, + dpo_type_t parent_type, + dpo_proto_t parent_proto); #endif