51 u32 sw_if_index = va_arg (*args,
u32);
52 if (sw_if_index == ~0)
57 return format (s,
"Stale");
68 BVT (clib_bihash) * h = &msm->mac_table;
75 for (i = 0; i < h->nbuckets; i++)
81 for (j = 0; j < (1 << b->log2_pages); j++)
85 if (
v->kvp[k].key == ~0ULL &&
v->kvp[k].value == ~0ULL)
88 key.
raw =
v->kvp[k].key;
89 result.
raw =
v->kvp[k].value;
91 if ((bd_index == ~0) || (bd_index == key.
fields.bd_index))
110 BVT (clib_bihash) * h = &msm->mac_table;
116 u64 total_entries = 0;
120 u32 bd_id, bd_index = ~0;
126 else if (
unformat (input,
"verbose"))
128 else if (
unformat (input,
"bd_index %d", &bd_index))
130 else if (
unformat (input,
"bd_id %d", &bd_id))
145 for (i = 0; i < h->nbuckets; i++)
151 for (j = 0; j < (1 << b->log2_pages); j++)
155 if (
v->kvp[k].key == ~0ULL &&
v->kvp[k].value == ~0ULL)
158 if (verbose && first_entry)
162 "%=19s%=7s%=7s%=8s%=9s%=7s%=7s%=5s%=30s",
163 "Mac-Address",
"BD-Idx",
"If-Idx",
164 "BSN-ISN",
"Age(min)",
"static",
"filter",
165 "bvi",
"Interface-Name");
168 key.
raw =
v->kvp[k].key;
169 result.
raw =
v->kvp[k].value;
172 & ((bd_index >> 31) || (bd_index == key.
fields.bd_index)))
179 i16 delta = now - result.
fields.timestamp;
180 delta += delta < 0 ? 256 : 0;
181 s =
format (s,
"%d", delta);
187 "%=19U%=7d%=7d %3d/%-3d%=9v%=7s%=7s%=5s%=30U",
190 result.
fields.sw_if_index == ~0
191 ? -1 : result.
fields.sw_if_index,
193 s, result.
fields.static_mac ?
"*" :
"-",
194 result.
fields.filter ?
"*" :
"-",
195 result.
fields.bvi ?
"*" :
"-",
206 if (total_entries == 0)
210 "%lld l2fib entries with %d learned (or non-static) entries",
215 BV (format_bihash), h, 1 );
244 .path =
"show l2fib",
245 .short_help =
"show l2fib [verbose | bd_id <nn> | bd_index <nn> | raw]",
288 .path =
"clear l2fib",
289 .short_help =
"clear l2fib",
312 u32 sw_if_index,
u32 static_mac,
u32 filter_mac,
u32 bvi_mac)
316 __attribute__ ((unused))
u32 bucket_contents;
318 BVT (clib_bihash_kv) kv;
325 result.
fields.sw_if_index = sw_if_index;
326 result.
fields.static_mac = static_mac;
327 result.
fields.filter = filter_mac;
328 result.
fields.bvi = bvi_mac;
333 kv.value = result.
raw;
338 if (result.
fields.static_mac == 0)
361 u32 sw_if_index = ~0;
374 if (!
unformat (input,
"%d", &bd_id))
462 .short_help =
"l2fib add <mac> <bridge-domain-id> filter | <intf> [static | bvi]",
494 else if (
unformat (input,
"count %d", &count))
503 if (is_add == 0 && is_del == 0 && is_check == 0)
505 "noop: pick at least one of (add,del,check)");
511 for (i = 0; i < count; i++)
515 tmp = clib_net_to_host_u64 (mac);
519 mac = clib_host_to_net_u64 (tmp);
525 BVT (clib_bihash_kv) kv;
530 for (i = 0; i < count; i++)
539 tmp = clib_net_to_host_u64 (mac);
543 mac = clib_host_to_net_u64 (tmp);
549 for (i = 0; i < count; i++)
555 tmp = clib_net_to_host_u64 (mac);
559 mac = clib_host_to_net_u64 (tmp);
605 .path =
"test l2fib",
606 .short_help =
"test l2fib [add|del|check] mac <base-addr> count <nn>",
622 BVT (clib_bihash_kv) kv;
630 result.
raw = kv.value;
633 if (result.
fields.static_mac == 0)
679 if (!
unformat (input,
"%d", &bd_id))
716 .short_help =
"l2fib del <mac> <bridge-domain-id>",
825 .path =
"l2fib flush-mac all",
826 .short_help =
"l2fib flush-mac all",
841 .path =
"l2fib flush-mac interface",
842 .short_help =
"l2fib flush-mac interface <if-name>",
861 if (!
unformat (input,
"%d", &bd_id))
890 .path =
"l2fib flush-mac bridge-domain",
891 .short_help =
"l2fib flush-mac bridge-domain <bd-id>",
907 BVT (clib_bihash) * get_mac_table (
void)
910 return &mp->mac_table;
917 uword event_type, *event_data = 0;
920 f64 start_time, last_run_duration = 0, t;
950 BVT (clib_bihash) * h = &msm->mac_table;
952 for (i = 0; i < h->nbuckets; i++)
956 if (t > start_time + 10e-6)
962 if (i < (h->nbuckets - 3))
966 b = &h->buckets[i + 1];
980 for (j = 0; j < (1 << b->log2_pages); j++)
984 if (
v->kvp[k].key == ~0ULL &&
v->kvp[k].value == ~0ULL)
990 if (result.
fields.static_mac)
994 u32 sw_if_index = result.
fields.sw_if_index;
996 if (result.
fields.sn.as_u16 != sn)
1008 (
u8) (start_time / 60) - result.
fields.timestamp;
1009 delta += delta < 0 ? 256 : 0;
1011 if (delta > bd_config->
mac_age)
1026 .name =
"l2fib-mac-age-scanner-process",
1045 memset (test_mac, 0,
sizeof (test_mac));
static clib_error_t * l2fib_test_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
l2_input_config_t * configs
sll srl srl sll sra u16x4 i
u8 * format_vnet_sw_if_index_name_with_NA(u8 *s, va_list *args)
Format sw_if_index.
static f64 vlib_process_wait_for_event_or_clock(vlib_main_t *vm, f64 dt)
Suspend a cooperative multi-tasking thread Waits for an event, or for the indicated number of seconds...
#define BIHASH_KVP_PER_PAGE
static uword * vlib_process_wait_for_event(vlib_main_t *vm)
vnet_main_t * vnet_get_main(void)
void clib_bihash_free(clib_bihash *h)
Destroy a bounded index extensible hash table.
static f64 vlib_time_now(vlib_main_t *vm)
u32 l2fib_del_entry(u64 mac, u32 bd_index)
Delete an entry from the l2fib.
clib_error_t * l2fib_init(vlib_main_t *vm)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static_always_inline u8 * l2fib_swif_seq_num(u32 sw_if_index)
#define L2FIB_MEMORY_SIZE
unformat_function_t unformat_vnet_sw_interface
static clib_error_t * l2fib_del(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Delete an entry from the L2FIB.
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
static uword vlib_process_suspend(vlib_main_t *vm, f64 dt)
Suspend a vlib cooperative multi-tasking thread for a period of time.
u8 * format_ethernet_address(u8 *s, va_list *args)
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.
#define VLIB_INIT_FUNCTION(x)
static uword vlib_process_get_events(vlib_main_t *vm, uword **data_vector)
Return the first event type which has occurred and a vector of per-event data of that type...
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define clib_error_return(e, args...)
uword * bd_index_by_bd_id
void l2fib_start_ager_scan(vlib_main_t *vm)
Kick off ager to scan MACs to age/delete MAC entries.
format_function_t format_vnet_sw_interface_name
static void vlib_process_signal_event(vlib_main_t *vm, uword node_index, uword type_opaque, uword data)
static void l2fib_add_filter_entry(u64 mac, u32 bd_index)
void l2fib_flush_bd_mac(vlib_main_t *vm, u32 bd_index)
Flush all non static MACs in a bridge domain.
static void l2fib_add_fwd_entry(u64 mac, u32 bd_index, u32 sw_if_index, u32 static_mac, u32 bvi_mac)
void l2fib_flush_all_mac(vlib_main_t *vm)
Flush all non static MACs - flushes all valid BDs.
#define L2FIB_NUM_BUCKETS
void clib_bihash_init(clib_bihash *h, char *name, u32 nbuckets, uword memory_size)
initialize a bounded index extensible hash table
static u32 bd_is_valid(l2_bridge_domain_t *bd_config)
static clib_error_t * clear_l2fib(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Clear all entries in L2FIB.
clib_error_t * l2fib_sw_interface_up_down(vnet_main_t *vnm, u32 sw_if_index, u32 flags)
static clib_error_t * show_l2fib(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Display the contents of the l2fib.
static clib_error_t * l2fib_flush_mac_all(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Flush all MACs, except static ones The CLI format is: l2fib flush-mac all.
#define CLIB_PREFETCH(addr, size, type)
#define vec_free(V)
Free vector's memory (no header).
static clib_error_t * l2fib_flush_mac_int(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Flush MACs, except static ones, associated with an interface The CLI format is: l2fib flush-mac inter...
#define clib_warning(format, args...)
static vnet_sw_interface_t * vnet_get_sw_interface_safe(vnet_main_t *vnm, u32 sw_if_index)
void l2fib_clear_table(void)
static l2fib_seq_num_t l2fib_cur_seq_num(u32 bd_index, u32 sw_if_index)
void l2fib_add_entry(u64 mac, u32 bd_index, u32 sw_if_index, u32 static_mac, u32 filter_mac, u32 bvi_mac)
Add an entry to the l2fib.
#define VLIB_CLI_COMMAND(x,...)
#define VNET_SW_INTERFACE_FLAG_ADMIN_UP
uword unformat_ethernet_address(unformat_input_t *input, va_list *args)
int clib_bihash_search(clib_bihash *h, clib_bihash_kv *search_v, clib_bihash_kv *return_v)
Search a bi-hash table.
static uword l2fib_mac_age_scanner_process(vlib_main_t *vm, vlib_node_runtime_t *rt, vlib_frame_t *f)
struct l2fib_entry_result_t::@184::@186 fields
VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION(l2fib_sw_interface_up_down)
template key/value backing page structure
static clib_error_t * l2fib_flush_mac_bd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Flush bridge-domain MACs except static ones.
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static u64 l2fib_make_key(u8 *mac_address, u16 bd_index)
l2_bridge_domain_t * bd_configs
void l2fib_table_dump(u32 bd_index, l2fib_entry_key_t **l2fe_key, l2fib_entry_result_t **l2fe_res)
#define VLIB_REGISTER_NODE(x,...)
l2learn_main_t l2learn_main
#define vec_foreach(var, vec)
Vector iterator.
struct l2fib_entry_key_t::@176::@178 fields
static void * clib_bihash_get_value(clib_bihash *h, uword offset)
Get pointer to value page given its clib mheap offset.
#define CLIB_CACHE_LINE_BYTES
static clib_error_t * l2fib_add(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Add an entry to the L2FIB.
vlib_node_registration_t l2fib_mac_age_scanner_process_node
(constructor) VLIB_REGISTER_NODE (l2fib_mac_age_scanner_process_node)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static u32 l2fib_del_entry_by_key(u64 raw_key)
Delete an entry from the l2fib.
void l2fib_flush_int_mac(vlib_main_t *vm, u32 sw_if_index)
Flush all non static MACs from an interface.