108 #define IP4_LOOKUP_NEXT_NODES { \ 109 [IP_LOOKUP_NEXT_DROP] = "ip4-drop", \ 110 [IP_LOOKUP_NEXT_PUNT] = "ip4-punt", \ 111 [IP_LOOKUP_NEXT_LOCAL] = "ip4-local", \ 112 [IP_LOOKUP_NEXT_ARP] = "ip4-arp", \ 113 [IP_LOOKUP_NEXT_GLEAN] = "ip4-glean", \ 114 [IP_LOOKUP_NEXT_REWRITE] = "ip4-rewrite", \ 115 [IP_LOOKUP_NEXT_MCAST] = "ip4-rewrite-mcast", \ 116 [IP_LOOKUP_NEXT_BCAST] = "ip4-rewrite-bcast", \ 117 [IP_LOOKUP_NEXT_MIDCHAIN] = "ip4-midchain", \ 118 [IP_LOOKUP_NEXT_MCAST_MIDCHAIN] = "ip4-mcast-midchain", \ 119 [IP_LOOKUP_NEXT_ICMP_ERROR] = "ip4-icmp-error", \ 122 #define IP6_LOOKUP_NEXT_NODES { \ 123 [IP_LOOKUP_NEXT_DROP] = "ip6-drop", \ 124 [IP_LOOKUP_NEXT_PUNT] = "ip6-punt", \ 125 [IP_LOOKUP_NEXT_LOCAL] = "ip6-local", \ 126 [IP_LOOKUP_NEXT_ARP] = "ip6-discover-neighbor", \ 127 [IP_LOOKUP_NEXT_GLEAN] = "ip6-glean", \ 128 [IP_LOOKUP_NEXT_REWRITE] = "ip6-rewrite", \ 129 [IP_LOOKUP_NEXT_BCAST] = "ip6-rewrite-bcast", \ 130 [IP_LOOKUP_NEXT_MCAST] = "ip6-rewrite-mcast", \ 131 [IP_LOOKUP_NEXT_MIDCHAIN] = "ip6-midchain", \ 132 [IP_LOOKUP_NEXT_MCAST_MIDCHAIN] = "ip6-mcast-midchain", \ 133 [IP_LOOKUP_NEXT_ICMP_ERROR] = "ip6-icmp-error", \ 134 [IP6_LOOKUP_NEXT_HOP_BY_HOP] = "ip6-hop-by-hop", \ 135 [IP6_LOOKUP_NEXT_ADD_HOP_BY_HOP] = "ip6-add-hop-by-hop", \ 136 [IP6_LOOKUP_NEXT_POP_HOP_BY_HOP] = "ip6-pop-hop-by-hop", \ 186 #define ADJ_ATTR_NAMES { \ 187 [ADJ_ATTR_SYNC_WALK_ACTIVE] = "walk-active", \ 188 [ADJ_ATTR_MIDCHAIN_NO_COUNT] = "midchain-no-count", \ 189 [ADJ_ATTR_MIDCHAIN_IP_STACK] = "midchain-ip-stack", \ 190 [ADJ_ATTR_MIDCHAIN_LOOPED] = "midchain-looped", \ 193 #define FOR_EACH_ADJ_ATTR(_attr) \ 194 for (_attr = ADJ_ATTR_SYNC_WALK_ACTIVE; \ 195 _attr <= ADJ_ATTR_MIDCHAIN_LOOPED; \ 332 "IP adjacency cachline 0 is not offset");
335 "IP adjacency cachline 1 is more than one cachline size offset");
444 return (adj_per_adj_counters);
int adj_is_up(adj_index_t ai)
Return true if the adjacency is 'UP', i.e.
adj_flags_t ia_flags
Flags on the adjacency 1-bytes.
Packets TX through the midchain do not increment the interface counters.
u32 adj_child_add(adj_index_t adj_index, fib_node_type_t type, fib_node_index_t child_index)
Add a child dependent to an adjacency.
enum adj_attr_t_ adj_attr_t
Flags on an IP adjacency.
#define VLIB_BUFFER_PRE_DATA_SIZE
adj_flags_t_
Flags on an IP adjacency.
This packet is to be rewritten and forwarded to the next processing node.
When stacking midchains on a fib-entry extract the choice from the load-balance returned based on an ...
#define STRUCT_OFFSET_OF(t, f)
const ip46_address_t ADJ_BCAST_ADDR
The special broadcast address (to construct a broadcast adjacency.
adj_midchain_fixup_t fixup_func
A function to perform the post-rewrite fixup.
ip_lookup_next_t
An adjacency is a representation of an attached L3 peer.
void adj_walk(u32 sw_if_index, adj_walk_cb_t cb, void *ctx)
Walk the Adjacencies on a given interface.
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
struct ip_adjacency_t_ ip_adjacency_t
IP unicast adjacency.
vnet_link_t ia_link
link/ether-type 1 bytes
Adjacency to punt this packet.
ip46_address_t receive_addr
static ip_adjacency_t * adj_get(adj_index_t adj_index)
Get a pointer to an adjacency object from its index.
union ip_adjacency_t_::@42 sub_type
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
ip46_address_t next_hop
The recursive next-hop.
int adj_recursive_loop_detect(adj_index_t ai, fib_node_index_t **entry_indicies)
descend the FIB graph looking for loops
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
dpo_id_t next_dpo
The next DPO to use.
CLIB_CACHE_LINE_ALIGN_MARK(cacheline0)
ip_adjacency_t * adj_pool
The global adjacnecy pool.
This packet matches an "interface route" and packets need to be passed to ARP to find rewrite string ...
void adj_lock(adj_index_t adj_index)
Take a reference counting lock on the adjacency.
An node in the FIB graph.
fib_node_t ia_node
Linkage into the FIB node grpah.
const u8 * adj_get_rewrite(adj_index_t ai)
Return the link type of the adjacency.
fib_node_index_t fei
the FIB entry this midchain resolves through.
This packet matches an "incomplete adjacency" and packets need to be passed to ARP to find rewrite st...
Adjacency to drop this packet.
Multicast Midchain Adjacency.
u32 fib_node_index_t
A typedef of a node index.
adj_walk_rc_t(* adj_walk_cb_t)(adj_index_t ai, void *ctx)
Call back function when walking adjacencies.
void(* adj_midchain_fixup_t)(vlib_main_t *vm, struct ip_adjacency_t_ *adj, vlib_buffer_t *b0, const void *data)
A function type for post-rewrite fixups on midchain adjacency.
u32 adj_index_t
An index for adjacencies.
void adj_feature_update(u32 sw_if_index, u8 arc_index, u8 is_enable)
Notify the adjacency subsystem that the features settings for an interface have changed.
This packets follow a mid-chain adjacency.
STATIC_ASSERT((STRUCT_OFFSET_OF(ip_adjacency_t, cacheline0)==0), "IP adjacency cachline 0 is not offset")
enum vnet_link_t_ vnet_link_t
Link Type: A description of the protocol of packets on the link.
Currently a sync walk is active.
vnet_link_t adj_get_link_type(adj_index_t ai)
Return the link type of the adjacency.
const void * fixup_data
Fixup data passed back to the client in the fixup function.
vlib_combined_counter_main_t adjacency_counters
Adjacency packet counters.
enum adj_flags_t_ adj_flags_t
Flags on an IP adjacency.
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.
ip_lookup_next_t lookup_next_index
Next hop after ip4-lookup.
struct ip_adjacency_t_::@42::@44 midchain
IP_LOOKUP_NEXT_MIDCHAIN.
void adj_child_remove(adj_index_t adj_index, u32 sibling_index)
Remove a child dependent.
adj_attr_t_
Flags on an IP adjacency.
u32 adj_get_sw_if_index(adj_index_t ai)
Return the sw interface index of the adjacency.
A collection of combined counters.
enum fib_node_type_t_ fib_node_type_t
The types of nodes in a FIB graph.
int adj_per_adj_counters
Global Config for enabling per-adjacency counters This is configurable because it comes with a non-ne...
#define CLIB_CACHE_LINE_BYTES
u8 * format_adj_flags(u8 *s, va_list *args)
Format adjacency flags.
vnet_declare_rewrite(VLIB_BUFFER_PRE_DATA_SIZE)
void adj_unlock(adj_index_t adj_index)
Release a reference counting lock on the adjacency.
struct ip_adjacency_t_::@42::@43 nbr
IP_LOOKUP_NEXT_ARP/IP_LOOKUP_NEXT_REWRITE.
static int adj_are_counters_enabled(void)
Get the global configuration option for enabling per-adj counters.
If the midchain were to stack on its FIB entry a loop would form.
struct adj_delegate_t_ * ia_delegates
more control plane members that do not fit on the first cacheline
struct ip_adjacency_t_::@42::@45 glean
IP_LOOKUP_NEXT_GLEAN.