57 IP6_MULTICAST_SCOPE_link_local,
58 IP6_MULTICAST_GROUP_ID_all_routers);
70 IP6_MULTICAST_SCOPE_link_local,
71 IP6_MULTICAST_GROUP_ID_all_hosts);
83 IP6_MULTICAST_SCOPE_link_local,
84 IP6_MULTICAST_GROUP_ID_mldv2_routers);
95 pfx.
fp_addr.ip6.as_u64[0] = clib_host_to_net_u64 (0xFE80000000000000ULL);
111 memset(fib_table, 0,
sizeof(*fib_table));
187 IP6_MULTICAST_SCOPE_link_local,
188 IP6_MULTICAST_GROUP_ID_all_routers);
198 IP6_MULTICAST_SCOPE_link_local,
199 IP6_MULTICAST_GROUP_ID_all_hosts);
209 IP6_MULTICAST_SCOPE_link_local,
210 IP6_MULTICAST_GROUP_ID_mldv2_routers);
219 pfx.
fp_addr.ip6.as_u64[0] = clib_host_to_net_u64 (0xFE80000000000000ULL);
251 BVT(clib_bihash_kv) kv, value;
258 kv.key[0] = addr->
as_u64[0];
259 kv.key[1] = addr->
as_u64[1];
260 fib = ((
u64)((fib_index))<<32);
267 while (i < n_p && table->prefix_lengths_in_search_order[i] > len)
277 ASSERT(dst_address_length >= 0 && dst_address_length <= 128);
279 kv.key[0] &= mask->
as_u64[0];
280 kv.key[1] &= mask->
as_u64[1];
281 kv.key[2] = fib | dst_address_length;
283 rv = BV(clib_bihash_search_inline_2)(&table->ip6_hash, &kv, &value);
297 BVT(clib_bihash_kv) kv, value;
304 fib = ((
u64)((fib_index))<<32);
308 kv.key[2] = fib | len;
310 rv = BV(clib_bihash_search_inline_2)(&table->ip6_hash, &kv, &value);
325 int dst_address_length = 128 - i;
326 vec_add1(table->prefix_lengths_in_search_order, dst_address_length);
336 BVT(clib_bihash_kv) kv;
342 fib = ((
u64)((fib_index))<<32);
346 kv.key[2] = fib | len;
368 BVT(clib_bihash_kv) kv;
374 fib = ((
u64)((fib_index))<<32);
378 kv.key[2] = fib | len;
379 kv.value = fib_entry_index;
399 BVT(clib_bihash_kv) kv, value;
405 kv.key[0] = dst->
as_u64[0];
406 kv.key[1] = dst->
as_u64[1];
407 fib = ((
u64)((fib_index))<<32);
409 for (i = 0; i < len; i++)
414 ASSERT(dst_address_length >= 0 && dst_address_length <= 128);
416 kv.key[0] &= mask->
as_u64[0];
417 kv.key[1] &= mask->
as_u64[1];
418 kv.key[2] = fib | dst_address_length;
420 rv = BV(clib_bihash_search_inline_2)(&table->ip6_hash, &kv, &value);
465 BVT(clib_bihash_kv) kv;
471 fib = ((
u64)((fib_index))<<32);
475 kv.key[2] = fib | len;
495 BVT(clib_bihash_kv) kv;
501 fib = ((
u64)((fib_index))<<32);
505 kv.key[2] = fib | len;
580 u64 count_by_prefix_length[129];
584 (
BVT(clib_bihash_kv) * kvp,
void *arg)
592 mask_width = kvp->key[2] & 0xFF;
606 int verbose, matching;
628 else if (
unformat (input,
"table %d", &table_id))
638 fib = &(fib_table->v6);
639 if (table_id >= 0 && table_id != (int)fib->table_id)
641 if (fib_index != ~0 && fib_index != (int)fib->index)
644 vlib_cli_output (vm,
"%s, fib_index %d, flow hash: %U",
645 fib_table->ft_desc, fib->index,
646 format_ip_flow_hash_config, fib->flow_hash_config);
651 BVT(clib_bihash) * h = &im6->ip6_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash;
654 vlib_cli_output (vm,
"%=20s%=16s",
"Prefix length",
"Count");
656 memset (ca, 0, sizeof(*ca));
657 ca->fib_index = fib->index;
659 BV(clib_bihash_foreach_key_value_pair)
660 (h, count_routes_in_fib_at_prefix_length, ca);
662 for (len = 128; len >= 0; len--)
664 if (ca->count_by_prefix_length[len])
665 vlib_cli_output (vm,
"%=20d%=16lld",
666 len, ca->count_by_prefix_length[len]);
780 .path =
"show ip6 fib",
781 .short_help =
"show ip6 fib [summary] [table <table-id>] [index <fib-id>] [<ip6-addr>[/<width>]]",
fib_protocol_t fp_proto
protocol type
u8 * format_fib_entry(u8 *s, va_list *args)
#define hash_set(h, key, value)
sll srl srl sll sra u16x4 i
fib_protocol_t ft_proto
Which protocol this table serves.
#define hash_unset(h, key)
static ip6_fib_t * ip6_fib_get(fib_node_index_t index)
void fib_table_lock(u32 fib_index, fib_protocol_t proto)
Release a reference counting lock on the table.
The table that stores ALL routes learned by the DP.
#define FIB_ENTRY_FORMAT_DETAIL
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static uword * clib_bitmap_set(uword *ai, uword i, uword value)
Sets the ith bit of a bitmap to new_value Removes trailing zeros from the bitmap. ...
static void ip6_fib_table_show_all(ip6_fib_t *fib, vlib_main_t *vm)
u8 * prefix_lengths_in_search_order
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
static void vnet_ip6_fib_init(u32 fib_index)
static u32 create_fib_with_table_id(u32 table_id)
flow_hash_config_t flow_hash_config
fib_node_index_t ip6_fib_table_lookup_exact_match(u32 fib_index, const ip6_address_t *addr, u32 len)
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
int clib_bihash_add_del(clib_bihash *h, clib_bihash_kv *add_v, int is_add)
Add or delete a (key,value) pair from a bi-hash table.
void fib_table_entry_special_remove(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Remove a 'special' entry from the FIB.
flow_hash_config_t ip6_fib_table_get_flow_hash_config(u32 fib_index)
Aggregrate type for a prefix.
A represenation of a single IP6 table.
u16 fp_len
The mask length.
int fib_entry_cmp_for_sort(void *i1, void *i2)
u32 ip6_fib_table_get_index_for_sw_if_index(u32 sw_if_index)
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
#define clib_bitmap_foreach(i, ai, body)
Macro to iterate across set bits in a bitmap.
#define ADJ_INDEX_INVALID
Invalid ADJ index - used when no adj is known likewise blazoned capitals INVALID speak volumes where ...
fib_node_index_t fib_table_entry_special_add(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, adj_index_t adj_index)
Add a 'special' entry to the FIB that links to the adj passed A special entry is an entry that the FI...
enum fib_source_t_ fib_source_t
The different sources that can create a route.
void ip6_fib_table_fwding_dpo_update(u32 fib_index, const ip6_address_t *addr, u32 len, const dpo_id_t *dpo)
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
#define pool_put(P, E)
Free an object E in pool P.
void ip6_fib_table_fwding_dpo_remove(u32 fib_index, const ip6_address_t *addr, u32 len, const dpo_id_t *dpo)
u32 ft_total_route_counts
Total route counters.
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
void ip6_fib_table_entry_remove(u32 fib_index, const ip6_address_t *addr, u32 len)
static void ip6_fib_table_show_one(ip6_fib_t *fib, vlib_main_t *vm, ip6_address_t *address, u32 mask_len)
uword * fib_index_by_table_id
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P (general version).
ip6_address_t fib_masks[129]
u32 ip6_fib_table_fwding_lookup(ip6_main_t *im, u32 fib_index, const ip6_address_t *dst)
void clib_bihash_foreach_key_value_pair(clib_bihash *h, void *callback, void *arg)
Visit active (key,value) pairs in a bi-hash table.
fib_node_index_t ft_index
Index into FIB vector.
u32 ip6_fib_table_create_and_lock(void)
void ip6_fib_table_destroy(u32 fib_index)
u32 ft_table_id
Table ID (hash key) for this FIB.
u32 ft_flow_hash_config
flow hash configuration
#define vec_free(V)
Free vector's memory (no header).
#define FOR_EACH_FIB_SOURCE(_item)
This table stores the routes that are used to forward traffic.
static void compute_prefix_lengths_in_search_order(ip6_fib_table_instance_t *table)
u32 fib_node_index_t
A typedef of a node index.
fib_node_index_t * entries
#define VLIB_CLI_COMMAND(x,...)
The default route source.
i32 dst_address_length_refcounts[129]
u32 ft_src_route_counts[FIB_SOURCE_MAX]
Per-source route counters.
#define IP_FLOW_HASH_DEFAULT
Default: 5-tuple without the "reverse" bit.
u32 flow_hash_config_t
A flow hash configuration is a mask of the flow hash options.
static void ip6_fib_table_collect_entries(clib_bihash_kv_24_8_t *kvp, void *arg)
ip6_fib_table_instance_t ip6_table[IP6_FIB_NUM_TABLES]
The two FIB tables; fwding and non-fwding.
#define vec_elt(v, i)
Get vector value at index i.
#define FIB_ENTRY_FORMAT_BRIEF
struct ip6_fib_show_ctx_t_ ip6_fib_show_ctx_t
u32 ip6_fib_table_fwding_lookup_with_if_index(ip6_main_t *im, u32 sw_if_index, const ip6_address_t *dst)
index_t dpoi_index
the index of objects of that type
static void ip6_set_solicited_node_multicast_address(ip6_address_t *a, u32 id)
#define FIB_NODE_INDEX_INVALID
u32 ip6_fib_table_find_or_create_and_lock(u32 table_id)
Get or create an IPv6 fib.
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static clib_error_t * ip6_show_fib(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
void ip6_fib_table_entry_insert(u32 fib_index, const ip6_address_t *addr, u32 len, fib_node_index_t fib_entry_index)
static void count_routes_in_fib_at_prefix_length(BVT(clib_bihash_kv)*kvp, void *arg)
uword * non_empty_dst_address_length_bitmap
fib_table_t * fib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
u64 count_by_prefix_length[129]
#define vec_foreach(var, vec)
Vector iterator.
fib_node_index_t ip6_fib_table_lookup(u32 fib_index, const ip6_address_t *addr, u32 len)
#define CLIB_CACHE_LINE_BYTES
struct fib_table_t_ * fibs
u32 * fib_index_by_sw_if_index
static void ip6_set_reserved_multicast_address(ip6_address_t *a, ip6_multicast_address_scope_t scope, u16 id)
A protocol Independent FIB table.