ip: Move the IP6 fib into ip6_[m]fib.c
Type: improvement reduce the compile time by moving the bihash includes out of ip[46].h Signed-off-by: Neale Ranns <nranns@cisco.com> Change-Id: I6b9216e10aff1013071f9238b3e1ebbdd205bd80
This commit is contained in:
committed by
Damjan Marion
parent
710d78074e
commit
5a59b2bac4
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
+71
-13
@@ -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"),
|
||||
};
|
||||
|
||||
+49
-1
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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_
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#define included_l2learn_h
|
||||
|
||||
#include <vlib/vlib.h>
|
||||
#include <vppinfra/bihash_8_8.h>
|
||||
#include <vnet/ethernet/ethernet.h>
|
||||
|
||||
|
||||
|
||||
@@ -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"),
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user