FD.io VPP  v21.06-3-gbb25fbf28
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...
 
#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...
 
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...
 
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...
 

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, \
}

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 204 of file dpo.h.

◆ dpo_pool_barrier_release

#define dpo_pool_barrier_release (   VM,
  YESNO 
)    if ((YESNO)) vlib_worker_thread_barrier_release((VM));

Release barrier sync after dpo pool expansion.

Parameters
VMvlib_main_t pointer, must be &vlib_global_main
YESNOtypically a u8, 1 => release required 0 => no release required
Returns
none

Definition at line 568 of file dpo.h.

◆ dpo_pool_barrier_sync

#define dpo_pool_barrier_sync (   VM,
  P,
  YESNO 
)
Value:
do { \
pool_get_aligned_will_expand ((P), YESNO, CLIB_CACHE_LINE_BYTES); \
if (YESNO) \
{ \
VM = vlib_get_main(); \
ASSERT ((VM)->thread_index == 0); \
vlib_worker_thread_barrier_sync((VM)); \
} \
} while(0);

Barrier sync if a dpo pool is about to expand.

Parameters
VM(output) vlib_main_t *, invariably &vlib_global_main
Ppool pointer
YESNO(output) typically a u8, 1 => expand will occur, worker barrier held 0 => no expand, barrier not held
Returns
YESNO set

Definition at line 544 of file dpo.h.

◆ DPO_PROTO_NONE

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

Definition at line 73 of file dpo.h.

◆ DPO_PROTO_NUM

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

Definition at line 72 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 75 of file dpo.h.

◆ DPO_TYPE_NUM

#define DPO_TYPE_NUM   DPO_LAST

Definition at line 133 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", \
[DPO_PW_CW] = "PW-CW", \
}

Definition at line 135 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 84 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 49 of file dpo.h.

Typedef Documentation

◆ dpo_get_mtu_t

typedef u16(* dpo_get_mtu_t) (const dpo_id_t *dpo)

Given a DPO instance return the MTU.

Definition at line 406 of file dpo.h.

◆ 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 395 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 401 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 379 of file dpo.h.

◆ dpo_mem_show_t

typedef void(* dpo_mem_show_t) (void)

An memory usage show command.

Definition at line 389 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 416 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 384 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 43 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 62 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_PW_CW 
DPO_LAST 

Definition at line 93 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 251 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 264 of file dpo.c.

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

◆ dpo_get_mtu()

u16 dpo_get_mtu ( const dpo_id_t dpo)

Get the MTU DPO.

Parameters
dpoThe DPO from which to get the MTU
Returns
MTU (0xffff if something more usefull was unavailable)

Definition at line 401 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 491 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 389 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 216 of file dpo.h.

+ 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 282 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 371 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 360 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 120 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 329 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 349 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 234 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 188 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

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

+ 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 graph 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 550 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 380 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 150 of file dpo.c.

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

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

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

+ Here is the caller graph for this function:
thread_index
u32 thread_index
Definition: nat44_ei_hairpinning.c:492
DPO_BIER_DISP_ENTRY
@ DPO_BIER_DISP_ENTRY
Definition: dpo.h:127
DPO_ADJACENCY_GLEAN
@ DPO_ADJACENCY_GLEAN
Definition: dpo.h:109
DPO_ADJACENCY_MIDCHAIN
@ DPO_ADJACENCY_MIDCHAIN
Definition: dpo.h:108
DPO_DROP
@ DPO_DROP
Definition: dpo.h:98
DPO_BIER_IMP
@ DPO_BIER_IMP
Definition: dpo.h:125
DPO_PW_CW
@ DPO_PW_CW
Definition: dpo.h:129
DPO_INTERFACE_RX
@ DPO_INTERFACE_RX
Definition: dpo.h:119
DPO_PROTO_BIER
@ DPO_PROTO_BIER
Definition: dpo.h:68
DPO_PUNT
@ DPO_PUNT
Definition: dpo.h:100
P
#define P(fmt,...)
DPO_RECEIVE
@ DPO_RECEIVE
Definition: dpo.h:112
DPO_IP6_LL
@ DPO_IP6_LL
Definition: dpo.h:128
DPO_BIER_TABLE
@ DPO_BIER_TABLE
Definition: dpo.h:123
DPO_DVR
@ DPO_DVR
Definition: dpo.h:121
if
if(node->flags &VLIB_NODE_FLAG_TRACE) vnet_interface_output_trace(vm
DPO_LOOKUP
@ DPO_LOOKUP
Definition: dpo.h:113
DPO_FIRST
@ DPO_FIRST
A non-zero value first so we can spot unitialisation errors.
Definition: dpo.h:97
DPO_MPLS_DISPOSITION_PIPE
@ DPO_MPLS_DISPOSITION_PIPE
Definition: dpo.h:116
DPO_BIER_FMASK
@ DPO_BIER_FMASK
Definition: dpo.h:124
DPO_ADJACENCY
@ DPO_ADJACENCY
Definition: dpo.h:106
CLIB_CACHE_LINE_BYTES
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59
DPO_ADJACENCY_MCAST_MIDCHAIN
@ DPO_ADJACENCY_MCAST_MIDCHAIN
Definition: dpo.h:111
DPO_ADJACENCY_MCAST
@ DPO_ADJACENCY_MCAST
Definition: dpo.h:110
DPO_LOAD_BALANCE
@ DPO_LOAD_BALANCE
load-balancing over a choice of [un]equal cost paths
Definition: dpo.h:104
DPO_L3_PROXY
@ DPO_L3_PROXY
Definition: dpo.h:122
DPO_PROTO_IP6
@ DPO_PROTO_IP6
Definition: dpo.h:65
DPO_PROTO_MPLS
@ DPO_PROTO_MPLS
Definition: dpo.h:66
DPO_BIER_DISP_TABLE
@ DPO_BIER_DISP_TABLE
Definition: dpo.h:126
DPO_INTERFACE_TX
@ DPO_INTERFACE_TX
Definition: dpo.h:120
DPO_PROTO_NONE
#define DPO_PROTO_NONE
Definition: dpo.h:73
DPO_IP_NULL
@ DPO_IP_NULL
Definition: dpo.h:99
vlib_get_main
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:38
DPO_LISP_CP
@ DPO_LISP_CP
Definition: dpo.h:114
DPO_PROTO_IP4
@ DPO_PROTO_IP4
Definition: dpo.h:64
DPO_ADJACENCY_INCOMPLETE
@ DPO_ADJACENCY_INCOMPLETE
Definition: dpo.h:107
DPO_CLASSIFY
@ DPO_CLASSIFY
Definition: dpo.h:115
DPO_PROTO_NSH
@ DPO_PROTO_NSH
Definition: dpo.h:69
DPO_PROTO_ETHERNET
@ DPO_PROTO_ETHERNET
Definition: dpo.h:67
DPO_MPLS_DISPOSITION_UNIFORM
@ DPO_MPLS_DISPOSITION_UNIFORM
Definition: dpo.h:117
INDEX_INVALID
#define INDEX_INVALID
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not...
Definition: dpo.h:49
DPO_REPLICATE
@ DPO_REPLICATE
Definition: dpo.h:105
DPO_MFIB_ENTRY
@ DPO_MFIB_ENTRY
Definition: dpo.h:118