#include <vnet/ip/ip46_address.h>
#include <vnet/ip/ip6_hop_by_hop_packet.h>
#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;
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. */
/** 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;
extern vlib_node_registration_t ip6_discover_neighbor_node;
extern vlib_node_registration_t ip6_glean_node;
extern vlib_node_registration_t ip6_midchain_node;
+extern vlib_node_registration_t ip6_punt_node;
extern void ip6_forward_next_trace (vlib_main_t * vm,
vlib_node_runtime_t * node,
void ip6_sw_interface_enable_disable (u32 sw_if_index, u32 is_enable);
/**
- * @brie get first IPv6 interface address
+ * @brief get first IPv6 interface address
*/
ip6_address_t *ip6_interface_first_address (ip6_main_t * im, u32 sw_if_index);
0 /* flow label */ );
}
+
+always_inline u32
+vlib_buffer_get_ip6_fib_index (vlib_buffer_t * b)
+{
+ u32 fib_index, sw_if_index;
+ sw_if_index = vnet_buffer (b)->sw_if_index[VLIB_RX];
+ fib_index = vnet_buffer (b)->sw_if_index[VLIB_TX];
+ return (fib_index == (u32) ~ 0) ?
+ vec_elt (ip6_main.fib_index_by_sw_if_index, sw_if_index) : fib_index;
+}
#endif /* included_ip_ip6_h */
/*