aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/l2/l2_fib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/l2/l2_fib.c')
-rw-r--r--src/vnet/l2/l2_fib.c78
1 files changed, 70 insertions, 8 deletions
diff --git a/src/vnet/l2/l2_fib.c b/src/vnet/l2/l2_fib.c
index 983e0218bfc..0ce4eb84a6b 100644
--- a/src/vnet/l2/l2_fib.c
+++ b/src/vnet/l2/l2_fib.c
@@ -285,6 +285,12 @@ show_l2fib (vlib_main_t * vm,
break;
}
+ if (msm->mac_table_initialized == 0)
+ {
+ vlib_cli_output (vm, "no l2fib entries");
+ return 0;
+ }
+
BV (clib_bihash_foreach_key_value_pair)
(&msm->mac_table, l2fib_show_walk_cb, &ctx);
@@ -341,6 +347,18 @@ VLIB_CLI_COMMAND (show_l2fib_cli, static) = {
};
/* *INDENT-ON* */
+void
+l2fib_table_init (void)
+{
+ l2fib_main_t *mp = &l2fib_main;
+
+ if (mp->mac_table_initialized == 1)
+ return;
+
+ BV (clib_bihash_init) (&mp->mac_table, "l2fib mac table",
+ mp->mac_table_n_buckets, mp->mac_table_memory_size);
+ mp->mac_table_initialized = 1;
+}
/* Remove all entries from the l2fib */
void
@@ -348,10 +366,12 @@ l2fib_clear_table (void)
{
l2fib_main_t *mp = &l2fib_main;
+ if (mp->mac_table_initialized == 0)
+ return;
+
/* Remove all entries */
BV (clib_bihash_free) (&mp->mac_table);
- BV (clib_bihash_init) (&mp->mac_table, "l2fib mac table",
- L2FIB_NUM_BUCKETS, L2FIB_MEMORY_SIZE);
+ l2fib_table_init ();
l2learn_main.global_learn_count = 0;
}
@@ -412,6 +432,9 @@ l2fib_add_entry (const u8 * mac, u32 bd_index,
l2learn_main_t *lm = &l2learn_main;
BVT (clib_bihash_kv) kv;
+ if (fm->mac_table_initialized == 0)
+ l2fib_table_init ();
+
/* set up key */
key.raw = l2fib_make_key (mac, bd_index);
kv.key = key.raw;
@@ -555,7 +578,6 @@ static clib_error_t *
l2fib_test_command_fn (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
- clib_error_t *error = 0;
u8 mac[6], save_mac[6];
u32 bd_index = 0;
u32 sw_if_index = 8;
@@ -606,6 +628,9 @@ l2fib_test_command_fn (vlib_main_t * vm,
BVT (clib_bihash_kv) kv;
l2fib_main_t *mp = &l2fib_main;
+ if (mp->mac_table_initialized == 0)
+ return clib_error_return (0, "mac table is not initialized");
+
clib_memcpy_fast (mac, save_mac, 6);
for (i = 0; i < count; i++)
@@ -631,7 +656,7 @@ l2fib_test_command_fn (vlib_main_t * vm,
}
}
- return error;
+ return 0;
}
/*?
@@ -692,6 +717,9 @@ l2fib_del_entry (const u8 * mac, u32 bd_index, u32 sw_if_index)
l2fib_main_t *mp = &l2fib_main;
BVT (clib_bihash_kv) kv;
+ if (mp->mac_table_initialized == 0)
+ return 1;
+
/* set up key */
kv.key = l2fib_make_key (mac, bd_index);
@@ -1273,10 +1301,11 @@ l2fib_init (vlib_main_t * vm)
mp->vlib_main = vm;
mp->vnet_main = vnet_get_main ();
-
- /* Create the hash table */
- BV (clib_bihash_init) (&mp->mac_table, "l2fib mac table",
- L2FIB_NUM_BUCKETS, L2FIB_MEMORY_SIZE);
+ if (mp->mac_table_n_buckets == 0)
+ mp->mac_table_n_buckets = L2FIB_NUM_BUCKETS;
+ if (mp->mac_table_memory_size == 0)
+ mp->mac_table_memory_size = L2FIB_MEMORY_SIZE;
+ mp->mac_table_initialized = 0;
/* verify the key constructor is good, since it is endian-sensitive */
clib_memset (test_mac, 0, sizeof (test_mac));
@@ -1291,6 +1320,39 @@ l2fib_init (vlib_main_t * vm)
VLIB_INIT_FUNCTION (l2fib_init);
+static clib_error_t *
+lfib_config (vlib_main_t * vm, unformat_input_t * input)
+{
+ l2fib_main_t *lm = &l2fib_main;
+ uword table_size = ~0;
+ u32 n_buckets = ~0;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "table-size %U", unformat_memory_size,
+ &table_size))
+ ;
+ else if (unformat (input, "num-buckets %u", &n_buckets))
+ ;
+ else
+ return clib_error_return (0, "unknown input `%U'",
+ format_unformat_error, input);
+ }
+
+ if (n_buckets != ~0)
+ {
+ if (!is_pow2 (n_buckets))
+ return clib_error_return (0, "num-buckets must be power of 2");
+ lm->mac_table_n_buckets = n_buckets;
+ }
+
+ if (table_size != ~0)
+ lm->mac_table_memory_size = table_size;
+ return 0;
+}
+
+VLIB_CONFIG_FUNCTION (lfib_config, "l2fib");
+
/*
* fd.io coding-style-patch-verification: ON
*