FD.io VPP  v19.04.4-rc0-5-ge88582fac
Vector Packet Processing
dpo.h File Reference
+ Include dependency graph for dpo.h:

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...
 

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 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_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...
 
u8format_dpo_id (u8 *s, va_list *args)
 Format a DPO_id_t oject More...
 
u8format_dpo_type (u8 *s, va_list *args)
 format a DPO type More...
 
u8format_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...
 
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...
 

Macro Definition Documentation

◆ DPO_INVALID

#define DPO_INVALID
Value:
{ \
.dpoi_type = DPO_FIRST, \
.dpoi_proto = DPO_PROTO_NONE, \
.dpoi_index = INDEX_INVALID, \
.dpoi_next_node = 0, \
}
#define DPO_PROTO_NONE
Definition: dpo.h:71
A non-zero value first so we can spot unitialisation errors.
Definition: dpo.h:95
#define INDEX_INVALID
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not...
Definition: dpo.h:47

An initialiser for DPOs declared on the stack.

Thenext node is set to 0 since VLIB graph nodes should set 0 index to drop.

Definition at line 195 of file dpo.h.

◆ DPO_PROTO_NONE

#define DPO_PROTO_NONE   ((dpo_proto_t)(DPO_PROTO_NUM+1))

Definition at line 71 of file dpo.h.

◆ DPO_PROTO_NUM

#define DPO_PROTO_NUM   ((dpo_proto_t)(DPO_PROTO_NSH+1))

Definition at line 70 of file dpo.h.

◆ DPO_PROTOS

#define DPO_PROTOS
Value:
{ \
[DPO_PROTO_IP4] = "ip4", \
[DPO_PROTO_IP6] = "ip6", \
[DPO_PROTO_ETHERNET] = "ethernet", \
[DPO_PROTO_MPLS] = "mpls", \
[DPO_PROTO_NSH] = "nsh", \
[DPO_PROTO_BIER] = "bier", \
}

Definition at line 73 of file dpo.h.

◆ DPO_TYPE_NUM

#define DPO_TYPE_NUM   DPO_LAST

Definition at line 130 of file dpo.h.

◆ DPO_TYPES

#define DPO_TYPES
Value:
{ \
[DPO_FIRST] = "dpo-invalid", \
[DPO_DROP] = "dpo-drop", \
[DPO_IP_NULL] = "dpo-ip-null", \
[DPO_PUNT] = "dpo-punt", \
[DPO_ADJACENCY] = "dpo-adjacency", \
[DPO_ADJACENCY_INCOMPLETE] = "dpo-adjacency-incomplete", \
[DPO_ADJACENCY_MIDCHAIN] = "dpo-adjacency-midcahin", \
[DPO_ADJACENCY_GLEAN] = "dpo-glean", \
[DPO_ADJACENCY_MCAST] = "dpo-adj-mcast", \
[DPO_ADJACENCY_MCAST_MIDCHAIN] = "dpo-adj-mcast-midchain", \
[DPO_RECEIVE] = "dpo-receive", \
[DPO_LOOKUP] = "dpo-lookup", \
[DPO_LOAD_BALANCE] = "dpo-load-balance", \
[DPO_REPLICATE] = "dpo-replicate", \
[DPO_LISP_CP] = "dpo-lisp-cp", \
[DPO_CLASSIFY] = "dpo-classify", \
[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_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", \
}
Definition: dpo.h:98
load-balancing over a choice of [un]equal cost paths
Definition: dpo.h:102
A non-zero value first so we can spot unitialisation errors.
Definition: dpo.h:95
Definition: dpo.h:119
Definition: dpo.h:96

Definition at line 132 of file dpo.h.

◆ FOR_EACH_DPO_PROTO

#define FOR_EACH_DPO_PROTO (   _proto)
Value:
for (_proto = DPO_PROTO_IP4; \
_proto <= DPO_PROTO_NSH; \
_proto++)

Definition at line 82 of file dpo.h.

◆ INDEX_INVALID

#define INDEX_INVALID   ((index_t)(~0))

Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not.

Definition at line 47 of file dpo.h.

Typedef Documentation

◆ dpo_get_next_node_t

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.

Definition at line 376 of file dpo.h.

◆ dpo_get_urpf_t

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.

Definition at line 382 of file dpo.h.

◆ dpo_id_t

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.

◆ dpo_lock_fn_t

typedef void(* dpo_lock_fn_t) (dpo_id_t *dpo)

A lock function registered for a DPO type.

Definition at line 360 of file dpo.h.

◆ dpo_mem_show_t

typedef void(* dpo_mem_show_t) (void)

An memory usage show command.

Definition at line 370 of file dpo.h.

◆ dpo_mk_interpose_t

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.

Definition at line 392 of file dpo.h.

◆ dpo_proto_t

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.

◆ dpo_type_t

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()

◆ dpo_unlock_fn_t

typedef void(* dpo_unlock_fn_t) (dpo_id_t *dpo)

An unlock function registered for a DPO type.

Definition at line 365 of file dpo.h.

◆ dpo_vft_t

typedef struct dpo_vft_t_ dpo_vft_t

A virtual function table regisitered for a DPO type.

◆ index_t

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.

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);

Definition at line 41 of file dpo.h.

Enumeration Type Documentation

◆ 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 

Definition at line 60 of file dpo.h.

◆ dpo_type_t_

Common types of data-path objects New types can be dynamically added using dpo_register_new_type()

Enumerator
DPO_FIRST 

A non-zero value first so we can spot unitialisation errors.

DPO_DROP 
DPO_IP_NULL 
DPO_PUNT 
DPO_LOAD_BALANCE 

load-balancing over a choice of [un]equal cost paths

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_LAST 

Definition at line 91 of file dpo.h.

Function Documentation

◆ dpo_cmp()

int dpo_cmp ( const dpo_id_t dpo1,
const dpo_id_t dpo2 
)

compare two DPOs for equality

compare two DPOs for equality

like memcmp, return 0 is matching, !0 otherwise.

Definition at line 248 of file dpo.c.

+ Here is the caller graph for this function:

◆ dpo_copy()

void dpo_copy ( dpo_id_t dst,
const dpo_id_t src 
)

atomic copy a data-plane object.

This is safe to use when the dst DPO is currently switching packets

Definition at line 261 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_get_next_node_by_type_and_proto()

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.

Parameters
child_typeChild DPO type.
child_protoChild DPO proto
parent_typeParent DPO type.
parent_protoParent DPO proto
Returns
The VLIB Graph node index

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.

Definition at line 471 of file dpo.c.

◆ dpo_get_urpf()

u32 dpo_get_urpf ( const dpo_id_t dpo)

Get a uRPF interface for the DPO.

Parameters
dpoThe DPO from which to get the uRPF interface
Returns
valid SW interface index or ~0

Definition at line 381 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_id_is_valid()

static int dpo_id_is_valid ( const dpo_id_t dpoi)
inlinestatic

Return true if the DPO object is valid, i.e.

has been initialised.

Definition at line 207 of file dpo.h.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_is_adj()

int dpo_is_adj ( const dpo_id_t dpo)

Return TRUE is the DPO is any type of adjacency.

Definition at line 277 of file dpo.c.

+ Here is the caller graph for this function:

◆ dpo_lock()

void dpo_lock ( dpo_id_t dpo)

Take a reference counting lock on the DPO.

Definition at line 363 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_mk_interpose()

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.

Definition at line 352 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_proto_to_link()

vnet_link_t dpo_proto_to_link ( dpo_proto_t  dp)

format a DPO protocol

Definition at line 117 of file dpo.c.

+ Here is the caller graph for this function:

◆ dpo_register()

void dpo_register ( dpo_type_t  type,
const dpo_vft_t vft,
const char *const *const *  nodes 
)

For a given DPO type Register:

  • a virtual function table
  • a NULL terminated array of graph nodes from which that object type will originate packets, i.e. the nodes in which the object type will be the parent DPO in the DP graph. The ndoes are per-data-path protocol (see above).
Parameters
typeThe type being registered.
vftThe virtual function table to register for the type.
nodesThe string description of the per-protocol VLIB graph nodes.

Definition at line 321 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_register_new_type()

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

Parameters
vftThe virtual function table to register for the type.
nodesThe string description of the per-protocol VLIB graph nodes.
Returns
The new dpo_type_t

Definition at line 341 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_reset()

void dpo_reset ( dpo_id_t dpo)

reset a DPO ID The DPO will be unlocked.

Parameters
dpoThe DPO object to reset

Definition at line 231 of file dpo.c.

+ Here is the call graph for this function:

◆ dpo_set()

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.

Parameters
dpoThe DPO object to configure
typeThe dpo_type_t of the DPO
protoThe dpo_proto_t of the DPO
indexThe type specific index of the DPO

Definition at line 185 of file dpo.c.

+ Here is the call graph for this function:

◆ dpo_stack()

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.

Parameters
child_typeChild DPO type.
child_protoChild DPO proto

dpo This is the DPO to stack and set.

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 515 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_stack_from_node()

void dpo_stack_from_node ( u32  child_node_index,
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, from the child_node passed.

Parameters
child_nodeThe VLIB grpah node index to create an arc from to the parent
dpoThis is the DPO to stack and set.
parent_dpoThe 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 530 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dpo_unlock()

void dpo_unlock ( dpo_id_t dpo)

Release a reference counting lock on the DPO.

Definition at line 372 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ format_dpo_id()

u8* format_dpo_id ( u8 s,
va_list *  args 
)

Format a DPO_id_t oject

Definition at line 147 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ format_dpo_proto()

u8* format_dpo_proto ( u8 s,
va_list *  args 
)

format a DPO protocol

Definition at line 177 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ format_dpo_type()

u8* format_dpo_type ( u8 s,
va_list *  args 
)

format a DPO type

Definition at line 137 of file dpo.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ STATIC_ASSERT()

STATIC_ASSERT ( sizeof(dpo_id_t)<=sizeof(u64 ,
"DPO ID is greater than sizeof u64 " "atomic updates need to be revisited"   
)

◆ vnet_link_to_dpo_proto()

dpo_proto_t vnet_link_to_dpo_proto ( vnet_link_t  linkt)

Definition at line 95 of file dpo.c.

+ Here is the caller graph for this function: