27 .stat_segment_name =
"/net/adjacency",
43 .as_u64[0] = 0xffffffffffffffff,
44 .as_u64[1] = 0xffffffffffffffff,
66 u8 need_barrier_sync = 0;
75 if (need_barrier_sync)
83 if (need_barrier_sync == 0)
88 if (need_barrier_sync)
103 adj->rewrite_header.sw_if_index = ~0;
104 adj->rewrite_header.flags = 0;
112 if (need_barrier_sync)
133 af = va_arg (*args,
int);
137 return (
format(s,
"None"));
164 adj_index = va_arg (*args,
u32);
168 return format(s,
"<invalid adjacency>");
209 s =
format(s,
"\n delegates:");
212 s =
format(s,
"\n children:");
267 ADJ_DBG(adj,
"last-lock-gone");
288 adj->rewrite_header.sw_if_index);
298 adj->rewrite_header.sw_if_index);
326 return (adj->rewrite_header.sw_if_index);
436 adj->rewrite_header.sw_if_index);
467 &adj->rewrite_header);
525 return (adj->rewrite_header.sw_if_index);
548 rw = &adj->rewrite_header;
565 #define ADJ_FROM_NODE(_node) \ 566 ((ip_adjacency_t*)((char*)_node - STRUCT_OFFSET_OF(ip_adjacency_t, ia_node))) 685 if (~0 != sw_if_index &&
717 .short_help =
"show adj [<adj_index>] [interface] [summary]",
736 else if (
unformat (input,
"disable"))
760 .path =
"adjacency counters",
761 .short_help =
"adjacency counters [enable|disable]",
void vnet_feature_register(vnet_feature_update_cb_t cb, void *data)
void adj_delegate_adj_deleted(ip_adjacency_t *adj)
adj_flags_t ia_flags
Flags on the adjacency 1-bytes.
ip_adjacency_t * adj_pool
The global adjacency pool.
#define pool_foreach_index(i, v)
void vlib_validate_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
validate a combined counter
enum adj_attr_t_ adj_attr_t
Flags on an IP adjacency.
u8 * format_adj_mcast_midchain(u8 *s, va_list *ap)
vl_api_wireguard_peer_flags_t flags
u8 * format_adj_nbr(u8 *s, va_list *ap)
Format a neigbour (REWRITE) adjacency.
static int adj_index_is_special(adj_index_t adj_index)
void adj_lock(adj_index_t adj_index)
Take a reference counting lock on the adjacency.
vnet_main_t * vnet_get_main(void)
void fib_node_init(fib_node_t *node, fib_node_type_t type)
const u8 * adj_get_rewrite(adj_index_t ai)
Return the rewrite string of the adjacency.
int vlib_validate_combined_counter_will_expand(vlib_combined_counter_main_t *cm, u32 index)
vnet_link_t adj_get_link_type(adj_index_t ai)
Return the link type of the adjacency.
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
enum fib_node_back_walk_rc_t_ fib_node_back_walk_rc_t
Return code from a back walk function.
u32 * config_index_by_sw_if_index
#define pool_get_aligned_will_expand(P, YESNO, A)
See if pool_get will expand the pool or not.
This packet is to be rewritten and forwarded to the next processing node.
Combined counter to hold both packets and byte differences.
void fib_node_deinit(fib_node_t *node)
ip_lookup_main_t lookup_main
struct ip_adjacency_t_::@161::@163 midchain
IP_LOOKUP_NEXT_MIDCHAIN.
unformat_function_t unformat_vnet_sw_interface
u8 * format_adj_nbr_incomplete(u8 *s, va_list *ap)
Format aa incomplete neigbour (ARP) adjacency.
void adj_child_remove(adj_index_t adj_index, u32 sibling_index)
Remove a child dependent.
u32 adj_dpo_get_urpf(const dpo_id_t *dpo)
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
u32 fib_node_child_add(fib_node_type_t parent_type, fib_node_index_t parent_index, fib_node_type_t type, fib_node_index_t index)
#define vlib_worker_thread_barrier_sync(X)
void fib_node_register_type(fib_node_type_t type, const fib_node_vft_t *vft)
fib_node_register_type
vnet_link_t ia_link
link/ether-type 1 bytes
Adjacency to punt this packet.
u8 output_feature_arc_index
static ip_adjacency_t * adj_get(adj_index_t adj_index)
Get a pointer to an adjacency object from its index.
struct ip_adjacency_t_::@161::@162 nbr
IP_LOOKUP_NEXT_ARP/IP_LOOKUP_NEXT_REWRITE.
#define VLIB_INIT_FUNCTION(x)
enum adj_walk_rc_t_ adj_walk_rc_t
return codes from a adjacency walker callback function
description fragment has unexpected format
void adj_mcast_walk(u32 sw_if_index, fib_protocol_t proto, adj_walk_cb_t cb, void *ctx)
Walk the multicast Adjacencies on a given interface.
#define clib_error_return(e, args...)
void adj_unlock(adj_index_t adj_index)
Release a reference counting lock on the adjacency.
int adj_bfd_is_up(adj_index_t ai)
static clib_error_t * adj_cli_counters_set(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
CLI invoked function to enable/disable per-adj counters.
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)
u8 output_feature_arc_index
#define ADJ_DBG(_e, _fmt, _args...)
big switch to turn on Adjacency debugging
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
#define ADJ_INDEX_INVALID
Invalid ADJ index - used when no adj is known likewise blazoned capitals INVALID speak volumes where ...
static void vlib_zero_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
Clear a combined counter Clears the set of per-thread counters.
int adj_is_up(adj_index_t ai)
Return true if the adjacency is 'UP', i.e.
counter_t packets
packet counter
u32 adj_get_sw_if_index(adj_index_t ai)
Return the sw interface index of the adjacency.
void fib_node_lock(fib_node_t *node)
void adj_midchain_module_init(void)
Module initialisation.
int adj_ndr_midchain_recursive_loop_detect(adj_index_t ai, fib_node_index_t **entry_indicies)
descend the FIB graph looking for loops
static adj_index_t adj_get_index(const ip_adjacency_t *adj)
Get a pointer to an adjacency object from its index.
#define ADJ_FROM_NODE(_node)
void adj_glean_remove(ip_adjacency_t *adj)
#define pool_put(P, E)
Free an object E in pool P.
void adj_midchain_delegate_restack(adj_index_t ai)
restack a midchain delegate
This packet matches an "interface route" and packets need to be passed to ARP to find rewrite string ...
int adj_per_adj_counters
Global Config for enabling per-adjacency counters.
static fib_node_back_walk_rc_t adj_back_walk_notify(fib_node_t *node, fib_node_back_walk_ctx_t *ctx)
An node in the FIB graph.
void adj_nbr_module_init(void)
Module initialisation.
void fib_node_unlock(fib_node_t *node)
fib_node_t ia_node
Linkage into the FIB node graph.
void adj_mcast_remove(fib_protocol_t proto, u32 sw_if_index)
u8 * format_adj_flags(u8 *s, va_list *args)
Format adjacency flags.
void adj_glean_module_init(void)
Module initialisation.
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P with alignment A.
static clib_error_t * adj_show(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
This packet matches an "incomplete adjacency" and packets need to be passed to ARP to find rewrite st...
Adjacency to drop this packet.
fib_node_list_t fn_children
Vector of nodes that depend upon/use/share this node.
int adj_recursive_loop_detect(adj_index_t ai, fib_node_index_t **entry_indicies)
descend the FIB graph looking for loops
static void vlib_get_combined_counter(const vlib_combined_counter_main_t *cm, u32 index, vlib_counter_t *result)
Get the value of a combined counter, never called in the speed path Scrapes the entire set of per-thr...
static void adj_last_lock_gone(ip_adjacency_t *adj)
#define vec_free(V)
Free vector's memory (no header).
Multicast Midchain Adjacency.
u8 * format_adj_glean(u8 *s, va_list *ap)
Format/display a glean adjacency.
static clib_error_t * adj_mtu_update(vnet_main_t *vnm, u32 sw_if_index, u32 flags)
void adj_mcast_module_init(void)
Module initialisation.
u32 fib_node_index_t
A typedef of a node index.
static adj_walk_rc_t adj_mtu_update_walk_cb(adj_index_t ai, void *arg)
adj_walk_rc_t(* adj_walk_cb_t)(adj_index_t ai, void *ctx)
Call back function when walking adjacencies.
static void adj_poison(ip_adjacency_t *adj)
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
u32 adj_index_t
An index for adjacencies.
u8 * format_adj_mcast(u8 *s, va_list *ap)
Format/display a mcast adjacency.
void adj_nbr_walk(u32 sw_if_index, fib_protocol_t adj_nh_proto, adj_walk_cb_t cb, void *ctx)
Walk all adjacencies on a link for a given next-hop protocol.
vlib_main_t vlib_node_runtime_t * node
Context passed between object during a back walk.
#define VLIB_CLI_COMMAND(x,...)
void adj_walk(u32 sw_if_index, adj_walk_cb_t cb, void *ctx)
Walk the Adjacencies on a given interface.
u8 * format_adj_midchain(u8 *s, va_list *ap)
Format a midchain adjacency.
This packets follow a mid-chain adjacency.
static const char * adj_attr_names[]
Adj flag names.
u32 fib_node_list_get_size(fib_node_list_t list)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static fib_node_t * adj_get_node(fib_node_index_t index)
ip_lookup_main_t lookup_main
enum vnet_link_t_ vnet_link_t
Link Type: A description of the protocol of packets on the link.
u32 ia_cfg_index
feature [arc] config index
void fib_node_child_remove(fib_node_type_t parent_type, fib_node_index_t parent_index, fib_node_index_t sibling_index)
#define FOR_EACH_ADJ_ATTR(_attr)
static vlib_main_t * vlib_get_main(void)
enum adj_flags_t_ adj_flags_t
Flags on an IP adjacency.
#define vec_elt(v, i)
Get vector value at index i.
union ip_adjacency_t_::@161 sub_type
u8 * adj_delegate_format(u8 *s, ip_adjacency_t *adj)
counter_t bytes
byte counter
This packets needs to go to ICMP error.
This packet is for one of our own IP addresses.
fib_protocol_t ia_nh_proto
The protocol of the neighbor/peer.
index_t dpoi_index
the index of objects of that type
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
ip_lookup_next_t lookup_next_index
Next hop after ip4-lookup.
u32 fn_locks
Number of dependents on this node.
u32 adj_child_add(adj_index_t adj_index, fib_node_type_t child_type, fib_node_index_t child_index)
Add a child dependent to an adjacency.
u8 * format_ip_adjacency(u8 *s, va_list *args)
Pretty print helper function for formatting specific adjacencies.
ip_adjacency_t * adj_alloc(fib_protocol_t proto)
char * name
The counter collection's name.
A collection of combined counters.
#define FOR_EACH_FIB_IP_PROTOCOL(_item)
static int adj_is_valid(adj_index_t adj_index)
static void adj_node_last_lock_gone(fib_node_t *node)
A FIB graph nodes virtual function table.
enum fib_node_type_t_ fib_node_type_t
The types of nodes in a FIB graph.
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
ip4_main_t ip4_main
Global ip4 main structure.
void adj_midchain_teardown(ip_adjacency_t *adj)
adj_midchain_setup
static clib_error_t * adj_module_init(vlib_main_t *vm)
vnet_feature_config_main_t * feature_config_mains
feature config main objects
u8 * fib_node_children_format(fib_node_list_t list, u8 *s)
#define CLIB_CACHE_LINE_BYTES
struct adj_feature_update_t_ adj_feature_update_ctx_t
This adjacency/interface has output features configured.
VNET_SW_INTERFACE_MTU_CHANGE_FUNCTION(adj_mtu_update)
void vnet_rewrite_update_mtu(vnet_main_t *vnm, vnet_link_t linkt, vnet_rewrite_header_t *rw)
vnet_feature_main_t feature_main
static void adj_feature_update(u32 sw_if_index, u8 arc_index, u8 is_enable, void *data)
static adj_walk_rc_t adj_feature_update_walk_cb(adj_index_t ai, void *arg)
const ip46_address_t ADJ_BCAST_ADDR
The special broadcast address (to construct a broadcast adjacency.
static int adj_are_counters_enabled(void)
Get the global configuration option for enabling per-adj counters.
vl_api_interface_index_t sw_if_index
struct adj_delegate_t_ * ia_delegates
A sorted vector of delegates.
static uword pool_elts(void *v)
Number of active elements in a pool.