FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
|
Go to the source code of this file.
Data Structures | |
struct | dpo_id_t_ |
The identity of a DPO is a combination of its type and its instance number/index of objects of that type. More... | |
struct | dpo_vft_t_ |
A virtual function table regisitered for a DPO type. More... | |
Macros | |
#define | INDEX_INVALID ((index_t)(~0)) |
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not. More... | |
#define | DPO_PROTO_NUM ((dpo_proto_t)(DPO_PROTO_NSH+1)) |
#define | DPO_PROTO_NONE ((dpo_proto_t)(DPO_PROTO_NUM+1)) |
#define | DPO_PROTOS |
#define | FOR_EACH_DPO_PROTO(_proto) |
#define | DPO_TYPE_NUM DPO_LAST |
#define | DPO_TYPES |
#define | DPO_INVALID |
An initialiser for DPOs declared on the stack. More... | |
#define | dpo_pool_barrier_sync(VM, P, YESNO) |
Barrier sync if a dpo pool is about to expand. More... | |
#define | dpo_pool_barrier_release(VM, YESNO) if ((YESNO)) vlib_worker_thread_barrier_release((VM)); |
Release barrier sync after dpo pool expansion. More... | |
Typedefs | |
typedef u32 | index_t |
A Data-Path Object is an object that represents actions that are applied to packets are they are switched through VPP's data-path. More... | |
typedef enum dpo_proto_t_ | dpo_proto_t |
Data path protocol. More... | |
typedef enum dpo_type_t_ | dpo_type_t |
Common types of data-path objects New types can be dynamically added using dpo_register_new_type() More... | |
typedef struct dpo_id_t_ | dpo_id_t |
The identity of a DPO is a combination of its type and its instance number/index of objects of that type. More... | |
typedef void(* | dpo_lock_fn_t) (dpo_id_t *dpo) |
A lock function registered for a DPO type. More... | |
typedef void(* | dpo_unlock_fn_t) (dpo_id_t *dpo) |
An unlock function registered for a DPO type. More... | |
typedef void(* | dpo_mem_show_t) (void) |
An memory usage show command. More... | |
typedef u32 *(* | dpo_get_next_node_t) (const dpo_id_t *dpo) |
Given a DPO instance return a vector of node indices that the type/instance will use. More... | |
typedef u32(* | dpo_get_urpf_t) (const dpo_id_t *dpo) |
Given a DPO instance return an interface that can be used in an uRPF check. More... | |
typedef u16(* | dpo_get_mtu_t) (const dpo_id_t *dpo) |
Given a DPO instance return the MTU. More... | |
typedef void(* | dpo_mk_interpose_t) (const dpo_id_t *original, const dpo_id_t *parent, dpo_id_t *clone) |
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. More... | |
typedef struct dpo_vft_t_ | dpo_vft_t |
A virtual function table regisitered for a DPO type. More... | |
Enumerations | |
enum | dpo_proto_t_ { DPO_PROTO_IP4 = 0, DPO_PROTO_IP6, DPO_PROTO_MPLS, DPO_PROTO_ETHERNET, DPO_PROTO_BIER, DPO_PROTO_NSH } |
Data path protocol. More... | |
enum | dpo_type_t_ { DPO_FIRST, DPO_DROP, DPO_IP_NULL, DPO_PUNT, DPO_LOAD_BALANCE, DPO_REPLICATE, DPO_ADJACENCY, DPO_ADJACENCY_INCOMPLETE, DPO_ADJACENCY_MIDCHAIN, DPO_ADJACENCY_GLEAN, DPO_ADJACENCY_MCAST, DPO_ADJACENCY_MCAST_MIDCHAIN, DPO_RECEIVE, DPO_LOOKUP, DPO_LISP_CP, DPO_CLASSIFY, DPO_MPLS_DISPOSITION_PIPE, DPO_MPLS_DISPOSITION_UNIFORM, DPO_MFIB_ENTRY, DPO_INTERFACE_RX, DPO_INTERFACE_TX, 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 } |
Common types of data-path objects New types can be dynamically added using dpo_register_new_type() More... | |
Functions | |
STATIC_ASSERT (sizeof(dpo_id_t)<=sizeof(u64), "DPO ID is greater than sizeof u64 " "atomic updates need to be revisited") | |
static int | dpo_id_is_valid (const dpo_id_t *dpoi) |
Return true if the DPO object is valid, i.e. More... | |
dpo_proto_t | vnet_link_to_dpo_proto (vnet_link_t linkt) |
void | dpo_lock (dpo_id_t *dpo) |
Take a reference counting lock on the DPO. More... | |
void | dpo_unlock (dpo_id_t *dpo) |
Release a reference counting lock on the DPO. More... | |
void | dpo_mk_interpose (const dpo_id_t *original, const dpo_id_t *parent, dpo_id_t *clone) |
Make an interpose DPO from an original. More... | |
void | dpo_set (dpo_id_t *dpo, dpo_type_t type, dpo_proto_t proto, index_t index) |
Set/create a DPO ID The DPO will be locked. More... | |
void | dpo_reset (dpo_id_t *dpo) |
reset a DPO ID The DPO will be unlocked. More... | |
int | dpo_cmp (const dpo_id_t *dpo1, const dpo_id_t *dpo2) |
compare two DPOs for equality More... | |
void | dpo_copy (dpo_id_t *dst, const dpo_id_t *src) |
atomic copy a data-plane object. More... | |
int | dpo_is_adj (const dpo_id_t *dpo) |
Return TRUE is the DPO is any type of adjacency. More... | |
u8 * | format_dpo_id (u8 *s, va_list *args) |
Format a DPO_id_t oject. More... | |
u8 * | format_dpo_type (u8 *s, va_list *args) |
format a DPO type More... | |
u8 * | format_dpo_proto (u8 *s, va_list *args) |
format a DPO protocol More... | |
vnet_link_t | dpo_proto_to_link (dpo_proto_t dp) |
format a DPO protocol More... | |
void | dpo_stack (dpo_type_t child_type, dpo_proto_t child_proto, dpo_id_t *dpo, const dpo_id_t *parent_dpo) |
Set and stack a DPO. More... | |
void | dpo_stack_from_node (u32 child_node, dpo_id_t *dpo, const dpo_id_t *parent) |
Set and stack a DPO. More... | |
u32 | dpo_get_urpf (const dpo_id_t *dpo) |
Get a uRPF interface for the DPO. More... | |
u16 | dpo_get_mtu (const dpo_id_t *dpo) |
Get the MTU DPO. More... | |
void | dpo_register (dpo_type_t type, const dpo_vft_t *vft, const char *const *const *nodes) |
For a given DPO type Register: More... | |
dpo_type_t | dpo_register_new_type (const dpo_vft_t *vft, const char *const *const *nodes) |
Create and register a new DPO type. More... | |
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) |
Return already stacked up next node index for a given child_type/child_proto and parent_type/patent_proto. More... | |
#define DPO_INVALID |
An initialiser for DPOs declared on the stack.
Thenext node is set to 0 since VLIB graph nodes should set 0 index to drop.
#define dpo_pool_barrier_release | ( | VM, | |
YESNO | |||
) | if ((YESNO)) vlib_worker_thread_barrier_release((VM)); |
Release barrier sync after dpo pool expansion.
VM | vlib_main_t pointer, must be &vlib_global_main |
YESNO | typically a u8, 1 => release required 0 => no release required |
#define dpo_pool_barrier_sync | ( | VM, | |
P, | |||
YESNO | |||
) |
Barrier sync if a dpo pool is about to expand.
VM | (output) vlib_main_t *, invariably &vlib_global_main |
P | pool pointer |
YESNO | (output) typically a u8, 1 => expand will occur, worker barrier held 0 => no expand, barrier not held |
#define DPO_PROTO_NONE ((dpo_proto_t)(DPO_PROTO_NUM+1)) |
#define DPO_PROTO_NUM ((dpo_proto_t)(DPO_PROTO_NSH+1)) |
#define DPO_PROTOS |
#define DPO_TYPES |
#define FOR_EACH_DPO_PROTO | ( | _proto | ) |
#define INDEX_INVALID ((index_t)(~0)) |
The identity of a DPO is a combination of its type and its instance number/index of objects of that type.
typedef void(* dpo_lock_fn_t) (dpo_id_t *dpo) |
typedef void(* dpo_mem_show_t) (void) |
typedef void(* dpo_mk_interpose_t) (const dpo_id_t *original, const dpo_id_t *parent, dpo_id_t *clone) |
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 enum dpo_proto_t_ dpo_proto_t |
Data path protocol.
Actions performed on packets in the data-plane can be described and represented by protocol independent objects, i.e. ADJACENCY, but the spceifics actions required during ADJACENCY processing can be protocol dependent. For example, the adjacency rewrite node performs a ip4 checksum calculation, ip6 and MPLS do not, all 3 perform a TTL decrement. The VLIB graph nodes are thus protocol dependent, and thus each graph edge/arc is too. When programming a DPO's next node arc from child to parent it is thus required to know the parent's data-path protocol so the correct arc index can be used.
typedef enum dpo_type_t_ dpo_type_t |
Common types of data-path objects New types can be dynamically added using dpo_register_new_type()
typedef void(* dpo_unlock_fn_t) (dpo_id_t *dpo) |
typedef struct dpo_vft_t_ dpo_vft_t |
A virtual function table regisitered for a DPO type.
A Data-Path Object is an object that represents actions that are applied to packets are they are switched through VPP's data-path.
The DPO can be considered to be like is a base class that is specialised by other objects to provide concreate actions
The VLIB graph nodes are graph of DPO types, the DPO graph is a graph of instances.
An index for adjacencies. Alas 'C' is not typesafe enough to b0rk when a u32 is used instead of an index_t. However, for us humans, we can glean much more intent from the declaration foo barindex_t t); than we can from foo bar(u32 t);
enum dpo_proto_t_ |
Data path protocol.
Actions performed on packets in the data-plane can be described and represented by protocol independent objects, i.e. ADJACENCY, but the spceifics actions required during ADJACENCY processing can be protocol dependent. For example, the adjacency rewrite node performs a ip4 checksum calculation, ip6 and MPLS do not, all 3 perform a TTL decrement. The VLIB graph nodes are thus protocol dependent, and thus each graph edge/arc is too. When programming a DPO's next node arc from child to parent it is thus required to know the parent's data-path protocol so the correct arc index can be used.
Enumerator | |
---|---|
DPO_PROTO_IP4 | |
DPO_PROTO_IP6 | |
DPO_PROTO_MPLS | |
DPO_PROTO_ETHERNET | |
DPO_PROTO_BIER | |
DPO_PROTO_NSH |
enum dpo_type_t_ |
Common types of data-path objects New types can be dynamically added using dpo_register_new_type()
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 | ||
) |
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.
child_type | Child DPO type. |
child_proto | Child DPO proto |
parent_type | Parent DPO type. |
parent_proto | Parent DPO proto |
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.
|
inlinestatic |
int dpo_is_adj | ( | const dpo_id_t * | dpo | ) |
void dpo_lock | ( | dpo_id_t * | dpo | ) |
vnet_link_t dpo_proto_to_link | ( | dpo_proto_t | dp | ) |
void dpo_register | ( | dpo_type_t | type, |
const dpo_vft_t * | vft, | ||
const char *const *const * | nodes | ||
) |
For a given DPO type Register:
type | The type being registered. |
vft | The virtual function table to register for the type. |
nodes | The string description of the per-protocol VLIB graph nodes. |
Definition at line 329 of file dpo.c.
dpo_type_t dpo_register_new_type | ( | const dpo_vft_t * | vft, |
const char *const *const * | nodes | ||
) |
Create and register a new DPO type.
This can be used by plugins to create new DPO types that are not listed in dpo_type_t enum
vft | The virtual function table to register for the type. |
nodes | The string description of the per-protocol VLIB graph nodes. |
Definition at line 349 of file dpo.c.
void dpo_reset | ( | dpo_id_t * | dpo | ) |
void dpo_set | ( | dpo_id_t * | dpo, |
dpo_type_t | type, | ||
dpo_proto_t | proto, | ||
index_t | index | ||
) |
void dpo_stack | ( | dpo_type_t | child_type, |
dpo_proto_t | child_proto, | ||
dpo_id_t * | dpo, | ||
const dpo_id_t * | parent | ||
) |
Set and stack a DPO.
The DPO passed is set to the parent DPO and the necessary VLIB graph arcs are created. The child_type and child_proto are used to get the VLID nodes from which the arcs are added.
child_type | Child DPO type. |
child_proto | Child DPO proto |
@parem dpo This is the DPO to stack and set.
@paren parent_dpo The parent DPO to stack onto.
Set and stack a DPO.
The VLIB graph arc used is taken from the parent and child types passed.
Definition at line 535 of file dpo.c.
Set and stack a DPO.
The DPO passed is set to the parent DPO and the necessary VLIB graph arcs are created, from the child_node passed.
child_node | The VLIB graph node index to create an arc from to the parent |
dpo | This is the DPO to stack and set. |
parent_dpo | The parent DPO to stack onto. |
Set and stack a DPO.
A new VLIB graph arc is created from the child node passed to the nodes registered by the parent. The VLIB infra will ensure this arc is added only once.
Definition at line 550 of file dpo.c.
void dpo_unlock | ( | dpo_id_t * | dpo | ) |
STATIC_ASSERT | ( | sizeof(dpo_id_t)<=sizeof(u64) | , |
"DPO ID is greater than sizeof u64 " "atomic updates need to be revisited" | |||
) |
dpo_proto_t vnet_link_to_dpo_proto | ( | vnet_link_t | linkt | ) |