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:
Neale Ranns
2020-10-19 14:47:20 +00:00
committed by Damjan Marion
parent 710d78074e
commit 5a59b2bac4
15 changed files with 186 additions and 153 deletions
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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];
+4 -6
View File
@@ -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;
+1 -1
View File
@@ -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_
{
-72
View File
@@ -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;
-46
View File
@@ -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
*
+1 -2
View File
@@ -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");
-2
View File
@@ -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>
+2 -1
View File
@@ -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.
+1
View File
@@ -19,6 +19,7 @@
#define included_l2learn_h
#include <vlib/vlib.h>
#include <vppinfra/bihash_8_8.h>
#include <vnet/ethernet/ethernet.h>
+25 -7
View File
@@ -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"),
};
+29
View File
@@ -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,
+2
View File
@@ -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 */