+
+static clib_error_t *
+ip6_config (vlib_main_t * vm, unformat_input_t * input)
+{
+ uword heapsize = 0;
+ u32 nbuckets = 0;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "hash-buckets %d", &nbuckets))
+ ;
+ else if (unformat (input, "heap-size %U",
+ unformat_memory_size, &heapsize))
+ ;
+ else
+ return clib_error_return (0, "unknown input '%U'",
+ format_unformat_error, input);
+ }
+
+ ip6_fib_table_nbuckets = nbuckets;
+ ip6_fib_table_size = heapsize;
+
+ return 0;
+}
+
+VLIB_EARLY_CONFIG_FUNCTION (ip6_config, "ip6");
+
+static clib_error_t *
+ip6_fib_init (vlib_main_t * vm)
+{
+ if (ip6_fib_table_nbuckets == 0)
+ ip6_fib_table_nbuckets = IP6_FIB_DEFAULT_HASH_NUM_BUCKETS;
+
+ ip6_fib_table_nbuckets = 1 << max_log2 (ip6_fib_table_nbuckets);
+
+ if (ip6_fib_table_size == 0)
+ ip6_fib_table_size = IP6_FIB_DEFAULT_HASH_MEMORY_SIZE;
+
+ clib_bihash_init_24_8 (&(ip6_fib_table[IP6_FIB_TABLE_FWDING].ip6_hash),
+ "ip6 FIB fwding table",
+ ip6_fib_table_nbuckets, ip6_fib_table_size);
+ clib_bihash_init_24_8 (&ip6_fib_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash,
+ "ip6 FIB non-fwding table",
+ ip6_fib_table_nbuckets, ip6_fib_table_size);
+
+ return (NULL);
+}
+
+VLIB_INIT_FUNCTION (ip6_fib_init) =
+{
+ .runs_before = VLIB_INITS("ip6_lookup_init"),
+};