summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cnat/cnat_types.h1
-rw-r--r--src/plugins/lisp/lisp-gpe/lisp_gpe_fwd_entry.c2
-rw-r--r--src/vnet/fib/ip6_fib.c84
-rw-r--r--src/vnet/fib/ip6_fib.h50
-rw-r--r--src/vnet/gre/interface.c10
-rw-r--r--src/vnet/interface.c2
-rw-r--r--src/vnet/ip/ip6.h72
-rw-r--r--src/vnet/ip/ip6_forward.c46
-rw-r--r--src/vnet/ip/ip6_ll_table.c3
-rw-r--r--src/vnet/ip/ip_api.c2
-rw-r--r--src/vnet/ip6-nd/ip6_mld.c3
-rw-r--r--src/vnet/l2/l2_learn.h1
-rw-r--r--src/vnet/mfib/ip6_mfib.c32
-rw-r--r--src/vnet/mfib/ip6_mfib.h29
-rw-r--r--src/vnet/session/transport_types.h2
15 files changed, 186 insertions, 153 deletions
diff --git a/src/plugins/cnat/cnat_types.h b/src/plugins/cnat/cnat_types.h
index bfddd6e2414..16d985f03a8 100644
--- a/src/plugins/cnat/cnat_types.h
+++ b/src/plugins/cnat/cnat_types.h
@@ -16,6 +16,7 @@
#ifndef __CNAT_TYPES_H__
#define __CNAT_TYPES_H__
+#include <vppinfra/bihash_24_8.h>
#include <vnet/fib/fib_node.h>
#include <vnet/fib/fib_source.h>
#include <vnet/ip/ip_types.h>
diff --git a/src/plugins/lisp/lisp-gpe/lisp_gpe_fwd_entry.c b/src/plugins/lisp/lisp-gpe/lisp_gpe_fwd_entry.c
index 334164c2583..00d5af4922a 100644
--- a/src/plugins/lisp/lisp-gpe/lisp_gpe_fwd_entry.c
+++ b/src/plugins/lisp/lisp-gpe/lisp_gpe_fwd_entry.c
@@ -20,8 +20,6 @@
#include <vnet/fib/fib_table.h>
#include <vnet/fib/fib_entry.h>
#include <vnet/fib/fib_path_list.h>
-#include <vnet/fib/ip6_fib.h>
-#include <vnet/fib/ip4_fib.h>
#include <vnet/dpo/drop_dpo.h>
#include <vnet/dpo/lookup_dpo.h>
#include <vnet/dpo/load_balance.h>
diff --git a/src/vnet/fib/ip6_fib.c b/src/vnet/fib/ip6_fib.c
index ddd70790759..861edccd4a9 100644
--- a/src/vnet/fib/ip6_fib.c
+++ b/src/vnet/fib/ip6_fib.c
@@ -20,6 +20,12 @@
#include <vppinfra/bihash_24_8.h>
#include <vppinfra/bihash_template.c>
+ip6_fib_table_instance_t ip6_fib_table[IP6_FIB_NUM_TABLES];
+
+/* ip6 lookup table config parameters */
+u32 ip6_fib_table_nbuckets;
+uword ip6_fib_table_size;
+
static void
vnet_ip6_fib_init (u32 fib_index)
{
@@ -183,7 +189,7 @@ ip6_fib_table_lookup (u32 fib_index,
int i, n_p, rv;
u64 fib;
- table = &ip6_main.ip6_table[IP6_FIB_TABLE_NON_FWDING];
+ table = &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING];
n_p = vec_len (table->prefix_lengths_in_search_order);
kv.key[0] = addr->as_u64[0];
@@ -230,7 +236,7 @@ ip6_fib_table_lookup_exact_match (u32 fib_index,
u64 fib;
int rv;
- table = &ip6_main.ip6_table[IP6_FIB_TABLE_NON_FWDING];
+ table = &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING];
mask = &ip6_main.fib_masks[len];
fib = ((u64)((fib_index))<<32);
@@ -283,7 +289,7 @@ ip6_fib_table_entry_remove (u32 fib_index,
ip6_address_t *mask;
u64 fib;
- table = &ip6_main.ip6_table[IP6_FIB_TABLE_NON_FWDING];
+ table = &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING];
mask = &ip6_main.fib_masks[len];
fib = ((u64)((fib_index))<<32);
@@ -315,7 +321,7 @@ ip6_fib_table_entry_insert (u32 fib_index,
ip6_address_t *mask;
u64 fib;
- table = &ip6_main.ip6_table[IP6_FIB_TABLE_NON_FWDING];
+ table = &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING];
mask = &ip6_main.fib_masks[len];
fib = ((u64)((fib_index))<<32);
@@ -368,7 +374,7 @@ ip6_fib_table_fwding_dpo_update (u32 fib_index,
ip6_address_t *mask;
u64 fib;
- table = &ip6_main.ip6_table[IP6_FIB_TABLE_FWDING];
+ table = &ip6_fib_table[IP6_FIB_TABLE_FWDING];
mask = &ip6_main.fib_masks[len];
fib = ((u64)((fib_index))<<32);
@@ -399,7 +405,7 @@ ip6_fib_table_fwding_dpo_remove (u32 fib_index,
ip6_address_t *mask;
u64 fib;
- table = &ip6_main.ip6_table[IP6_FIB_TABLE_FWDING];
+ table = &ip6_fib_table[IP6_FIB_TABLE_FWDING];
mask = &ip6_main.fib_masks[len];
fib = ((u64)((fib_index))<<32);
@@ -511,7 +517,7 @@ ip6_fib_table_walk (u32 fib_index,
};
clib_bihash_foreach_key_value_pair_24_8(
- &ip6_main.ip6_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash,
+ &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash,
ip6_fib_walk_cb,
&ctx);
@@ -532,7 +538,7 @@ ip6_fib_table_sub_tree_walk (u32 fib_index,
};
clib_bihash_foreach_key_value_pair_24_8(
- &ip6_main.ip6_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash,
+ &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash,
ip6_fib_walk_cb,
&ctx);
}
@@ -595,8 +601,8 @@ format_ip6_fib_table_memory (u8 * s, va_list * args)
{
uword bytes_inuse;
- bytes_inuse = (alloc_arena_next(&(ip6_main.ip6_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash)) +
- alloc_arena_next(&(ip6_main.ip6_table[IP6_FIB_TABLE_FWDING].ip6_hash)));
+ bytes_inuse = (alloc_arena_next(&(ip6_fib_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash)) +
+ alloc_arena_next(&(ip6_fib_table[IP6_FIB_TABLE_FWDING].ip6_hash)));
s = format(s, "%=30s %=6d %=12ld\n",
"IPv6 unicast",
@@ -681,11 +687,11 @@ ip6_show_fib (vlib_main_t * vm,
{
vlib_cli_output (vm, "IPv6 Non-Forwarding Hash Table:\n%U\n",
BV (format_bihash),
- &im6->ip6_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash,
+ &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash,
detail);
vlib_cli_output (vm, "IPv6 Forwarding Hash Table:\n%U\n",
BV (format_bihash),
- &im6->ip6_table[IP6_FIB_TABLE_FWDING].ip6_hash,
+ &ip6_fib_table[IP6_FIB_TABLE_FWDING].ip6_hash,
detail);
return (NULL);
}
@@ -728,7 +734,7 @@ ip6_show_fib (vlib_main_t * vm,
/* Show summary? */
if (! verbose)
{
- clib_bihash_24_8_t * h = &im6->ip6_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash;
+ clib_bihash_24_8_t * h = &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash;
int len;
vlib_cli_output (vm, "%=20s%=16s", "Prefix length", "Count");
@@ -862,3 +868,55 @@ VLIB_CLI_COMMAND (ip6_show_fib_command, static) = {
.function = ip6_show_fib,
};
/* *INDENT-ON* */
+
+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"),
+};
diff --git a/src/vnet/fib/ip6_fib.h b/src/vnet/fib/ip6_fib.h
index 50b360bcd12..706bebbce09 100644
--- a/src/vnet/fib/ip6_fib.h
+++ b/src/vnet/fib/ip6_fib.h
@@ -22,6 +22,54 @@
#include <vnet/fib/fib_table.h>
#include <vnet/ip/lookup.h>
#include <vnet/dpo/load_balance.h>
+#include <vppinfra/bihash_24_8.h>
+#include <vppinfra/bihash_template.h>
+
+/*
+ * Default size of the ip6 fib hash table
+ */
+#define IP6_FIB_DEFAULT_HASH_NUM_BUCKETS (64 * 1024)
+#define IP6_FIB_DEFAULT_HASH_MEMORY_SIZE (32<<20)
+
+/**
+ * Enumeration of the FIB table instance types
+ */
+typedef enum ip6_fib_table_instance_type_t_
+{
+ /**
+ * This table stores the routes that are used to forward traffic.
+ * The key is the prefix, the result the adjacency to forward on.
+ */
+ IP6_FIB_TABLE_FWDING,
+ /**
+ * The table that stores ALL routes learned by the DP.
+ * Some of these routes may not be ready to install in forwarding
+ * at a given time.
+ * The key in this table is the prefix, the result is the fib_entry_t
+ */
+ IP6_FIB_TABLE_NON_FWDING,
+} ip6_fib_table_instance_type_t;
+
+#define IP6_FIB_NUM_TABLES (IP6_FIB_TABLE_NON_FWDING+1)
+
+/**
+ * A representation of a single IP6 table
+ */
+typedef struct ip6_fib_table_instance_t_
+{
+ /* The hash table */
+ clib_bihash_24_8_t ip6_hash;
+
+ /* bitmap / refcounts / vector of mask widths to search */
+ uword *non_empty_dst_address_length_bitmap;
+ u8 *prefix_lengths_in_search_order;
+ i32 dst_address_length_refcounts[129];
+} ip6_fib_table_instance_t;
+
+/**
+ * The two FIB tables; fwding and non-fwding
+ */
+extern ip6_fib_table_instance_t ip6_fib_table[IP6_FIB_NUM_TABLES];
extern fib_node_index_t ip6_fib_table_lookup(u32 fib_index,
const ip6_address_t *addr,
@@ -73,7 +121,7 @@ ip6_fib_table_fwding_lookup (u32 fib_index,
int rv;
u64 fib;
- table = &ip6_main.ip6_table[IP6_FIB_TABLE_FWDING];
+ table = &ip6_fib_table[IP6_FIB_TABLE_FWDING];
len = vec_len (table->prefix_lengths_in_search_order);
kv.key[0] = dst->as_u64[0];
diff --git a/src/vnet/gre/interface.c b/src/vnet/gre/interface.c
index 3ea13e1676b..92e4f7469ac 100644
--- a/src/vnet/gre/interface.c
+++ b/src/vnet/gre/interface.c
@@ -18,8 +18,7 @@
#include <vnet/vnet.h>
#include <vnet/gre/gre.h>
#include <vnet/ip/format.h>
-#include <vnet/fib/ip4_fib.h>
-#include <vnet/fib/ip6_fib.h>
+#include <vnet/fib/fib_table.h>
#include <vnet/adj/adj_midchain.h>
#include <vnet/adj/adj_nbr.h>
#include <vnet/mpls/mpls.h>
@@ -529,10 +528,9 @@ vnet_gre_tunnel_add_del (vnet_gre_tunnel_add_del_args_t * a,
{
u32 outer_fib_index;
- if (!a->is_ipv6)
- outer_fib_index = ip4_fib_index_from_table_id (a->outer_table_id);
- else
- outer_fib_index = ip6_fib_index_from_table_id (a->outer_table_id);
+ outer_fib_index = fib_table_find ((a->is_ipv6 ?
+ FIB_PROTOCOL_IP6 :
+ FIB_PROTOCOL_IP4), a->outer_table_id);
if (~0 == outer_fib_index)
return VNET_API_ERROR_NO_SUCH_FIB;
diff --git a/src/vnet/interface.c b/src/vnet/interface.c
index 1cf63c75c67..f0ac40df4a8 100644
--- a/src/vnet/interface.c
+++ b/src/vnet/interface.c
@@ -39,9 +39,9 @@
#include <vnet/vnet.h>
#include <vnet/plugin/plugin.h>
-#include <vnet/fib/ip6_fib.h>
#include <vnet/adj/adj.h>
#include <vnet/adj/adj_mcast.h>
+#include <vnet/ip/ip.h>
typedef enum vnet_interface_helper_flags_t_
{
diff --git a/src/vnet/ip/ip6.h b/src/vnet/ip/ip6.h
index ad70b7e98ec..fcb18031a06 100644
--- a/src/vnet/ip/ip6.h
+++ b/src/vnet/ip/ip6.h
@@ -49,18 +49,9 @@
#include <vnet/ip/lookup.h>
#include <vnet/ip/ip_interface.h>
#include <stdbool.h>
-#include <vppinfra/bihash_24_8.h>
-#include <vppinfra/bihash_40_8.h>
-#include <vppinfra/bihash_template.h>
#include <vnet/util/radix.h>
#include <vnet/util/throttle.h>
-/*
- * Default size of the ip6 fib hash table
- */
-#define IP6_FIB_DEFAULT_HASH_NUM_BUCKETS (64 * 1024)
-#define IP6_FIB_DEFAULT_HASH_MEMORY_SIZE (32<<20)
-
typedef struct
{
ip6_address_t addr;
@@ -117,67 +108,8 @@ typedef struct
uword function_opaque;
} ip6_table_bind_callback_t;
-/**
- * Enumeration of the FIB table instance types
- */
-typedef enum ip6_fib_table_instance_type_t_
-{
- /**
- * This table stores the routes that are used to forward traffic.
- * The key is the prefix, the result the adjacency to forward on.
- */
- IP6_FIB_TABLE_FWDING,
- /**
- * The table that stores ALL routes learned by the DP.
- * Some of these routes may not be ready to install in forwarding
- * at a given time.
- * The key in this table is the prefix, the result is the fib_entry_t
- */
- IP6_FIB_TABLE_NON_FWDING,
-} ip6_fib_table_instance_type_t;
-
-#define IP6_FIB_NUM_TABLES (IP6_FIB_TABLE_NON_FWDING+1)
-
-/**
- * A representation of a single IP6 table
- */
-typedef struct ip6_fib_table_instance_t_
-{
- /* The hash table */
- clib_bihash_24_8_t ip6_hash;
-
- /* bitmap / refcounts / vector of mask widths to search */
- uword *non_empty_dst_address_length_bitmap;
- u8 *prefix_lengths_in_search_order;
- i32 dst_address_length_refcounts[129];
-} ip6_fib_table_instance_t;
-
-/**
- * A representation of a single IP6 mfib table
- */
-typedef struct ip6_mfib_table_instance_t_
-{
- /* The hash table */
- clib_bihash_40_8_t ip6_mhash;
-
- /* bitmap / refcounts / vector of mask widths to search */
- uword *non_empty_dst_address_length_bitmap;
- u16 *prefix_lengths_in_search_order;
- i32 dst_address_length_refcounts[257];
-} ip6_mfib_table_instance_t;
-
typedef struct ip6_main_t
{
- /**
- * The two FIB tables; fwding and non-fwding
- */
- ip6_fib_table_instance_t ip6_table[IP6_FIB_NUM_TABLES];
-
- /**
- * the single MFIB table
- */
- ip6_mfib_table_instance_t ip6_mtable;
-
ip_lookup_main_t lookup_main;
/* Pool of FIBs. */
@@ -219,10 +151,6 @@ typedef struct ip6_main_t
/** Functions to call when interface to table biding changes. */
ip6_table_bind_callback_t *table_bind_callbacks;
- /* ip6 lookup table config parameters */
- u32 lookup_table_nbuckets;
- uword lookup_table_size;
-
/* Seed for Jenkins hash used to compute ip6 flow hash. */
u32 flow_hash_seed;
diff --git a/src/vnet/ip/ip6_forward.c b/src/vnet/ip/ip6_forward.c
index 8c65560c3dd..294f632a6bf 100644
--- a/src/vnet/ip/ip6_forward.c
+++ b/src/vnet/ip/ip6_forward.c
@@ -2809,24 +2809,6 @@ ip6_lookup_init (vlib_main_t * vm)
ip_lookup_init (&im->lookup_main, /* is_ip6 */ 1);
- if (im->lookup_table_nbuckets == 0)
- im->lookup_table_nbuckets = IP6_FIB_DEFAULT_HASH_NUM_BUCKETS;
-
- im->lookup_table_nbuckets = 1 << max_log2 (im->lookup_table_nbuckets);
-
- if (im->lookup_table_size == 0)
- im->lookup_table_size = IP6_FIB_DEFAULT_HASH_MEMORY_SIZE;
-
- clib_bihash_init_24_8 (&(im->ip6_table[IP6_FIB_TABLE_FWDING].ip6_hash),
- "ip6 FIB fwding table",
- im->lookup_table_nbuckets, im->lookup_table_size);
- clib_bihash_init_24_8 (&im->ip6_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash,
- "ip6 FIB non-fwding table",
- im->lookup_table_nbuckets, im->lookup_table_size);
- clib_bihash_init_40_8 (&im->ip6_mtable.ip6_mhash,
- "ip6 mFIB table",
- im->lookup_table_nbuckets, im->lookup_table_size);
-
/* Create FIB with index 0 and table id of 0. */
fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP6, 0,
FIB_SOURCE_DEFAULT_ROUTE);
@@ -3166,34 +3148,6 @@ VLIB_CLI_COMMAND (set_ip6_classify_command, static) =
};
/* *INDENT-ON* */
-static clib_error_t *
-ip6_config (vlib_main_t * vm, unformat_input_t * input)
-{
- ip6_main_t *im = &ip6_main;
- uword heapsize = 0;
- u32 tmp;
- u32 nbuckets = 0;
-
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "hash-buckets %d", &tmp))
- nbuckets = tmp;
- else if (unformat (input, "heap-size %U",
- unformat_memory_size, &heapsize))
- ;
- else
- return clib_error_return (0, "unknown input '%U'",
- format_unformat_error, input);
- }
-
- im->lookup_table_nbuckets = nbuckets;
- im->lookup_table_size = heapsize;
-
- return 0;
-}
-
-VLIB_EARLY_CONFIG_FUNCTION (ip6_config, "ip6");
-
/*
* fd.io coding-style-patch-verification: ON
*
diff --git a/src/vnet/ip/ip6_ll_table.c b/src/vnet/ip/ip6_ll_table.c
index 75489ea08e3..e4010bc43c4 100644
--- a/src/vnet/ip/ip6_ll_table.c
+++ b/src/vnet/ip/ip6_ll_table.c
@@ -232,7 +232,6 @@ ip6_ll_show_fib (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
count_routes_in_fib_at_prefix_length_arg_t _ca, *ca = &_ca;
- ip6_main_t *im6 = &ip6_main;
fib_table_t *fib_table;
int verbose, matching;
ip6_address_t matching_address;
@@ -302,7 +301,7 @@ ip6_ll_show_fib (vlib_main_t * vm,
if (!verbose)
{
clib_bihash_24_8_t *h =
- &im6->ip6_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash;
+ &ip6_fib_table[IP6_FIB_TABLE_NON_FWDING].ip6_hash;
int len;
vlib_cli_output (vm, "%=20s%=16s", "Prefix length", "Count");
diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c
index 2f02fa01abf..3f593c6d3ce 100644
--- a/src/vnet/ip/ip_api.c
+++ b/src/vnet/ip/ip_api.c
@@ -37,8 +37,6 @@
#include <vnet/mfib/mfib_entry.h>
#include <vnet/mfib/mfib_api.h>
#include <vnet/ip/ip_source_and_port_range_check.h>
-#include <vnet/fib/ip4_fib.h>
-#include <vnet/fib/ip6_fib.h>
#include <vnet/fib/fib_path_list.h>
#include <vnet/ip/ip6_hop_by_hop.h>
#include <vnet/ip/ip6_link.h>
diff --git a/src/vnet/ip6-nd/ip6_mld.c b/src/vnet/ip6-nd/ip6_mld.c
index 6e6a5cab45e..2a95c84eb0b 100644
--- a/src/vnet/ip6-nd/ip6_mld.c
+++ b/src/vnet/ip6-nd/ip6_mld.c
@@ -20,10 +20,11 @@
#include <vnet/ip/ip.h>
#include <vnet/ip-neighbor/ip_neighbor_dp.h>
-#include <vnet/fib/ip6_fib.h>
#include <vnet/ip/ip6_link.h>
#include <vnet/ip/ip6_ll_table.h>
+#include <vnet/ethernet/ethernet.h>
+
/**
* @file
* @brief IPv6 Neighbor Adjacency and Neighbor Discovery.
diff --git a/src/vnet/l2/l2_learn.h b/src/vnet/l2/l2_learn.h
index 58e19babc6e..eea34ee83d3 100644
--- a/src/vnet/l2/l2_learn.h
+++ b/src/vnet/l2/l2_learn.h
@@ -19,6 +19,7 @@
#define included_l2learn_h
#include <vlib/vlib.h>
+#include <vppinfra/bihash_8_8.h>
#include <vnet/ethernet/ethernet.h>
diff --git a/src/vnet/mfib/ip6_mfib.c b/src/vnet/mfib/ip6_mfib.c
index 6b3b8d90fbe..14c724b3bef 100644
--- a/src/vnet/mfib/ip6_mfib.c
+++ b/src/vnet/mfib/ip6_mfib.c
@@ -19,6 +19,8 @@
#include <vnet/mfib/mfib_entry.h>
#include <vnet/fib/ip6_fib.h>
+ip6_mfib_table_instance_t ip6_mfib_table;
+
/**
* Key and mask for radix
*/
@@ -333,7 +335,7 @@ ip6_mfib_table_lookup_exact_match (const ip6_mfib_t *mfib,
IP6_MFIB_MK_KEY(mfib, grp, src, len, key);
- rv = clib_bihash_search_inline_2_40_8(&ip6_main.ip6_mtable.ip6_mhash,
+ rv = clib_bihash_search_inline_2_40_8(&ip6_mfib_table.ip6_mhash,
&key, &value);
if (rv == 0)
return value.value;
@@ -356,7 +358,7 @@ ip6_mfib_table_fwd_lookup (const ip6_mfib_t *mfib,
int i, n, len;
int rv;
- table = &ip6_main.ip6_mtable;
+ table = &ip6_mfib_table;
n = vec_len (table->prefix_lengths_in_search_order);
for (i = 0; i < n; i++)
@@ -421,7 +423,7 @@ ip6_mfib_table_lookup (const ip6_mfib_t *mfib,
ip6_mfib_key_t key, value;
int i, n, rv;
- table = &ip6_main.ip6_mtable;
+ table = &ip6_mfib_table;
n = vec_len (table->prefix_lengths_in_search_order);
/*
@@ -471,7 +473,7 @@ ip6_mfib_table_entry_insert (ip6_mfib_t *mfib,
ip6_mfib_table_instance_t *table;
ip6_mfib_key_t key;
- table = &ip6_main.ip6_mtable;
+ table = &ip6_mfib_table;
IP6_MFIB_MK_KEY(mfib, grp, src, len, key);
key.value = mfib_entry_index;
@@ -497,7 +499,7 @@ ip6_mfib_table_entry_remove (ip6_mfib_t *mfib,
IP6_MFIB_MK_KEY(mfib, grp, src, len, key);
- table = &ip6_main.ip6_mtable;
+ table = &ip6_mfib_table;
clib_bihash_add_del_40_8(&table->ip6_mhash, &key, 0);
ASSERT (table->dst_address_length_refcounts[len] > 0);
@@ -523,7 +525,7 @@ format_ip6_mfib_table_memory (u8 * s, va_list * args)
{
u64 bytes_inuse;
- bytes_inuse = alloc_arena_next(&(ip6_main.ip6_mtable.ip6_mhash));
+ bytes_inuse = alloc_arena_next(&(ip6_mfib_table.ip6_mhash));
s = format(s, "%=30s %=6d %=12ld\n",
"IPv6 multicast",
@@ -634,7 +636,7 @@ ip6_mfib_table_walk (ip6_mfib_t *mfib,
};
clib_bihash_foreach_key_value_pair_40_8(
- &ip6_main.ip6_mtable.ip6_mhash,
+ &ip6_mfib_table.ip6_mhash,
ip6_mfib_walk_cb,
&ctx);
}
@@ -778,3 +780,19 @@ VLIB_CLI_COMMAND (ip6_show_fib_command, static) = {
.function = ip6_show_mfib,
};
/* *INDENT-ON* */
+
+static clib_error_t *
+ip6_mfib_init (vlib_main_t * vm)
+{
+ clib_bihash_init_40_8 (&ip6_mfib_table.ip6_mhash,
+ "ip6 mFIB table",
+ IP6_MFIB_DEFAULT_HASH_NUM_BUCKETS,
+ IP6_MFIB_DEFAULT_HASH_MEMORY_SIZE);
+
+ return (NULL);
+}
+
+VLIB_INIT_FUNCTION (ip6_mfib_init) =
+{
+ .runs_before = VLIB_INITS("ip6_lookup_init"),
+};
diff --git a/src/vnet/mfib/ip6_mfib.h b/src/vnet/mfib/ip6_mfib.h
index f197b9d9fe8..67a821c6b88 100644
--- a/src/vnet/mfib/ip6_mfib.h
+++ b/src/vnet/mfib/ip6_mfib.h
@@ -25,11 +25,40 @@
#ifndef __IP6_MFIB_H__
#define __IP6_MFIB_H__
+#include <vppinfra/bihash_40_8.h>
+#include <vppinfra/bihash_template.h>
+
#include <vlib/vlib.h>
#include <vnet/ip/ip.h>
#include <vnet/mfib/mfib_table.h>
+/*
+ * Default size of the ip6 fib hash table
+ */
+#define IP6_MFIB_DEFAULT_HASH_NUM_BUCKETS (64 * 1024)
+#define IP6_MFIB_DEFAULT_HASH_MEMORY_SIZE (32<<20)
+
+
+/**
+ * A representation of a single IP6 mfib table
+ */
+typedef struct ip6_mfib_table_instance_t_
+{
+ /* The hash table */
+ clib_bihash_40_8_t ip6_mhash;
+
+ /* bitmap / refcounts / vector of mask widths to search */
+ uword *non_empty_dst_address_length_bitmap;
+ u16 *prefix_lengths_in_search_order;
+ i32 dst_address_length_refcounts[257];
+} ip6_mfib_table_instance_t;
+
+/**
+ * the single MFIB table
+ */
+extern ip6_mfib_table_instance_t ip6_mfib_table;
+
extern fib_node_index_t ip6_mfib_table_lookup(const ip6_mfib_t *fib,
const ip6_address_t *src,
const ip6_address_t *grp,
diff --git a/src/vnet/session/transport_types.h b/src/vnet/session/transport_types.h
index d76970f8dca..ab34d9f3397 100644
--- a/src/vnet/session/transport_types.h
+++ b/src/vnet/session/transport_types.h
@@ -19,6 +19,8 @@
#include <vnet/vnet.h>
#include <vnet/ip/ip.h>
#include <vnet/tcp/tcp_debug.h>
+#include <vppinfra/bihash_24_8.h>
+
#define TRANSPORT_MAX_HDRS_LEN 140 /* Max number of bytes for headers */
a> 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560