FD.io VPP  v18.01.2-1-g9b554f3
Vector Packet Processing
adj_nbr.c File Reference
+ Include dependency graph for adj_nbr.c:

Go to the source code of this file.

Data Structures

struct  adj_db_count_ctx_t_
 
struct  adj_walk_ctx_t_
 Context for a walk of the adjacency neighbour DB. More...
 
struct  adj_walk_nh_ctx_t_
 Context for a walk of the adjacency neighbour DB. More...
 
struct  adj_nbr_interface_state_change_ctx_t_
 Context for the state change walk of the DB. More...
 

Macros

#define ADJ_NBR_DEFAULT_HASH_NUM_BUCKETS   (64 * 64)
 
#define ADJ_NBR_DEFAULT_HASH_MEMORY_SIZE   (32<<20)
 
#define ADJ_NBR_SET_KEY(_key, _lt, _nh)
 
#define ADJ_NBR_ITF_OK(_proto, _itf)
 

Typedefs

typedef struct adj_db_count_ctx_t_ adj_db_count_ctx_t
 
typedef struct adj_walk_ctx_t_ adj_walk_ctx_t
 Context for a walk of the adjacency neighbour DB. More...
 
typedef struct adj_walk_nh_ctx_t_ adj_walk_nh_ctx_t
 Context for a walk of the adjacency neighbour DB. More...
 
typedef enum adj_nbr_interface_flags_t_ adj_nbr_interface_flags_t
 Flags associated with the interface state walks. More...
 
typedef struct adj_nbr_interface_state_change_ctx_t_ adj_nbr_interface_state_change_ctx_t
 Context for the state change walk of the DB. More...
 

Enumerations

enum  adj_nbr_interface_flags_t_ { ADJ_NBR_INTERFACE_UP = (1 << 0) }
 Flags associated with the interface state walks. More...
 

Functions

static BVT (clib_bihash)
 
void adj_nbr_remove (adj_index_t ai, fib_protocol_t nh_proto, vnet_link_t link_type, const ip46_address_t *nh_addr, u32 sw_if_index)
 
static adj_index_t adj_nbr_find (fib_protocol_t nh_proto, vnet_link_t link_type, const ip46_address_t *nh_addr, u32 sw_if_index)
 
static u32 adj_get_nd_node (fib_protocol_t proto)
 
static void adj_nbr_evaluate_feature (adj_index_t ai)
 Check and set feature flags if o/p interface has any o/p features. More...
 
static ip_adjacency_tadj_nbr_alloc (fib_protocol_t nh_proto, vnet_link_t link_type, const ip46_address_t *nh_addr, u32 sw_if_index)
 
adj_index_t adj_nbr_add_or_lock (fib_protocol_t nh_proto, vnet_link_t link_type, const ip46_address_t *nh_addr, u32 sw_if_index)
 Neighbour Adjacency sub-type. More...
 
adj_index_t adj_nbr_add_or_lock_w_rewrite (fib_protocol_t nh_proto, vnet_link_t link_type, const ip46_address_t *nh_addr, u32 sw_if_index, u8 *rewrite)
 Add (and lock) a new or lock an existing neighbour adjacency. More...
 
void adj_nbr_update_rewrite (adj_index_t adj_index, adj_nbr_rewrite_flag_t flags, u8 *rewrite)
 adj_nbr_update_rewrite More...
 
void adj_nbr_update_rewrite_internal (ip_adjacency_t *adj, ip_lookup_next_t adj_next_index, u32 this_node, u32 next_node, u8 *rewrite)
 adj_nbr_update_rewrite_internal More...
 
static void adj_db_count (BVT(clib_bihash_kv)*kvp, void *arg)
 
u32 adj_nbr_db_size (void)
 Return the size of the adjacency database. More...
 
static void adj_nbr_walk_cb (BVT(clib_bihash_kv)*kvp, void *arg)
 
void adj_nbr_walk (u32 sw_if_index, fib_protocol_t adj_nh_proto, adj_walk_cb_t cb, void *ctx)
 Walk the neighbour Adjacencies on a given interface. More...
 
static void adj_nbr_walk_nh_cb (BVT(clib_bihash_kv)*kvp, void *arg)
 
void adj_nbr_walk_nh4 (u32 sw_if_index, const ip4_address_t *addr, adj_walk_cb_t cb, void *ctx)
 Walk adjacencies on a link with a given v4 next-hop. More...
 
void adj_nbr_walk_nh6 (u32 sw_if_index, const ip6_address_t *addr, adj_walk_cb_t cb, void *ctx)
 Walk adjacencies on a link with a given v6 next-hop. More...
 
void adj_nbr_walk_nh (u32 sw_if_index, fib_protocol_t adj_nh_proto, const ip46_address_t *nh, adj_walk_cb_t cb, void *ctx)
 Walk adjacencies on a link with a given next-hop. More...
 
static adj_walk_rc_t adj_nbr_interface_state_change_one (adj_index_t ai, void *arg)
 
static clib_error_tadj_nbr_sw_interface_state_change (vnet_main_t *vnm, u32 sw_if_index, u32 flags)
 Registered function for SW interface state changes. More...
 
 VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION_PRIO (adj_nbr_sw_interface_state_change, VNET_ITF_FUNC_PRIORITY_HIGH)
 
static void adj_nbr_hw_sw_interface_state_change (vnet_main_t *vnm, u32 sw_if_index, void *arg)
 Invoked on each SW interface of a HW interface when the HW interface state changes. More...
 
static clib_error_tadj_nbr_hw_interface_state_change (vnet_main_t *vnm, u32 hw_if_index, u32 flags)
 Registered callback for HW interface state changes. More...
 
 VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION_PRIO (adj_nbr_hw_interface_state_change, VNET_ITF_FUNC_PRIORITY_HIGH)
 
static adj_walk_rc_t adj_nbr_interface_delete_one (adj_index_t ai, void *arg)
 
static clib_error_tadj_nbr_interface_add_del (vnet_main_t *vnm, u32 sw_if_index, u32 is_add)
 adj_nbr_interface_add_del More...
 
 VNET_SW_INTERFACE_ADD_DEL_FUNCTION (adj_nbr_interface_add_del)
 
static adj_walk_rc_t adj_nbr_show_one (adj_index_t ai, void *arg)
 
static clib_error_tadj_nbr_show (vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
 
static ip46_type_t adj_proto_to_46 (fib_protocol_t proto)
 
u8format_adj_nbr_incomplete (u8 *s, va_list *ap)
 Format aa incomplete neigbour (ARP) adjacency. More...
 
u8format_adj_nbr (u8 *s, va_list *ap)
 Format a neigbour (REWRITE) adjacency. More...
 
static void adj_dpo_lock (dpo_id_t *dpo)
 
static void adj_dpo_unlock (dpo_id_t *dpo)
 
static void adj_mem_show (void)
 
void adj_nbr_module_init (void)
 Module initialisation. More...
 

Variables

static vlib_cli_command_t ip4_show_fib_command
 (constructor) VLIB_CLI_COMMAND (ip4_show_fib_command) More...
 
static const dpo_vft_t adj_nbr_dpo_vft
 
static const dpo_vft_t adj_nbr_incompl_dpo_vft
 
static const char *const nbr_ip4_nodes []
 The per-protocol VLIB graph nodes that are assigned to an adjacency object. More...
 
static const char *const nbr_ip6_nodes []
 
static const char *const nbr_mpls_nodes []
 
static const char *const nbr_ethernet_nodes []
 
static const char *const *const nbr_nodes [DPO_PROTO_NUM]
 
static const char *const nbr_incomplete_ip4_nodes []
 
static const char *const nbr_incomplete_ip6_nodes []
 
static const char *const nbr_incomplete_mpls_nodes []
 
static const char *const *const nbr_incomplete_nodes [DPO_PROTO_NUM]
 

Macro Definition Documentation

#define ADJ_NBR_DEFAULT_HASH_MEMORY_SIZE   (32<<20)
#define ADJ_NBR_DEFAULT_HASH_NUM_BUCKETS   (64 * 64)
#define ADJ_NBR_ITF_OK (   _proto,
  _itf 
)
Value:
(((_itf) < vec_len(adj_nbr_tables[_proto])) && \
(NULL != adj_nbr_tables[_proto][sw_if_index]))
#define NULL
Definition: clib.h:55
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
#define ADJ_NBR_SET_KEY (   _key,
  _lt,
  _nh 
)
Value:
{ \
_key.key[0] = (_nh)->as_u64[0]; \
_key.key[1] = (_nh)->as_u64[1]; \
_key.key[2] = (_lt); \
}
u64 as_u64
Definition: bihash_doc.h:63

Typedef Documentation

Flags associated with the interface state walks.

Context for the state change walk of the DB.

Context for a walk of the adjacency neighbour DB.

Context for a walk of the adjacency neighbour DB.

Enumeration Type Documentation

Flags associated with the interface state walks.

Enumerator
ADJ_NBR_INTERFACE_UP 

Definition at line 696 of file adj_nbr.c.

Function Documentation

static void adj_db_count ( BVT(clib_bihash_kv)*  kvp,
void *  arg 
)
static

Definition at line 515 of file adj_nbr.c.

+ Here is the caller graph for this function:

static void adj_dpo_lock ( dpo_id_t dpo)
static

Definition at line 1026 of file adj_nbr.c.

+ Here is the call graph for this function:

static void adj_dpo_unlock ( dpo_id_t dpo)
static

Definition at line 1031 of file adj_nbr.c.

+ Here is the call graph for this function:

static u32 adj_get_nd_node ( fib_protocol_t  proto)
inlinestatic

Definition at line 121 of file adj_nbr.c.

+ Here is the caller graph for this function:

static void adj_mem_show ( void  )
static

Definition at line 1037 of file adj_nbr.c.

+ Here is the call graph for this function:

adj_index_t adj_nbr_add_or_lock ( fib_protocol_t  nh_proto,
vnet_link_t  link_type,
const ip46_address_t *  nh_addr,
u32  sw_if_index 
)

Neighbour Adjacency sub-type.

These adjs represent an L3 peer on a connected link.

Add (and lock) a new or lock an existing neighbour adjacency

Parameters
nh_protoThe protocol for the next-hop address (v4 or v6)
link_typeA description of the protocol of the packets that will forward through this adj. On an ethernet interface this is the MAC header's ether-type
nh_addrThe address of the next-hop/peer to send the packet to
sw_if_indexThe interface on which the peer resides

Definition at line 214 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

adj_index_t adj_nbr_add_or_lock_w_rewrite ( fib_protocol_t  nh_proto,
vnet_link_t  link_type,
const ip46_address_t *  nh_addr,
u32  sw_if_index,
u8 rewrite 
)

Add (and lock) a new or lock an existing neighbour adjacency.

Parameters
nh_protoThe protocol for the next-hop address (v4 or v6)
link_typeA description of the protocol of the packets that will forward through this adj. On an ethernet interface this is the MAC header's ether-type
nh_addrThe address of the next-hop/peer to send the packet to
sw_if_indexThe interface on which the peer resides
rewriteThe rewrite to prepend to packets

Definition at line 254 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static ip_adjacency_t* adj_nbr_alloc ( fib_protocol_t  nh_proto,
vnet_link_t  link_type,
const ip46_address_t *  nh_addr,
u32  sw_if_index 
)
static

Definition at line 176 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u32 adj_nbr_db_size ( void  )

Return the size of the adjacency database.

for testing purposes

Definition at line 523 of file adj_nbr.c.

+ Here is the call graph for this function:

static void adj_nbr_evaluate_feature ( adj_index_t  ai)
static

Check and set feature flags if o/p interface has any o/p features.

Definition at line 139 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static adj_index_t adj_nbr_find ( fib_protocol_t  nh_proto,
vnet_link_t  link_type,
const ip46_address_t *  nh_addr,
u32  sw_if_index 
)
static

Definition at line 97 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static clib_error_t* adj_nbr_hw_interface_state_change ( vnet_main_t vnm,
u32  hw_if_index,
u32  flags 
)
static

Registered callback for HW interface state changes.

Definition at line 802 of file adj_nbr.c.

+ Here is the call graph for this function:

static void adj_nbr_hw_sw_interface_state_change ( vnet_main_t vnm,
u32  sw_if_index,
void *  arg 
)
static

Invoked on each SW interface of a HW interface when the HW interface state changes.

Definition at line 780 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static clib_error_t* adj_nbr_interface_add_del ( vnet_main_t vnm,
u32  sw_if_index,
u32  is_add 
)
static

adj_nbr_interface_add_del

Registered to receive interface Add and delete notifications

Definition at line 849 of file adj_nbr.c.

+ Here is the call graph for this function:

static adj_walk_rc_t adj_nbr_interface_delete_one ( adj_index_t  ai,
void *  arg 
)
static

Definition at line 827 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static adj_walk_rc_t adj_nbr_interface_state_change_one ( adj_index_t  ai,
void *  arg 
)
static

Definition at line 713 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void adj_nbr_module_init ( void  )

Module initialisation.

Definition at line 1118 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void adj_nbr_remove ( adj_index_t  ai,
fib_protocol_t  nh_proto,
vnet_link_t  link_type,
const ip46_address_t *  nh_addr,
u32  sw_if_index 
)

Definition at line 79 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static clib_error_t* adj_nbr_show ( vlib_main_t vm,
unformat_input_t input,
vlib_cli_command_t cmd 
)
static

Definition at line 900 of file adj_nbr.c.

+ Here is the call graph for this function:

static adj_walk_rc_t adj_nbr_show_one ( adj_index_t  ai,
void *  arg 
)
static

Definition at line 888 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static clib_error_t* adj_nbr_sw_interface_state_change ( vnet_main_t vnm,
u32  sw_if_index,
u32  flags 
)
static

Registered function for SW interface state changes.

Definition at line 746 of file adj_nbr.c.

+ Here is the call graph for this function:

void adj_nbr_update_rewrite ( adj_index_t  adj_index,
adj_nbr_rewrite_flag_t  flags,
u8 rewrite 
)

adj_nbr_update_rewrite

Update the rewrite string for an existing adjacecny.

Update the adjacency's rewrite string. A NULL string implies the rewirte is reset (i.e. when ARP/ND etnry is gone). NB: the adj being updated may be handling traffic in the DP.

Definition at line 291 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void adj_nbr_update_rewrite_internal ( ip_adjacency_t adj,
ip_lookup_next_t  adj_next_index,
u32  this_node,
u32  next_node,
u8 rewrite 
)

adj_nbr_update_rewrite_internal

Update the adjacency's rewrite string. A NULL string implies the rewirte is reset (i.e. when ARP/ND etnry is gone). NB: the adj being updated may be handling traffic in the DP.

Definition at line 333 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void adj_nbr_walk ( u32  sw_if_index,
fib_protocol_t  adj_nh_proto,
adj_walk_cb_t  cb,
void *  ctx 
)

Walk the neighbour Adjacencies on a given interface.

Definition at line 567 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void adj_nbr_walk_cb ( BVT(clib_bihash_kv)*  kvp,
void *  arg 
)
static

Definition at line 557 of file adj_nbr.c.

+ Here is the caller graph for this function:

void adj_nbr_walk_nh ( u32  sw_if_index,
fib_protocol_t  adj_nh_proto,
const ip46_address_t *  nh,
adj_walk_cb_t  cb,
void *  ctx 
)

Walk adjacencies on a link with a given next-hop.

Walk the neighbour Adjacencies on a given interface with a given next-hop.

that is visit the adjacencies with different link types.

Definition at line 672 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void adj_nbr_walk_nh4 ( u32  sw_if_index,
const ip4_address_t addr,
adj_walk_cb_t  cb,
void *  ctx 
)

Walk adjacencies on a link with a given v4 next-hop.

that is visit the adjacencies with different link types.

Definition at line 614 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void adj_nbr_walk_nh6 ( u32  sw_if_index,
const ip6_address_t addr,
adj_walk_cb_t  cb,
void *  ctx 
)

Walk adjacencies on a link with a given v6 next-hop.

that is visit the adjacencies with different link types.

Definition at line 643 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void adj_nbr_walk_nh_cb ( BVT(clib_bihash_kv)*  kvp,
void *  arg 
)
static

Definition at line 597 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static ip46_type_t adj_proto_to_46 ( fib_protocol_t  proto)
static

Definition at line 972 of file adj_nbr.c.

+ Here is the caller graph for this function:

static BVT ( clib_bihash  )
static

Definition at line 26 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u8* format_adj_nbr ( u8 s,
va_list *  ap 
)

Format a neigbour (REWRITE) adjacency.

Definition at line 1008 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u8* format_adj_nbr_incomplete ( u8 s,
va_list *  ap 
)

Format aa incomplete neigbour (ARP) adjacency.

Definition at line 987 of file adj_nbr.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION_PRIO ( adj_nbr_hw_interface_state_change  ,
VNET_ITF_FUNC_PRIORITY_HIGH   
)

+ Here is the caller graph for this function:

VNET_SW_INTERFACE_ADD_DEL_FUNCTION ( adj_nbr_interface_add_del  )

+ Here is the caller graph for this function:

VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION_PRIO ( adj_nbr_sw_interface_state_change  ,
VNET_ITF_FUNC_PRIORITY_HIGH   
)

+ Here is the caller graph for this function:

Variable Documentation

const dpo_vft_t adj_nbr_dpo_vft
static
Initial value:
= {
.dv_lock = adj_dpo_lock,
.dv_unlock = adj_dpo_unlock,
.dv_format = format_adj_nbr,
.dv_mem_show = adj_mem_show,
.dv_get_urpf = adj_dpo_get_urpf,
}
u8 * format_adj_nbr(u8 *s, va_list *ap)
Format a neigbour (REWRITE) adjacency.
Definition: adj_nbr.c:1008
u32 adj_dpo_get_urpf(const dpo_id_t *dpo)
Definition: adj.c:212
static void adj_dpo_lock(dpo_id_t *dpo)
Definition: adj_nbr.c:1026
static void adj_mem_show(void)
Definition: adj_nbr.c:1037
static void adj_dpo_unlock(dpo_id_t *dpo)
Definition: adj_nbr.c:1031

Definition at line 1045 of file adj_nbr.c.

const dpo_vft_t adj_nbr_incompl_dpo_vft
static
Initial value:
= {
.dv_lock = adj_dpo_lock,
.dv_unlock = adj_dpo_unlock,
.dv_get_urpf = adj_dpo_get_urpf,
}
u8 * format_adj_nbr_incomplete(u8 *s, va_list *ap)
Format aa incomplete neigbour (ARP) adjacency.
Definition: adj_nbr.c:987
u32 adj_dpo_get_urpf(const dpo_id_t *dpo)
Definition: adj.c:212
static void adj_dpo_lock(dpo_id_t *dpo)
Definition: adj_nbr.c:1026
static void adj_dpo_unlock(dpo_id_t *dpo)
Definition: adj_nbr.c:1031

Definition at line 1052 of file adj_nbr.c.

vlib_cli_command_t ip4_show_fib_command
static
Initial value:
= {
.path = "show adj nbr",
.short_help = "show adj nbr [<adj_index>] [interface]",
.function = adj_nbr_show,
}
static clib_error_t * adj_nbr_show(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: adj_nbr.c:900

(constructor) VLIB_CLI_COMMAND (ip4_show_fib_command)

Definition at line 965 of file adj_nbr.c.

const char* const nbr_ethernet_nodes[]
static
Initial value:
=
{
"adj-l2-rewrite",
}
#define NULL
Definition: clib.h:55

Definition at line 1081 of file adj_nbr.c.

const char* const nbr_incomplete_ip4_nodes[]
static
Initial value:
=
{
"ip4-arp",
}
#define NULL
Definition: clib.h:55

Definition at line 1094 of file adj_nbr.c.

const char* const nbr_incomplete_ip6_nodes[]
static
Initial value:
=
{
"ip6-discover-neighbor",
}
#define NULL
Definition: clib.h:55

Definition at line 1099 of file adj_nbr.c.

const char* const nbr_incomplete_mpls_nodes[]
static
Initial value:
=
{
"mpls-adj-incomplete",
}
#define NULL
Definition: clib.h:55

Definition at line 1104 of file adj_nbr.c.

const char* const* const nbr_incomplete_nodes[DPO_PROTO_NUM]
static
Initial value:
=
{
}
static const char *const nbr_incomplete_ip6_nodes[]
Definition: adj_nbr.c:1099
static const char *const nbr_incomplete_mpls_nodes[]
Definition: adj_nbr.c:1104
static const char *const nbr_incomplete_ip4_nodes[]
Definition: adj_nbr.c:1094

Definition at line 1110 of file adj_nbr.c.

const char* const nbr_ip4_nodes[]
static
Initial value:
=
{
"ip4-rewrite",
}
#define NULL
Definition: clib.h:55

The per-protocol VLIB graph nodes that are assigned to an adjacency object.

this means that these graph nodes are ones from which a nbr is the parent object in the DPO-graph.

Definition at line 1066 of file adj_nbr.c.

const char* const nbr_ip6_nodes[]
static
Initial value:
=
{
"ip6-rewrite",
}
#define NULL
Definition: clib.h:55

Definition at line 1071 of file adj_nbr.c.

const char* const nbr_mpls_nodes[]
static
Initial value:
=
{
"mpls-output",
}
#define NULL
Definition: clib.h:55

Definition at line 1076 of file adj_nbr.c.

const char* const* const nbr_nodes[DPO_PROTO_NUM]
static
Initial value:
=
{
}
static const char *const nbr_ethernet_nodes[]
Definition: adj_nbr.c:1081
static const char *const nbr_mpls_nodes[]
Definition: adj_nbr.c:1076
static const char *const nbr_ip6_nodes[]
Definition: adj_nbr.c:1071
static const char *const nbr_ip4_nodes[]
The per-protocol VLIB graph nodes that are assigned to an adjacency object.
Definition: adj_nbr.c:1066

Definition at line 1086 of file adj_nbr.c.