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,
- DPO_L2_BRIDGE,
+ DPO_DVR,
DPO_L3_PROXY,
DPO_BIER_TABLE,
DPO_BIER_FMASK,
DPO_BIER_IMP,
DPO_BIER_DISP_TABLE,
DPO_BIER_DISP_ENTRY,
+ DPO_IP6_LL,
+ DPO_PW_CW,
DPO_LAST,
} __attribute__((packed)) 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_MFIB_ENTRY] = "dpo-mfib_entry", \
+ [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", \
- [DPO_L2_BRIDGE] = "dpo-l2-bridge", \
+ [DPO_DVR] = "dpo-dvr", \
[DPO_L3_PROXY] = "dpo-l3-proxy", \
[DPO_BIER_TABLE] = "bier-table", \
[DPO_BIER_FMASK] = "bier-fmask", \
[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", \
+ [DPO_PW_CW] = "PW-CW", \
}
/**
*/
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.
* VLIB graph arcs are created, from the child_node passed.
*
* @param child_node
- * The VLIB grpah node index to create an arc from to the parent
+ * The VLIB graph node index to create an arc from to the parent
*
* @param dpo
* This is the DPO to stack and set.
*/
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
*/
* 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;
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