26 #define IP6_MFIB_KEY_LEN 33 102 .ims_scope = IP6_MULTICAST_SCOPE_link_local,
103 .ims_byte = IP6_MULTICAST_GROUP_ID_all_routers,
111 .ims_scope = IP6_MULTICAST_SCOPE_link_local,
112 .ims_byte = IP6_MULTICAST_GROUP_ID_all_hosts,
121 .ims_scope = IP6_MULTICAST_SCOPE_link_local,
122 .ims_byte = IP6_MULTICAST_GROUP_ID_mldv2_routers,
126 #define FOR_EACH_IP6_SPECIAL(_pfx, _body) \ 128 const ip6_mfib_special_t *_spec; \ 131 _ii < ARRAY_LEN(ip6_mfib_specials); \ 134 _spec = &ip6_mfib_specials[_ii]; \ 135 if (IP6_MFIB_SPECIAL_TYPE_SOLICITED == _spec->ims_type) \ 137 ip6_set_solicited_node_multicast_address( \ 138 &(_pfx)->fp_grp_addr.ip6, 0); \ 142 ip6_set_reserved_multicast_address ( \ 143 &(_pfx)->fp_grp_addr.ip6, \ 147 (_pfx)->fp_len = _spec->ims_len; \ 148 do { _body; } while (0); \ 164 .frp_sw_if_index = 0xffffffff,
171 memset(mfib_table, 0,
sizeof(*mfib_table));
228 .frp_sw_if_index = 0xffffffff,
265 .frp_sw_if_index = sw_if_index,
328 #define IP6_MFIB_MK_KEY(_grp, _src, _key) \ 330 (_key)->key[0] = 33; \ 331 memcpy((_key)->key+1, _grp, 16); \ 332 memcpy((_key)->key+17, _src, 16); \ 335 #define IP6_MFIB_MK_KEY_MASK(_grp, _src, _len, _key) \ 337 IP6_MFIB_MK_KEY(_grp, _src, _key); \ 339 (_key)->mask[0] = 33; \ 342 memcpy((_key)->mask+1, &ip6_main.fib_masks[_len], 16); \ 343 memset((_key)->mask+17, 0, 16); \ 347 ASSERT(_len == 256); \ 348 memcpy((_key)->mask+1, &ip6_main.fib_masks[128], 16); \ 349 memcpy((_key)->mask+17, &ip6_main.fib_masks[128], 16); \ 571 int verbose, matching;
574 int table_id = -1, fib_index = ~0;
594 memset(&src, 0,
sizeof(src));
599 memset(&src, 0,
sizeof(src));
603 else if (
unformat (input,
"table %d", &table_id))
605 else if (
unformat (input,
"index %d", &fib_index))
613 ip6_mfib_t *mfib = &mfib_table->v6;
615 if (table_id >= 0 && table_id != (int)mfib->table_id)
617 if (fib_index != ~0 && fib_index != (int)mfib->index)
620 vlib_cli_output (vm,
"%U, fib_index %d",
621 format_mfib_table_name, mfib->index, FIB_PROTOCOL_IP6,
695 .path =
"show ip6 mfib",
696 .short_help =
"show ip mfib [summary] [table <table-id>] [index <fib-id>] [<grp-addr>[/<mask>]] [<grp-addr>] [<src-addr> <grp-addr>]",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
#define MFIB_ENTRY_FORMAT_DETAIL
ip6_mfib_special_type_t ims_type
solicited or not
ip46_address_t fp_src_addr
#define hash_set(h, key, value)
enum ip6_mfib_special_type_t_ ip6_mfib_special_type_t
#define hash_unset(h, key)
u32 * mfib_index_by_sw_if_index
Table index indexed by software interface.
A representation of a path as described by a route producer.
fib_node_index_t * entries
struct ip6_mfib_key_t_ ip6_mfib_key_t
Key and mask for radix.
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
fib_node_index_t ip6_mfib_table_lookup(const ip6_mfib_t *mfib, const ip6_address_t *src, const ip6_address_t *grp, u32 len)
The IPv4 Multicast-FIB.
#define IP6_MFIB_MK_KEY_MASK(_grp, _src, _len, _key)
u32 mft_total_route_counts
Total route counters.
fib_node_index_t mfib_table_entry_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, fib_rpf_id_t rpf_id, mfib_entry_flags_t entry_flags)
Add a new (with no replication) or lock an existing entry.
fib_node_index_t ip6_mfib_table_lookup2(const ip6_mfib_t *mfib, const ip6_address_t *src, const ip6_address_t *grp)
Data-plane lookup function.
dpo_proto_t frp_proto
The protocol of the address below.
void ip6_mfib_table_destroy(ip6_mfib_t *mfib)
#define MFIB_ENTRY_FORMAT_BRIEF
struct radix_node * rn_search_m(const void *v_arg, struct radix_node *head, const void *m_arg)
u32 ip6_mfib_table_find_or_create_and_lock(u32 table_id, mfib_source_t src)
Get or create an IPv4 fib.
enum mfib_source_t_ mfib_source_t
Possible [control plane] sources of MFIB entries.
u8 ims_len
the Prefix length
static clib_error_t * ip6_show_mfib(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
#define VLIB_INIT_FUNCTION(x)
#define IP6_MFIB_MK_KEY(_grp, _src, _key)
fib_node_index_t mft_index
Index into FIB vector.
void mfib_table_entry_delete_index(fib_node_index_t mfib_entry_index, mfib_source_t source)
Delete a FIB entry.
fib_node_index_t mfib_table_entry_path_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath, mfib_itf_flags_t itf_flags)
Add n paths to an entry (aka route) in the FIB.
void ip6_mfib_table_entry_insert(ip6_mfib_t *mfib, const ip6_address_t *grp, const ip6_address_t *src, u32 len, fib_node_index_t mfib_entry_index)
void ip6_mfib_table_walk(ip6_mfib_t *mfib, mfib_table_walk_fn_t fn, void *ctx)
Walk the IP6 mfib table.
struct ip6_mfib_show_ctx_t_ ip6_mfib_show_ctx_t
mfib_table_walk_fn_t user_fn
uword * mfib_index_by_table_id
Hash table mapping table id to multicast fib index.
struct radix_node * rn_lookup(const void *v_arg, const void *m_arg, struct radix_node_head *head)
u8 mask[IP6_MFIB_KEY_LEN]
fib_node_index_t mfib_table_lookup_exact_match(u32 fib_index, const mfib_prefix_t *prefix)
Perfom an exact match in the non-forwarding table.
struct radix_node * rnh_treetop
#define pool_put(P, E)
Free an object E in pool P.
int mfib_entry_cmp_for_sort(void *i1, void *i2)
void mfib_table_lock(u32 fib_index, fib_protocol_t proto, mfib_source_t source)
Release a reference counting lock on the table.
u8 ims_byte
The last byte of the mcast address.
struct radix_node i6mn_nodes[2]
static void ip6_mfib_table_show_one(ip6_mfib_t *mfib, vlib_main_t *vm, ip6_address_t *src, ip6_address_t *grp, u32 mask_len)
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P (general version).
void ip6_mfib_interface_enable_disable(u32 sw_if_index, int is_enable)
Add/remove the interface from the accepting list of the special MFIB entries.
u32 ip6_mfib_table_get_index_for_sw_if_index(u32 sw_if_index)
int rn_walktree(struct radix_node_head *h, int(*f)(struct radix_node *, void *), void *w)
static void ip6_mfib_table_show_all(ip6_mfib_t *mfib, vlib_main_t *vm)
u8 * format_mfib_entry(u8 *s, va_list *args)
#define vec_free(V)
Free vector's memory (no header).
static int ip6_mfib_table_collect_entries(fib_node_index_t mfei, void *arg)
struct radix_node_head * rhead
static u32 ip6_create_mfib_with_table_id(u32 table_id, mfib_source_t src)
u32 fib_node_index_t
A typedef of a node index.
Aggregrate type for a prefix.
#define VLIB_CLI_COMMAND(x,...)
static clib_error_t * ip6_mfib_module_init(vlib_main_t *vm)
struct ip6_mfib_node_t_ ip6_mfib_node_t
An object that is inserted into the radix tree.
u8 ims_scope
The scope of the address.
static void clib_mem_free(void *p)
static u32 ip6_mfib_index_from_table_id(u32 table_id)
struct mfib_table_t_ * mfibs
Vector of MFIBs.
fib_protocol_t mft_proto
Which protocol this table serves.
struct ip6_mfib_special_t_ ip6_mfib_special_t
u32 mft_table_id
Table ID (hash key) for this FIB.
struct radix_node * rn_delete(const void *v_arg, const void *netmask_arg, struct radix_node_head *head)
static void * clib_mem_alloc(uword size)
fib_protocol_t fp_proto
protocol type
struct ip6_mfib_radix_walk_ctx_t_ ip6_mfib_radix_walk_ctx_t
fib_node_index_t ip6_mfib_table_lookup_exact_match(const ip6_mfib_t *mfib, const ip6_address_t *grp, const ip6_address_t *src, u32 len)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
int rn_inithead0(struct radix_node_head *rnh, int off)
#define INDEX_INVALID
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not...
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
void ip6_mfib_table_entry_remove(ip6_mfib_t *mfib, const ip6_address_t *grp, const ip6_address_t *src, u32 len)
int(* mfib_table_walk_fn_t)(fib_node_index_t fei, void *ctx)
Call back function when walking entries in a FIB table.
static void * clib_mem_alloc_aligned(uword size, uword align)
A protocol Independent IP multicast FIB table.
#define IP6_MFIB_KEY_LEN
The number of bytes in an address/ask key in the radix tree First byte is the length in bytes...
#define vec_foreach(var, vec)
Vector iterator.
An object that is inserted into the radix tree.
void mfib_table_entry_path_remove(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath)
Remove n paths to an entry (aka route) in the FIB.
#define CLIB_CACHE_LINE_BYTES
struct radix_node * rn_addroute(const void *v_arg, const void *n_arg, struct radix_node_head *head, struct radix_node treenodes[2])
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
struct radix_node * rn_match(const void *v_arg, struct radix_node_head *head)
#define FOR_EACH_IP6_SPECIAL(_pfx, _body)
const ip46_address_t zero_addr
static int ip6_mfib_table_radix_walk(struct radix_node *rn, void *arg)