summaryrefslogtreecommitdiffstats
path: root/vnet/vnet/lisp-gpe/ip_forward.c
diff options
context:
space:
mode:
Diffstat (limited to 'vnet/vnet/lisp-gpe/ip_forward.c')
-rw-r--r--vnet/vnet/lisp-gpe/ip_forward.c1440
1 files changed, 730 insertions, 710 deletions
diff --git a/vnet/vnet/lisp-gpe/ip_forward.c b/vnet/vnet/lisp-gpe/ip_forward.c
index 98c52226280..d8ddfd8f016 100644
--- a/vnet/vnet/lisp-gpe/ip_forward.c
+++ b/vnet/vnet/lisp-gpe/ip_forward.c
@@ -18,15 +18,15 @@
/* avoids calling route callbacks for src fib */
static void
ip4_sd_fib_set_adj_index (lisp_gpe_main_t * lgm, ip4_fib_t * fib, u32 flags,
- u32 dst_address_u32, u32 dst_address_length,
- u32 adj_index)
+ u32 dst_address_u32, u32 dst_address_length,
+ u32 adj_index)
{
- ip_lookup_main_t * lm = lgm->lm4;
- uword * hash;
+ ip_lookup_main_t *lm = lgm->lm4;
+ uword *hash;
- if (vec_bytes(fib->old_hash_values))
+ if (vec_bytes (fib->old_hash_values))
memset (fib->old_hash_values, ~0, vec_bytes (fib->old_hash_values));
- if (vec_bytes(fib->new_hash_values))
+ if (vec_bytes (fib->new_hash_values))
memset (fib->new_hash_values, ~0, vec_bytes (fib->new_hash_values));
fib->new_hash_values[0] = adj_index;
@@ -37,8 +37,7 @@ ip4_sd_fib_set_adj_index (lisp_gpe_main_t * lgm, ip4_fib_t * fib, u32 flags,
hash = fib->adj_index_by_dst_address[dst_address_length];
hash = _hash_set3 (hash, dst_address_u32,
- fib->new_hash_values,
- fib->old_hash_values);
+ fib->new_hash_values, fib->old_hash_values);
fib->adj_index_by_dst_address[dst_address_length] = hash;
}
@@ -46,21 +45,20 @@ ip4_sd_fib_set_adj_index (lisp_gpe_main_t * lgm, ip4_fib_t * fib, u32 flags,
/* copied from ip4_forward since it's static */
static void
ip4_fib_init_adj_index_by_dst_address (ip_lookup_main_t * lm,
- ip4_fib_t * fib,
- u32 address_length)
+ ip4_fib_t * fib, u32 address_length)
{
- hash_t * h;
+ hash_t *h;
uword max_index;
ASSERT (lm->fib_result_n_bytes >= sizeof (uword));
- lm->fib_result_n_words = round_pow2 (lm->fib_result_n_bytes, sizeof(uword))
- / sizeof(uword);
+ lm->fib_result_n_words = round_pow2 (lm->fib_result_n_bytes, sizeof (uword))
+ / sizeof (uword);
fib->adj_index_by_dst_address[address_length] =
- hash_create (32 /* elts */, lm->fib_result_n_words * sizeof (uword));
+ hash_create (32 /* elts */ , lm->fib_result_n_words * sizeof (uword));
hash_set_flags (fib->adj_index_by_dst_address[address_length],
- HASH_FLAG_NO_AUTO_SHRINK);
+ HASH_FLAG_NO_AUTO_SHRINK);
h = hash_header (fib->adj_index_by_dst_address[address_length]);
max_index = (hash_value_bytes (h) / sizeof (fib->new_hash_values[0])) - 1;
@@ -72,25 +70,25 @@ ip4_fib_init_adj_index_by_dst_address (ip_lookup_main_t * lm,
static void
ip4_sd_fib_add_del_src_route (lisp_gpe_main_t * lgm,
- ip4_add_del_route_args_t * a)
+ ip4_add_del_route_args_t * a)
{
- ip_lookup_main_t * lm = lgm->lm4;
- ip4_fib_t * fib;
+ ip_lookup_main_t *lm = lgm->lm4;
+ ip4_fib_t *fib;
u32 dst_address, dst_address_length, adj_index, old_adj_index;
- uword * hash, is_del;
+ uword *hash, is_del;
/* Either create new adjacency or use given one depending on arguments. */
if (a->n_add_adj > 0)
- ip_add_adjacency (lm, a->add_adj, a->n_add_adj, &adj_index);
+ ip_add_adjacency (lm, a->add_adj, a->n_add_adj, &adj_index);
else
adj_index = a->adj_index;
dst_address = a->dst_address.data_u32;
dst_address_length = a->dst_address_length;
- fib = pool_elt_at_index(lgm->ip4_src_fibs, a->table_index_or_table_id);
+ fib = pool_elt_at_index (lgm->ip4_src_fibs, a->table_index_or_table_id);
- if (! fib->adj_index_by_dst_address[dst_address_length])
+ if (!fib->adj_index_by_dst_address[dst_address_length])
ip4_fib_init_adj_index_by_dst_address (lm, fib, dst_address_length);
hash = fib->adj_index_by_dst_address[dst_address_length];
@@ -105,83 +103,86 @@ ip4_sd_fib_add_del_src_route (lisp_gpe_main_t * lgm,
}
else
ip4_sd_fib_set_adj_index (lgm, fib, a->flags, dst_address,
- dst_address_length, adj_index);
+ dst_address_length, adj_index);
old_adj_index = fib->old_hash_values[0];
/* Avoid spurious reference count increments */
if (old_adj_index == adj_index
- && adj_index != ~0
- && !(a->flags & IP4_ROUTE_FLAG_KEEP_OLD_ADJACENCY))
+ && adj_index != ~0 && !(a->flags & IP4_ROUTE_FLAG_KEEP_OLD_ADJACENCY))
{
- ip_adjacency_t * adj = ip_get_adjacency (lm, adj_index);
+ ip_adjacency_t *adj = ip_get_adjacency (lm, adj_index);
if (adj->share_count > 0)
- adj->share_count --;
+ adj->share_count--;
}
ip4_fib_mtrie_add_del_route (fib, a->dst_address, dst_address_length,
- is_del ? old_adj_index : adj_index,
- is_del);
+ is_del ? old_adj_index : adj_index, is_del);
/* Delete old adjacency index if present and changed. */
- if (! (a->flags & IP4_ROUTE_FLAG_KEEP_OLD_ADJACENCY)
- && old_adj_index != ~0
- && old_adj_index != adj_index)
+ if (!(a->flags & IP4_ROUTE_FLAG_KEEP_OLD_ADJACENCY)
+ && old_adj_index != ~0 && old_adj_index != adj_index)
ip_del_adjacency (lm, old_adj_index);
}
static void *
ip4_sd_get_src_route (lisp_gpe_main_t * lgm, u32 src_fib_index,
- ip4_address_t * src, u32 address_length)
+ ip4_address_t * src, u32 address_length)
{
- ip4_fib_t * fib = pool_elt_at_index (lgm->ip4_src_fibs, src_fib_index);
- uword * hash, * p;
+ ip4_fib_t *fib = pool_elt_at_index (lgm->ip4_src_fibs, src_fib_index);
+ uword *hash, *p;
hash = fib->adj_index_by_dst_address[address_length];
p = hash_get (hash, src->as_u32);
return (void *) p;
}
+/* *INDENT-OFF* */
typedef CLIB_PACKED (struct ip4_route {
ip4_address_t address;
u32 address_length : 6;
u32 index : 26;
}) ip4_route_t;
+/* *INDENT-ON* */
void
ip4_sd_fib_clear_src_fib (lisp_gpe_main_t * lgm, ip4_fib_t * fib)
{
- ip4_route_t * routes = 0, * r;
+ ip4_route_t *routes = 0, *r;
u32 i;
vec_reset_length (routes);
- for (i = 0; i < ARRAY_LEN (fib->adj_index_by_dst_address); i++) {
- uword * hash = fib->adj_index_by_dst_address[i];
- hash_pair_t * p;
+ for (i = 0; i < ARRAY_LEN (fib->adj_index_by_dst_address); i++)
+ {
+ uword *hash = fib->adj_index_by_dst_address[i];
+ hash_pair_t *p;
ip4_route_t x;
x.address_length = i;
- x.index = 0; /* shut up coverity */
+ x.index = 0; /* shut up coverity */
+ /* *INDENT-OFF* */
hash_foreach_pair (p, hash,
({
x.address.data_u32 = p->key;
vec_add1 (routes, x);
}));
- }
+ /* *INDENT-ON* */
+ }
- vec_foreach (r, routes) {
- ip4_add_del_route_args_t a;
+ vec_foreach (r, routes)
+ {
+ ip4_add_del_route_args_t a;
- memset (&a, 0, sizeof (a));
- a.flags = IP4_ROUTE_FLAG_FIB_INDEX | IP4_ROUTE_FLAG_DEL;
- a.table_index_or_table_id = fib - lgm->ip4_src_fibs;
- a.dst_address = r->address;
- a.dst_address_length = r->address_length;
- a.adj_index = ~0;
+ memset (&a, 0, sizeof (a));
+ a.flags = IP4_ROUTE_FLAG_FIB_INDEX | IP4_ROUTE_FLAG_DEL;
+ a.table_index_or_table_id = fib - lgm->ip4_src_fibs;
+ a.dst_address = r->address;
+ a.dst_address_length = r->address_length;
+ a.adj_index = ~0;
- ip4_sd_fib_add_del_src_route (lgm, &a);
+ ip4_sd_fib_add_del_src_route (lgm, &a);
}
}
@@ -194,36 +195,36 @@ ip4_fib_is_empty (ip4_fib_t * fib)
fib_is_empty = 1;
for (i = ARRAY_LEN (fib->adj_index_by_dst_address) - 1; i >= 0; i--)
{
- uword * hash = fib->adj_index_by_dst_address[i];
+ uword *hash = fib->adj_index_by_dst_address[i];
uword n_elts = hash_elts (hash);
if (n_elts)
- {
- fib_is_empty = 0;
- break;
- }
+ {
+ fib_is_empty = 0;
+ break;
+ }
}
return fib_is_empty;
}
static int
ip4_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
- ip_prefix_t * src_prefix, u32 table_id,
- ip_adjacency_t * add_adj, u8 is_add)
+ ip_prefix_t * src_prefix, u32 table_id,
+ ip_adjacency_t * add_adj, u8 is_add)
{
- uword * p;
+ uword *p;
ip4_add_del_route_args_t a;
- ip_adjacency_t * dst_adjp, dst_adj;
- ip4_address_t dst = ip_prefix_v4(dst_prefix), src;
- u32 dst_address_length = ip_prefix_len(dst_prefix), src_address_length = 0;
- ip4_fib_t * src_fib;
+ ip_adjacency_t *dst_adjp, dst_adj;
+ ip4_address_t dst = ip_prefix_v4 (dst_prefix), src;
+ u32 dst_address_length = ip_prefix_len (dst_prefix), src_address_length = 0;
+ ip4_fib_t *src_fib;
if (src_prefix)
{
- src = ip_prefix_v4(src_prefix);
- src_address_length = ip_prefix_len(src_prefix);
+ src = ip_prefix_v4 (src_prefix);
+ src_address_length = ip_prefix_len (src_prefix);
}
else
- memset(&src, 0, sizeof(src));
+ memset (&src, 0, sizeof (src));
/* lookup dst adj */
p = ip4_get_route (lgm->im4, table_id, 0, dst.as_u8, dst_address_length);
@@ -232,71 +233,71 @@ ip4_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
{
/* insert dst prefix to ip4 fib, if it's not in yet */
if (p == 0)
- {
- /* allocate and init src ip4 fib */
- pool_get(lgm->ip4_src_fibs, src_fib);
- ip4_mtrie_init (&src_fib->mtrie);
-
- /* configure adjacency */
- memset(&dst_adj, 0, sizeof(dst_adj));
-
- /* reuse rewrite header to store pointer to src fib */
- dst_adj.rewrite_header.sw_if_index = src_fib - lgm->ip4_src_fibs;
-
- /* dst adj should point to lisp gpe lookup */
- dst_adj.lookup_next_index = lgm->ip4_lookup_next_lgpe_ip4_lookup;
-
- /* explicit_fib_index is used in IP6 FIB lookup, don't reuse it */
- dst_adj.explicit_fib_index = ~0;
- dst_adj.n_adj = 1;
-
- /* make sure we have different signatures for adj in different tables
- * but with the same lookup_next_index and for adj in the same table
- * but associated to different destinations */
- dst_adj.if_address_index = table_id;
- dst_adj.indirect.next_hop.ip4 = dst;
-
- memset(&a, 0, sizeof(a));
- a.flags = IP4_ROUTE_FLAG_TABLE_ID;
- a.table_index_or_table_id = table_id; /* vrf */
- a.adj_index = ~0;
- a.dst_address_length = dst_address_length;
- a.dst_address = dst;
- a.flags |= IP4_ROUTE_FLAG_ADD;
- a.add_adj = &dst_adj;
- a.n_add_adj = 1;
-
- ip4_add_del_route (lgm->im4, &a);
-
- /* lookup dst adj to obtain the adj index */
- p = ip4_get_route (lgm->im4, table_id, 0, dst.as_u8,
- dst_address_length);
-
- /* make sure insertion succeeded */
- if (CLIB_DEBUG)
- {
- ASSERT(p != 0);
- dst_adjp = ip_get_adjacency (lgm->lm4, p[0]);
- ASSERT(dst_adjp->rewrite_header.sw_if_index
- == dst_adj.rewrite_header.sw_if_index);
- }
- }
+ {
+ /* allocate and init src ip4 fib */
+ pool_get (lgm->ip4_src_fibs, src_fib);
+ ip4_mtrie_init (&src_fib->mtrie);
+
+ /* configure adjacency */
+ memset (&dst_adj, 0, sizeof (dst_adj));
+
+ /* reuse rewrite header to store pointer to src fib */
+ dst_adj.rewrite_header.sw_if_index = src_fib - lgm->ip4_src_fibs;
+
+ /* dst adj should point to lisp gpe lookup */
+ dst_adj.lookup_next_index = lgm->ip4_lookup_next_lgpe_ip4_lookup;
+
+ /* explicit_fib_index is used in IP6 FIB lookup, don't reuse it */
+ dst_adj.explicit_fib_index = ~0;
+ dst_adj.n_adj = 1;
+
+ /* make sure we have different signatures for adj in different tables
+ * but with the same lookup_next_index and for adj in the same table
+ * but associated to different destinations */
+ dst_adj.if_address_index = table_id;
+ dst_adj.indirect.next_hop.ip4 = dst;
+
+ memset (&a, 0, sizeof (a));
+ a.flags = IP4_ROUTE_FLAG_TABLE_ID;
+ a.table_index_or_table_id = table_id; /* vrf */
+ a.adj_index = ~0;
+ a.dst_address_length = dst_address_length;
+ a.dst_address = dst;
+ a.flags |= IP4_ROUTE_FLAG_ADD;
+ a.add_adj = &dst_adj;
+ a.n_add_adj = 1;
+
+ ip4_add_del_route (lgm->im4, &a);
+
+ /* lookup dst adj to obtain the adj index */
+ p = ip4_get_route (lgm->im4, table_id, 0, dst.as_u8,
+ dst_address_length);
+
+ /* make sure insertion succeeded */
+ if (CLIB_DEBUG)
+ {
+ ASSERT (p != 0);
+ dst_adjp = ip_get_adjacency (lgm->lm4, p[0]);
+ ASSERT (dst_adjp->rewrite_header.sw_if_index
+ == dst_adj.rewrite_header.sw_if_index);
+ }
+ }
}
else
{
if (p == 0)
- {
- clib_warning("Trying to delete inexistent dst route for %U. Aborting",
- format_ip4_address_and_length, dst.as_u8,
- dst_address_length);
- return -1;
- }
+ {
+ clib_warning
+ ("Trying to delete inexistent dst route for %U. Aborting",
+ format_ip4_address_and_length, dst.as_u8, dst_address_length);
+ return -1;
+ }
}
dst_adjp = ip_get_adjacency (lgm->lm4, p[0]);
/* add/del src prefix to src fib */
- memset(&a, 0, sizeof(a));
+ memset (&a, 0, sizeof (a));
a.flags = IP4_ROUTE_FLAG_TABLE_ID;
a.table_index_or_table_id = dst_adjp->rewrite_header.sw_if_index;
a.adj_index = ~0;
@@ -311,40 +312,40 @@ ip4_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
/* make sure insertion succeeded */
if (CLIB_DEBUG && is_add)
{
- uword * sai;
- ip_adjacency_t * src_adjp;
+ uword *sai;
+ ip_adjacency_t *src_adjp;
sai = ip4_sd_get_src_route (lgm, dst_adjp->rewrite_header.sw_if_index,
- &src, src_address_length);
- ASSERT(sai != 0);
- src_adjp = ip_get_adjacency(lgm->lm4, sai[0]);
- ASSERT(src_adjp->if_address_index == add_adj->if_address_index);
+ &src, src_address_length);
+ ASSERT (sai != 0);
+ src_adjp = ip_get_adjacency (lgm->lm4, sai[0]);
+ ASSERT (src_adjp->if_address_index == add_adj->if_address_index);
}
/* if a delete, check if there are elements left in the src fib */
if (!is_add)
{
- src_fib = pool_elt_at_index(lgm->ip4_src_fibs,
- dst_adjp->rewrite_header.sw_if_index);
+ src_fib = pool_elt_at_index (lgm->ip4_src_fibs,
+ dst_adjp->rewrite_header.sw_if_index);
if (!src_fib)
- return 0;
+ return 0;
/* if there's nothing left */
- if (ip4_fib_is_empty(src_fib))
- {
- /* remove the src fib .. */
- pool_put(lgm->ip4_src_fibs, src_fib);
-
- /* .. and remove dst route */
- memset(&a, 0, sizeof(a));
- a.flags = IP4_ROUTE_FLAG_TABLE_ID;
- a.table_index_or_table_id = table_id; /* vrf */
- a.adj_index = ~0;
- a.dst_address_length = dst_address_length;
- a.dst_address = dst;
- a.flags |= IP4_ROUTE_FLAG_DEL;
-
- ip4_add_del_route (lgm->im4, &a);
- }
+ if (ip4_fib_is_empty (src_fib))
+ {
+ /* remove the src fib .. */
+ pool_put (lgm->ip4_src_fibs, src_fib);
+
+ /* .. and remove dst route */
+ memset (&a, 0, sizeof (a));
+ a.flags = IP4_ROUTE_FLAG_TABLE_ID;
+ a.table_index_or_table_id = table_id; /* vrf */
+ a.adj_index = ~0;
+ a.dst_address_length = dst_address_length;
+ a.dst_address = dst;
+ a.flags |= IP4_ROUTE_FLAG_DEL;
+
+ ip4_add_del_route (lgm->im4, &a);
+ }
}
return 0;
@@ -352,42 +353,42 @@ ip4_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
static void *
ip4_sd_fib_get_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
- ip_prefix_t * src_prefix, u32 table_id)
+ ip_prefix_t * src_prefix, u32 table_id)
{
- uword * p;
- ip4_address_t dst = ip_prefix_v4(dst_prefix), src;
- u32 dst_address_length = ip_prefix_len(dst_prefix), src_address_length = 0;
- ip_adjacency_t * dst_adj;
+ uword *p;
+ ip4_address_t dst = ip_prefix_v4 (dst_prefix), src;
+ u32 dst_address_length = ip_prefix_len (dst_prefix), src_address_length = 0;
+ ip_adjacency_t *dst_adj;
if (src_prefix)
{
- src = ip_prefix_v4(src_prefix);
- src_address_length = ip_prefix_len(src_prefix);
+ src = ip_prefix_v4 (src_prefix);
+ src_address_length = ip_prefix_len (src_prefix);
}
else
- memset(&src, 0, sizeof(src));
+ memset (&src, 0, sizeof (src));
/* lookup dst adj */
p = ip4_get_route (lgm->im4, table_id, 0, dst.as_u8, dst_address_length);
if (p == 0)
- return p;
+ return p;
dst_adj = ip_get_adjacency (lgm->lm4, p[0]);
return ip4_sd_get_src_route (lgm, dst_adj->rewrite_header.sw_if_index, &src,
- src_address_length);
+ src_address_length);
}
static u32
ip6_sd_get_src_route (lisp_gpe_main_t * lgm, u32 src_fib_index,
- ip6_address_t * src, u32 address_length)
+ ip6_address_t * src, u32 address_length)
{
int rv;
- BVT(clib_bihash_kv) kv, value;
- ip6_src_fib_t * fib = pool_elt_at_index (lgm->ip6_src_fibs, src_fib_index);
+ BVT (clib_bihash_kv) kv, value;
+ ip6_src_fib_t *fib = pool_elt_at_index (lgm->ip6_src_fibs, src_fib_index);
- ip6_address_t * mask;
+ ip6_address_t *mask;
- ASSERT(address_length <= 128);
+ ASSERT (address_length <= 128);
mask = &fib->fib_masks[address_length];
@@ -395,7 +396,7 @@ ip6_sd_get_src_route (lisp_gpe_main_t * lgm, u32 src_fib_index,
kv.key[1] = src->as_u64[1] & mask->as_u64[1];
kv.key[2] = address_length;
- rv = BV(clib_bihash_search_inline_2)(&fib->ip6_lookup_table, &kv, &value);
+ rv = BV (clib_bihash_search_inline_2) (&fib->ip6_lookup_table, &kv, &value);
if (rv == 0)
return value.value;
@@ -406,28 +407,31 @@ static void
compute_prefix_lengths_in_search_order (ip6_src_fib_t * fib)
{
int i;
- vec_reset_length(fib->prefix_lengths_in_search_order);
+ vec_reset_length (fib->prefix_lengths_in_search_order);
/* Note: bitmap reversed so this is in fact a longest prefix match */
+
+ /* *INDENT-OFF* */
clib_bitmap_foreach(i, fib->non_empty_dst_address_length_bitmap, ({
int dst_address_length = 128 - i;
vec_add1 (fib->prefix_lengths_in_search_order, dst_address_length);
}));
+ /* *INDENT-ON* */
}
/* Rewrite of ip6_add_del_route() because it uses im6 to find the fib */
static void
ip6_sd_fib_add_del_src_route (lisp_gpe_main_t * lgm,
- ip6_add_del_route_args_t * a)
+ ip6_add_del_route_args_t * a)
{
- ip_lookup_main_t * lm = lgm->lm6;
- ip6_src_fib_t * fib;
+ ip_lookup_main_t *lm = lgm->lm6;
+ ip6_src_fib_t *fib;
ip6_address_t dst_address;
u32 dst_address_length, adj_index;
uword is_del;
u32 old_adj_index = ~0;
- BVT(clib_bihash_kv) kv, value;
+ BVT (clib_bihash_kv) kv, value;
- vlib_smp_unsafe_warning();
+ vlib_smp_unsafe_warning ();
is_del = (a->flags & IP6_ROUTE_FLAG_DEL) != 0;
@@ -441,7 +445,7 @@ ip6_sd_fib_add_del_src_route (lisp_gpe_main_t * lgm,
dst_address = a->dst_address;
dst_address_length = a->dst_address_length;
- fib = pool_elt_at_index(lgm->ip6_src_fibs, a->table_index_or_table_id);
+ fib = pool_elt_at_index (lgm->ip6_src_fibs, a->table_index_or_table_id);
ASSERT (dst_address_length < ARRAY_LEN (fib->fib_masks));
ip6_address_mask (&dst_address, &fib->fib_masks[dst_address_length]);
@@ -449,22 +453,22 @@ ip6_sd_fib_add_del_src_route (lisp_gpe_main_t * lgm,
/* refcount accounting */
if (is_del)
{
- ASSERT(fib->dst_address_length_refcounts[dst_address_length] > 0);
+ ASSERT (fib->dst_address_length_refcounts[dst_address_length] > 0);
if (--fib->dst_address_length_refcounts[dst_address_length] == 0)
- {
- fib->non_empty_dst_address_length_bitmap = clib_bitmap_set (
- fib->non_empty_dst_address_length_bitmap,
- 128 - dst_address_length, 0);
- compute_prefix_lengths_in_search_order (fib);
- }
+ {
+ fib->non_empty_dst_address_length_bitmap =
+ clib_bitmap_set (fib->non_empty_dst_address_length_bitmap,
+ 128 - dst_address_length, 0);
+ compute_prefix_lengths_in_search_order (fib);
+ }
}
else
{
fib->dst_address_length_refcounts[dst_address_length]++;
fib->non_empty_dst_address_length_bitmap =
- clib_bitmap_set (fib->non_empty_dst_address_length_bitmap,
- 128 - dst_address_length, 1);
+ clib_bitmap_set (fib->non_empty_dst_address_length_bitmap,
+ 128 - dst_address_length, 1);
compute_prefix_lengths_in_search_order (fib);
}
@@ -472,36 +476,35 @@ ip6_sd_fib_add_del_src_route (lisp_gpe_main_t * lgm,
kv.key[1] = dst_address.as_u64[1];
kv.key[2] = dst_address_length;
- if (BV(clib_bihash_search)(&fib->ip6_lookup_table, &kv, &value) == 0)
+ if (BV (clib_bihash_search) (&fib->ip6_lookup_table, &kv, &value) == 0)
old_adj_index = value.value;
if (is_del)
- BV(clib_bihash_add_del) (&fib->ip6_lookup_table, &kv, 0 /* is_add */);
+ BV (clib_bihash_add_del) (&fib->ip6_lookup_table, &kv, 0 /* is_add */ );
else
{
/* Make sure adj index is valid. */
if (CLIB_DEBUG > 0)
- (void) ip_get_adjacency (lm, adj_index);
+ (void) ip_get_adjacency (lm, adj_index);
kv.value = adj_index;
- BV(clib_bihash_add_del) (&fib->ip6_lookup_table, &kv, 1 /* is_add */);
+ BV (clib_bihash_add_del) (&fib->ip6_lookup_table, &kv, 1 /* is_add */ );
}
/* Avoid spurious reference count increments */
if (old_adj_index == adj_index
&& !(a->flags & IP6_ROUTE_FLAG_KEEP_OLD_ADJACENCY))
{
- ip_adjacency_t * adj = ip_get_adjacency (lm, adj_index);
+ ip_adjacency_t *adj = ip_get_adjacency (lm, adj_index);
if (adj->share_count > 0)
- adj->share_count --;
+ adj->share_count--;
}
/* Delete old adjacency index if present and changed. */
{
- if (! (a->flags & IP6_ROUTE_FLAG_KEEP_OLD_ADJACENCY)
- && old_adj_index != ~0
- && old_adj_index != adj_index)
+ if (!(a->flags & IP6_ROUTE_FLAG_KEEP_OLD_ADJACENCY)
+ && old_adj_index != ~0 && old_adj_index != adj_index)
ip_del_adjacency (lm, old_adj_index);
}
}
@@ -519,11 +522,11 @@ ip6_src_fib_init (ip6_src_fib_t * fib)
i1 = i % 32;
for (j = 0; j < i0; j++)
- fib->fib_masks[i].as_u32[j] = ~0;
+ fib->fib_masks[i].as_u32[j] = ~0;
if (i1)
- fib->fib_masks[i].as_u32[i0] = clib_host_to_net_u32 (
- pow2_mask (i1) << (32 - i1));
+ fib->fib_masks[i].as_u32[i0] =
+ clib_host_to_net_u32 (pow2_mask (i1) << (32 - i1));
}
if (fib->lookup_table_nbuckets == 0)
@@ -534,31 +537,30 @@ ip6_src_fib_init (ip6_src_fib_t * fib)
if (fib->lookup_table_size == 0)
fib->lookup_table_size = IP6_FIB_DEFAULT_HASH_MEMORY_SIZE;
- BV(clib_bihash_init) (&fib->ip6_lookup_table, "ip6 lookup table",
- fib->lookup_table_nbuckets,
- fib->lookup_table_size);
+ BV (clib_bihash_init) (&fib->ip6_lookup_table, "ip6 lookup table",
+ fib->lookup_table_nbuckets, fib->lookup_table_size);
}
static int
ip6_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
- ip_prefix_t * src_prefix, u32 table_id,
- ip_adjacency_t * add_adj, u8 is_add)
+ ip_prefix_t * src_prefix, u32 table_id,
+ ip_adjacency_t * add_adj, u8 is_add)
{
u32 adj_index;
ip6_add_del_route_args_t a;
- ip_adjacency_t * dst_adjp, dst_adj;
- ip6_address_t dst = ip_prefix_v6(dst_prefix), src;
- u32 dst_address_length = ip_prefix_len(dst_prefix), src_address_length = 0;
- ip6_src_fib_t * src_fib;
+ ip_adjacency_t *dst_adjp, dst_adj;
+ ip6_address_t dst = ip_prefix_v6 (dst_prefix), src;
+ u32 dst_address_length = ip_prefix_len (dst_prefix), src_address_length = 0;
+ ip6_src_fib_t *src_fib;
if (src_prefix)
{
- src = ip_prefix_v6(src_prefix);
- src_address_length = ip_prefix_len(src_prefix);
+ src = ip_prefix_v6 (src_prefix);
+ src_address_length = ip_prefix_len (src_prefix);
}
else
- memset(&src, 0, sizeof(src));
+ memset (&src, 0, sizeof (src));
/* lookup dst adj and create it if it doesn't exist */
adj_index = ip6_get_route (lgm->im6, table_id, 0, &dst, dst_address_length);
@@ -567,70 +569,71 @@ ip6_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
{
/* insert dst prefix to ip6 fib, if it's not in yet */
if (adj_index == 0)
- {
- /* allocate and init src ip6 fib */
- pool_get(lgm->ip6_src_fibs, src_fib);
- memset(src_fib, 0, sizeof(src_fib[0]));
- ip6_src_fib_init (src_fib);
-
- memset(&dst_adj, 0, sizeof(dst_adj));
-
- /* reuse rewrite header to store pointer to src fib */
- dst_adj.rewrite_header.sw_if_index = src_fib - lgm->ip6_src_fibs;
-
- /* dst adj should point to lisp gpe ip lookup */
- dst_adj.lookup_next_index = lgm->ip6_lookup_next_lgpe_ip6_lookup;
-
- /* explicit_fib_index is used in IP6 FIB lookup, don't reuse it */
- dst_adj.explicit_fib_index = ~0;
- dst_adj.n_adj = 1;
-
- /* make sure we have different signatures for adj in different tables
- * but with the same lookup_next_index and for adj in the same table
- * but associated to different destinations */
- dst_adj.if_address_index = table_id;
- dst_adj.indirect.next_hop.ip6 = dst;
-
- memset(&a, 0, sizeof(a));
- a.flags = IP6_ROUTE_FLAG_TABLE_ID;
- a.table_index_or_table_id = table_id; /* vrf */
- a.adj_index = ~0;
- a.dst_address_length = dst_address_length;
- a.dst_address = dst;
- a.flags |= IP6_ROUTE_FLAG_ADD;
- a.add_adj = &dst_adj;
- a.n_add_adj = 1;
-
- ip6_add_del_route (lgm->im6, &a);
-
- /* lookup dst adj to obtain the adj index */
- adj_index = ip6_get_route (lgm->im6, table_id, 0, &dst,
- dst_address_length);
-
- /* make sure insertion succeeded */
- if (CLIB_DEBUG)
- {
- ASSERT(adj_index != 0);
- dst_adjp = ip_get_adjacency (lgm->lm6, adj_index);
- ASSERT(dst_adjp->rewrite_header.sw_if_index
- == dst_adj.rewrite_header.sw_if_index);
- }
- }
+ {
+ /* allocate and init src ip6 fib */
+ pool_get (lgm->ip6_src_fibs, src_fib);
+ memset (src_fib, 0, sizeof (src_fib[0]));
+ ip6_src_fib_init (src_fib);
+
+ memset (&dst_adj, 0, sizeof (dst_adj));
+
+ /* reuse rewrite header to store pointer to src fib */
+ dst_adj.rewrite_header.sw_if_index = src_fib - lgm->ip6_src_fibs;
+
+ /* dst adj should point to lisp gpe ip lookup */
+ dst_adj.lookup_next_index = lgm->ip6_lookup_next_lgpe_ip6_lookup;
+
+ /* explicit_fib_index is used in IP6 FIB lookup, don't reuse it */
+ dst_adj.explicit_fib_index = ~0;
+ dst_adj.n_adj = 1;
+
+ /* make sure we have different signatures for adj in different tables
+ * but with the same lookup_next_index and for adj in the same table
+ * but associated to different destinations */
+ dst_adj.if_address_index = table_id;
+ dst_adj.indirect.next_hop.ip6 = dst;
+
+ memset (&a, 0, sizeof (a));
+ a.flags = IP6_ROUTE_FLAG_TABLE_ID;
+ a.table_index_or_table_id = table_id; /* vrf */
+ a.adj_index = ~0;
+ a.dst_address_length = dst_address_length;
+ a.dst_address = dst;
+ a.flags |= IP6_ROUTE_FLAG_ADD;
+ a.add_adj = &dst_adj;
+ a.n_add_adj = 1;
+
+ ip6_add_del_route (lgm->im6, &a);
+
+ /* lookup dst adj to obtain the adj index */
+ adj_index = ip6_get_route (lgm->im6, table_id, 0, &dst,
+ dst_address_length);
+
+ /* make sure insertion succeeded */
+ if (CLIB_DEBUG)
+ {
+ ASSERT (adj_index != 0);
+ dst_adjp = ip_get_adjacency (lgm->lm6, adj_index);
+ ASSERT (dst_adjp->rewrite_header.sw_if_index
+ == dst_adj.rewrite_header.sw_if_index);
+ }
+ }
}
else
{
if (adj_index == 0)
- {
- clib_warning("Trying to delete inexistent dst route for %U. Aborting",
- format_ip_prefix, dst_prefix);
- return -1;
- }
+ {
+ clib_warning
+ ("Trying to delete inexistent dst route for %U. Aborting",
+ format_ip_prefix, dst_prefix);
+ return -1;
+ }
}
dst_adjp = ip_get_adjacency (lgm->lm6, adj_index);
/* add/del src prefix to src fib */
- memset(&a, 0, sizeof(a));
+ memset (&a, 0, sizeof (a));
a.flags = IP6_ROUTE_FLAG_TABLE_ID;
a.table_index_or_table_id = dst_adjp->rewrite_header.sw_if_index;
a.adj_index = ~0;
@@ -646,40 +649,40 @@ ip6_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
if (CLIB_DEBUG && is_add)
{
u32 sai;
- ip_adjacency_t * src_adjp;
+ ip_adjacency_t *src_adjp;
sai = ip6_sd_get_src_route (lgm, dst_adjp->rewrite_header.sw_if_index,
- &src, src_address_length);
- ASSERT(sai != 0);
- src_adjp = ip_get_adjacency(lgm->lm6, sai);
- ASSERT(src_adjp->if_address_index == add_adj->if_address_index);
+ &src, src_address_length);
+ ASSERT (sai != 0);
+ src_adjp = ip_get_adjacency (lgm->lm6, sai);
+ ASSERT (src_adjp->if_address_index == add_adj->if_address_index);
}
/* if a delete, check if there are elements left in the src fib */
if (!is_add)
{
- src_fib = pool_elt_at_index(lgm->ip6_src_fibs,
- dst_adjp->rewrite_header.sw_if_index);
+ src_fib = pool_elt_at_index (lgm->ip6_src_fibs,
+ dst_adjp->rewrite_header.sw_if_index);
if (!src_fib)
- return 0;
+ return 0;
/* if there's nothing left */
- if (clib_bitmap_count_set_bits (
- src_fib->non_empty_dst_address_length_bitmap) == 0)
- {
- /* remove src fib .. */
- pool_put(lgm->ip6_src_fibs, src_fib);
-
- /* .. and remove dst route */
- memset(&a, 0, sizeof(a));
- a.flags = IP6_ROUTE_FLAG_TABLE_ID;
- a.table_index_or_table_id = table_id; /* vrf */
- a.adj_index = ~0;
- a.dst_address_length = dst_address_length;
- a.dst_address = dst;
- a.flags |= IP6_ROUTE_FLAG_DEL;
-
- ip6_add_del_route (lgm->im6, &a);
- }
+ if (clib_bitmap_count_set_bits
+ (src_fib->non_empty_dst_address_length_bitmap) == 0)
+ {
+ /* remove src fib .. */
+ pool_put (lgm->ip6_src_fibs, src_fib);
+
+ /* .. and remove dst route */
+ memset (&a, 0, sizeof (a));
+ a.flags = IP6_ROUTE_FLAG_TABLE_ID;
+ a.table_index_or_table_id = table_id; /* vrf */
+ a.adj_index = ~0;
+ a.dst_address_length = dst_address_length;
+ a.dst_address = dst;
+ a.flags |= IP6_ROUTE_FLAG_DEL;
+
+ ip6_add_del_route (lgm->im6, &a);
+ }
}
return 0;
@@ -687,52 +690,53 @@ ip6_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
static u32
ip6_sd_fib_get_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
- ip_prefix_t * src_prefix, u32 table_id)
+ ip_prefix_t * src_prefix, u32 table_id)
{
u32 adj_index;
- ip6_address_t dst = ip_prefix_v6(dst_prefix), src;
- u32 dst_address_length = ip_prefix_len(dst_prefix), src_address_length = 0;
- ip_adjacency_t * dst_adj;
+ ip6_address_t dst = ip_prefix_v6 (dst_prefix), src;
+ u32 dst_address_length = ip_prefix_len (dst_prefix), src_address_length = 0;
+ ip_adjacency_t *dst_adj;
if (src_prefix)
{
- src = ip_prefix_v6(src_prefix);
- src_address_length = ip_prefix_len(src_prefix);
+ src = ip_prefix_v6 (src_prefix);
+ src_address_length = ip_prefix_len (src_prefix);
}
else
- memset(&src, 0, sizeof(src));
+ memset (&src, 0, sizeof (src));
/* lookup dst adj */
adj_index = ip6_get_route (lgm->im6, table_id, 0, &dst, dst_address_length);
if (adj_index == 0)
- return adj_index;
+ return adj_index;
dst_adj = ip_get_adjacency (lgm->lm6, adj_index);
return ip6_sd_get_src_route (lgm, dst_adj->rewrite_header.sw_if_index, &src,
- src_address_length);
+ src_address_length);
}
int
ip_sd_fib_add_del_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
- ip_prefix_t * src_prefix, u32 table_id,
- ip_adjacency_t * add_adj, u8 is_add)
+ ip_prefix_t * src_prefix, u32 table_id,
+ ip_adjacency_t * add_adj, u8 is_add)
{
- return (
- ip_prefix_version(dst_prefix) == IP4 ?
- ip4_sd_fib_add_del_route : ip6_sd_fib_add_del_route) (lgm, dst_prefix,
- src_prefix,
- table_id, add_adj,
- is_add);
+ return (ip_prefix_version (dst_prefix) == IP4 ?
+ ip4_sd_fib_add_del_route : ip6_sd_fib_add_del_route) (lgm,
+ dst_prefix,
+ src_prefix,
+ table_id,
+ add_adj,
+ is_add);
}
u32
ip_sd_fib_get_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
- ip_prefix_t * src_prefix, u32 table_id)
+ ip_prefix_t * src_prefix, u32 table_id)
{
- if (ip_prefix_version(dst_prefix) == IP4)
+ if (ip_prefix_version (dst_prefix) == IP4)
{
- u32 * adj_index = ip4_sd_fib_get_route (lgm, dst_prefix, src_prefix,
- table_id);
+ u32 *adj_index = ip4_sd_fib_get_route (lgm, dst_prefix, src_prefix,
+ table_id);
return (adj_index == 0) ? 0 : adj_index[0];
}
else
@@ -741,15 +745,15 @@ ip_sd_fib_get_route (lisp_gpe_main_t * lgm, ip_prefix_t * dst_prefix,
always_inline void
ip4_src_fib_lookup_one (lisp_gpe_main_t * lgm, u32 src_fib_index0,
- ip4_address_t * addr0, u32 * src_adj_index0)
+ ip4_address_t * addr0, u32 * src_adj_index0)
{
ip4_fib_mtrie_leaf_t leaf0, leaf1;
- ip4_fib_mtrie_t * mtrie0;
+ ip4_fib_mtrie_t *mtrie0;
/* if default route not hit in ip4 lookup */
- if (PREDICT_TRUE(src_fib_index0 != (u32 ) ~0))
+ if (PREDICT_TRUE (src_fib_index0 != (u32) ~ 0))
{
- mtrie0 = &vec_elt_at_index(lgm->ip4_src_fibs, src_fib_index0)->mtrie;
+ mtrie0 = &vec_elt_at_index (lgm->ip4_src_fibs, src_fib_index0)->mtrie;
leaf0 = leaf1 = IP4_FIB_MTRIE_LEAF_ROOT;
leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, addr0, 0);
@@ -759,7 +763,7 @@ ip4_src_fib_lookup_one (lisp_gpe_main_t * lgm, u32 src_fib_index0,
/* Handle default route. */
leaf0 = (leaf0 == IP4_FIB_MTRIE_LEAF_EMPTY) ?
- mtrie0->default_leaf : leaf0;
+ mtrie0->default_leaf : leaf0;
src_adj_index0[0] = ip4_fib_mtrie_leaf_get_adj_index (leaf0);
}
else
@@ -768,18 +772,19 @@ ip4_src_fib_lookup_one (lisp_gpe_main_t * lgm, u32 src_fib_index0,
always_inline void
ip4_src_fib_lookup_two (lisp_gpe_main_t * lgm, u32 src_fib_index0,
- u32 src_fib_index1, ip4_address_t * addr0,
- ip4_address_t * addr1, u32 * src_adj_index0,
- u32 * src_adj_index1)
+ u32 src_fib_index1, ip4_address_t * addr0,
+ ip4_address_t * addr1, u32 * src_adj_index0,
+ u32 * src_adj_index1)
{
ip4_fib_mtrie_leaf_t leaf0, leaf1;
- ip4_fib_mtrie_t * mtrie0, * mtrie1;
+ ip4_fib_mtrie_t *mtrie0, *mtrie1;
/* if default route not hit in ip4 lookup */
- if (PREDICT_TRUE(src_fib_index0 != (u32 ) ~0 && src_fib_index1 != (u32 ) ~0))
+ if (PREDICT_TRUE
+ (src_fib_index0 != (u32) ~ 0 && src_fib_index1 != (u32) ~ 0))
{
- mtrie0 = &vec_elt_at_index(lgm->ip4_src_fibs, src_fib_index0)->mtrie;
- mtrie1 = &vec_elt_at_index(lgm->ip4_src_fibs, src_fib_index1)->mtrie;
+ mtrie0 = &vec_elt_at_index (lgm->ip4_src_fibs, src_fib_index0)->mtrie;
+ mtrie1 = &vec_elt_at_index (lgm->ip4_src_fibs, src_fib_index1)->mtrie;
leaf0 = leaf1 = IP4_FIB_MTRIE_LEAF_ROOT;
@@ -797,9 +802,9 @@ ip4_src_fib_lookup_two (lisp_gpe_main_t * lgm, u32 src_fib_index0,
/* Handle default route. */
leaf0 = (leaf0 == IP4_FIB_MTRIE_LEAF_EMPTY) ?
- mtrie0->default_leaf : leaf0;
+ mtrie0->default_leaf : leaf0;
leaf1 = (leaf1 == IP4_FIB_MTRIE_LEAF_EMPTY) ?
- mtrie1->default_leaf : leaf1;
+ mtrie1->default_leaf : leaf1;
src_adj_index0[0] = ip4_fib_mtrie_leaf_get_adj_index (leaf0);
src_adj_index1[0] = ip4_fib_mtrie_leaf_get_adj_index (leaf1);
}
@@ -812,10 +817,10 @@ ip4_src_fib_lookup_two (lisp_gpe_main_t * lgm, u32 src_fib_index0,
always_inline uword
lgpe_ip4_lookup (vlib_main_t * vm, vlib_node_runtime_t * node,
- vlib_frame_t * from_frame)
+ vlib_frame_t * from_frame)
{
- u32 n_left_from, next_index, * from, * to_next;
- lisp_gpe_main_t * lgm = &lisp_gpe_main;
+ u32 n_left_from, next_index, *from, *to_next;
+ lisp_gpe_main_t *lgm = &lisp_gpe_main;
from = vlib_frame_vector_args (from_frame);
n_left_from = from_frame->n_vectors;
@@ -826,200 +831,201 @@ lgpe_ip4_lookup (vlib_main_t * vm, vlib_node_runtime_t * node,
{
u32 n_left_to_next;
- vlib_get_next_frame(vm, node, next_index, to_next, n_left_to_next);
+ vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
while (n_left_from >= 4 && n_left_to_next >= 2)
- {
- u32 bi0, bi1;
- vlib_buffer_t * b0, * b1;
- ip4_header_t * ip0, * ip1;
- u32 dst_adj_index0, src_adj_index0, src_fib_index0;
- u32 dst_adj_index1, src_adj_index1, src_fib_index1;
- ip_adjacency_t * dst_adj0, * src_adj0, * dst_adj1, * src_adj1;
- u32 next0, next1;
-
- next0 = next1 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
-
- /* Prefetch next iteration. */
- {
- vlib_buffer_t * p2, * p3;
-
- p2 = vlib_get_buffer (vm, from[2]);
- p3 = vlib_get_buffer (vm, from[3]);
-
- vlib_prefetch_buffer_header (p2, LOAD);
- vlib_prefetch_buffer_header (p3, LOAD);
-
- CLIB_PREFETCH (p2->data, 2*CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (p3->data, 2*CLIB_CACHE_LINE_BYTES, LOAD);
- }
-
- bi0 = from[0];
- bi1 = from[1];
- to_next[0] = bi0;
- to_next[1] = bi1;
- from += 2;
- to_next += 2;
- n_left_to_next -= 2;
- n_left_from -= 2;
-
- b0 = vlib_get_buffer (vm, bi0);
- b1 = vlib_get_buffer (vm, bi1);
-
- ip0 = vlib_buffer_get_current (b0);
- ip1 = vlib_buffer_get_current (b1);
-
- /* dst lookup was done by ip4 lookup */
- dst_adj_index0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
- dst_adj_index1 = vnet_buffer(b1)->ip.adj_index[VLIB_TX];
-
- dst_adj0 = ip_get_adjacency (lgm->lm4, dst_adj_index0);
- dst_adj1 = ip_get_adjacency (lgm->lm4, dst_adj_index1);
-
- src_fib_index0 = dst_adj0->rewrite_header.sw_if_index;
- src_fib_index1 = dst_adj1->rewrite_header.sw_if_index;
-
- ip4_src_fib_lookup_two (lgm, src_fib_index0, src_fib_index1,
- &ip0->src_address, &ip1->src_address,
- &src_adj_index0, &src_adj_index1);
-
- /* if a source fib exists */
- if (PREDICT_TRUE((u32) ~0 != src_adj_index0
- && (u32) ~0 != src_adj_index1))
- {
- vnet_buffer(b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
- vnet_buffer(b1)->ip.adj_index[VLIB_TX] = src_adj_index1;
-
- src_adj0 = ip_get_adjacency (lgm->lm4, src_adj_index0);
- src_adj1 = ip_get_adjacency (lgm->lm4, src_adj_index1);
-
- next0 = src_adj0->explicit_fib_index;
- next1 = src_adj1->explicit_fib_index;
-
- /* prepare buffer for lisp-gpe output node */
- vnet_buffer (b0)->sw_if_index[VLIB_TX] =
- src_adj0->rewrite_header.sw_if_index;
- vnet_buffer (b1)->sw_if_index[VLIB_TX] =
- src_adj1->rewrite_header.sw_if_index;
-
- /* if multipath: saved_lookup_next_index is reused to store
- * nb of sub-tunnels. If greater than 1, multipath is on.
- * Note that flow hash should be 0 after ipx lookup! */
- if (PREDICT_TRUE(src_adj0->saved_lookup_next_index > 1))
- vnet_buffer (b0)->ip.flow_hash = ip4_compute_flow_hash (
- ip0, IP_FLOW_HASH_DEFAULT);
-
- if (PREDICT_TRUE(src_adj1->saved_lookup_next_index > 1))
- vnet_buffer (b1)->ip.flow_hash = ip4_compute_flow_hash (
- ip1, IP_FLOW_HASH_DEFAULT);
- }
- else
- {
- if ((u32) ~0 != src_adj_index0)
- {
- vnet_buffer(b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
- src_adj0 = ip_get_adjacency (lgm->lm4, src_adj_index0);
- next0 = src_adj0->explicit_fib_index;
- vnet_buffer (b0)->sw_if_index[VLIB_TX] =
- src_adj0->rewrite_header.sw_if_index;
-
- if (PREDICT_TRUE(src_adj0->saved_lookup_next_index > 1))
- vnet_buffer (b0)->ip.flow_hash = ip4_compute_flow_hash (
- ip0, IP_FLOW_HASH_DEFAULT);
- }
- else
- {
- next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
- }
-
- if ((u32) ~0 != src_adj_index1)
- {
- vnet_buffer(b1)->ip.adj_index[VLIB_TX] = src_adj_index1;
- src_adj1 = ip_get_adjacency (lgm->lm4, src_adj_index1);
- next1 = src_adj1->explicit_fib_index;
- vnet_buffer (b1)->sw_if_index[VLIB_TX] =
- src_adj1->rewrite_header.sw_if_index;
- if (PREDICT_TRUE(src_adj1->saved_lookup_next_index > 1))
- vnet_buffer (b1)->ip.flow_hash = ip4_compute_flow_hash (
- ip1, IP_FLOW_HASH_DEFAULT);
- }
- else
- {
- next1 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
- }
- }
-
- /* mark the packets for CP lookup if needed*/
- if (PREDICT_FALSE(LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next0))
- vnet_buffer (b0)->lisp.overlay_afi = LISP_AFI_IP;
- if (PREDICT_FALSE(LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next1))
- vnet_buffer (b1)->lisp.overlay_afi = LISP_AFI_IP;
-
- vlib_validate_buffer_enqueue_x2(vm, node, next_index, to_next,
- n_left_to_next, bi0, bi1, next0,
- next1);
- }
+ {
+ u32 bi0, bi1;
+ vlib_buffer_t *b0, *b1;
+ ip4_header_t *ip0, *ip1;
+ u32 dst_adj_index0, src_adj_index0, src_fib_index0;
+ u32 dst_adj_index1, src_adj_index1, src_fib_index1;
+ ip_adjacency_t *dst_adj0, *src_adj0, *dst_adj1, *src_adj1;
+ u32 next0, next1;
+
+ next0 = next1 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
+
+ /* Prefetch next iteration. */
+ {
+ vlib_buffer_t *p2, *p3;
+
+ p2 = vlib_get_buffer (vm, from[2]);
+ p3 = vlib_get_buffer (vm, from[3]);
+
+ vlib_prefetch_buffer_header (p2, LOAD);
+ vlib_prefetch_buffer_header (p3, LOAD);
+
+ CLIB_PREFETCH (p2->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
+ CLIB_PREFETCH (p3->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
+ }
+
+ bi0 = from[0];
+ bi1 = from[1];
+ to_next[0] = bi0;
+ to_next[1] = bi1;
+ from += 2;
+ to_next += 2;
+ n_left_to_next -= 2;
+ n_left_from -= 2;
+
+ b0 = vlib_get_buffer (vm, bi0);
+ b1 = vlib_get_buffer (vm, bi1);
+
+ ip0 = vlib_buffer_get_current (b0);
+ ip1 = vlib_buffer_get_current (b1);
+
+ /* dst lookup was done by ip4 lookup */
+ dst_adj_index0 = vnet_buffer (b0)->ip.adj_index[VLIB_TX];
+ dst_adj_index1 = vnet_buffer (b1)->ip.adj_index[VLIB_TX];
+
+ dst_adj0 = ip_get_adjacency (lgm->lm4, dst_adj_index0);
+ dst_adj1 = ip_get_adjacency (lgm->lm4, dst_adj_index1);
+
+ src_fib_index0 = dst_adj0->rewrite_header.sw_if_index;
+ src_fib_index1 = dst_adj1->rewrite_header.sw_if_index;
+
+ ip4_src_fib_lookup_two (lgm, src_fib_index0, src_fib_index1,
+ &ip0->src_address, &ip1->src_address,
+ &src_adj_index0, &src_adj_index1);
+
+ /* if a source fib exists */
+ if (PREDICT_TRUE ((u32) ~ 0 != src_adj_index0
+ && (u32) ~ 0 != src_adj_index1))
+ {
+ vnet_buffer (b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
+ vnet_buffer (b1)->ip.adj_index[VLIB_TX] = src_adj_index1;
+
+ src_adj0 = ip_get_adjacency (lgm->lm4, src_adj_index0);
+ src_adj1 = ip_get_adjacency (lgm->lm4, src_adj_index1);
+
+ next0 = src_adj0->explicit_fib_index;
+ next1 = src_adj1->explicit_fib_index;
+
+ /* prepare buffer for lisp-gpe output node */
+ vnet_buffer (b0)->sw_if_index[VLIB_TX] =
+ src_adj0->rewrite_header.sw_if_index;
+ vnet_buffer (b1)->sw_if_index[VLIB_TX] =
+ src_adj1->rewrite_header.sw_if_index;
+
+ /* if multipath: saved_lookup_next_index is reused to store
+ * nb of sub-tunnels. If greater than 1, multipath is on.
+ * Note that flow hash should be 0 after ipx lookup! */
+ if (PREDICT_TRUE (src_adj0->saved_lookup_next_index > 1))
+ vnet_buffer (b0)->ip.flow_hash =
+ ip4_compute_flow_hash (ip0, IP_FLOW_HASH_DEFAULT);
+
+ if (PREDICT_TRUE (src_adj1->saved_lookup_next_index > 1))
+ vnet_buffer (b1)->ip.flow_hash =
+ ip4_compute_flow_hash (ip1, IP_FLOW_HASH_DEFAULT);
+ }
+ else
+ {
+ if ((u32) ~ 0 != src_adj_index0)
+ {
+ vnet_buffer (b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
+ src_adj0 = ip_get_adjacency (lgm->lm4, src_adj_index0);
+ next0 = src_adj0->explicit_fib_index;
+ vnet_buffer (b0)->sw_if_index[VLIB_TX] =
+ src_adj0->rewrite_header.sw_if_index;
+
+ if (PREDICT_TRUE (src_adj0->saved_lookup_next_index > 1))
+ vnet_buffer (b0)->ip.flow_hash =
+ ip4_compute_flow_hash (ip0, IP_FLOW_HASH_DEFAULT);
+ }
+ else
+ {
+ next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
+ }
+
+ if ((u32) ~ 0 != src_adj_index1)
+ {
+ vnet_buffer (b1)->ip.adj_index[VLIB_TX] = src_adj_index1;
+ src_adj1 = ip_get_adjacency (lgm->lm4, src_adj_index1);
+ next1 = src_adj1->explicit_fib_index;
+ vnet_buffer (b1)->sw_if_index[VLIB_TX] =
+ src_adj1->rewrite_header.sw_if_index;
+ if (PREDICT_TRUE (src_adj1->saved_lookup_next_index > 1))
+ vnet_buffer (b1)->ip.flow_hash =
+ ip4_compute_flow_hash (ip1, IP_FLOW_HASH_DEFAULT);
+ }
+ else
+ {
+ next1 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
+ }
+ }
+
+ /* mark the packets for CP lookup if needed */
+ if (PREDICT_FALSE (LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next0))
+ vnet_buffer (b0)->lisp.overlay_afi = LISP_AFI_IP;
+ if (PREDICT_FALSE (LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next1))
+ vnet_buffer (b1)->lisp.overlay_afi = LISP_AFI_IP;
+
+ vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next,
+ n_left_to_next, bi0, bi1, next0,
+ next1);
+ }
while (n_left_from > 0 && n_left_to_next > 0)
- {
- vlib_buffer_t * b0;
- ip4_header_t * ip0;
- u32 bi0, dst_adj_index0, src_adj_index0, src_fib_index0;
- u32 next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
- ip_adjacency_t * dst_adj0, * src_adj0;
-
- bi0 = from[0];
- to_next[0] = bi0;
- from += 1;
- to_next += 1;
- n_left_from -= 1;
- n_left_to_next -= 1;
-
- b0 = vlib_get_buffer (vm, bi0);
- ip0 = vlib_buffer_get_current (b0);
-
- /* dst lookup was done by ip4 lookup */
- dst_adj_index0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
- dst_adj0 = ip_get_adjacency (lgm->lm4, dst_adj_index0);
- src_fib_index0 = dst_adj0->rewrite_header.sw_if_index;
-
- /* do src lookup */
- ip4_src_fib_lookup_one (lgm, src_fib_index0, &ip0->src_address,
- &src_adj_index0);
-
- /* if a source fib exists */
- if (PREDICT_TRUE((u32) ~0 != src_adj_index0))
- {
- vnet_buffer(b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
- src_adj0 = ip_get_adjacency (lgm->lm4, src_adj_index0);
- next0 = src_adj0->explicit_fib_index;
-
- /* prepare packet for lisp-gpe output node */
- vnet_buffer (b0)->sw_if_index[VLIB_TX] =
- src_adj0->rewrite_header.sw_if_index;
-
- /* if multipath: saved_lookup_next_index is reused to store
- * nb of sub-tunnels. If greater than 1, multipath is on */
- if (PREDICT_TRUE(src_adj0->saved_lookup_next_index > 1))
- vnet_buffer (b0)->ip.flow_hash = ip4_compute_flow_hash (
- ip0, IP_FLOW_HASH_DEFAULT);
- }
- else
- {
- next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
- }
-
- if (PREDICT_FALSE(LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next0))
- vnet_buffer (b0)->lisp.overlay_afi = LISP_AFI_IP;
-
- vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next,
- n_left_to_next, bi0, next0);
- }
+ {
+ vlib_buffer_t *b0;
+ ip4_header_t *ip0;
+ u32 bi0, dst_adj_index0, src_adj_index0, src_fib_index0;
+ u32 next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
+ ip_adjacency_t *dst_adj0, *src_adj0;
+
+ bi0 = from[0];
+ to_next[0] = bi0;
+ from += 1;
+ to_next += 1;
+ n_left_from -= 1;
+ n_left_to_next -= 1;
+
+ b0 = vlib_get_buffer (vm, bi0);
+ ip0 = vlib_buffer_get_current (b0);
+
+ /* dst lookup was done by ip4 lookup */
+ dst_adj_index0 = vnet_buffer (b0)->ip.adj_index[VLIB_TX];
+ dst_adj0 = ip_get_adjacency (lgm->lm4, dst_adj_index0);
+ src_fib_index0 = dst_adj0->rewrite_header.sw_if_index;
+
+ /* do src lookup */
+ ip4_src_fib_lookup_one (lgm, src_fib_index0, &ip0->src_address,
+ &src_adj_index0);
+
+ /* if a source fib exists */
+ if (PREDICT_TRUE ((u32) ~ 0 != src_adj_index0))
+ {
+ vnet_buffer (b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
+ src_adj0 = ip_get_adjacency (lgm->lm4, src_adj_index0);
+ next0 = src_adj0->explicit_fib_index;
+
+ /* prepare packet for lisp-gpe output node */
+ vnet_buffer (b0)->sw_if_index[VLIB_TX] =
+ src_adj0->rewrite_header.sw_if_index;
+
+ /* if multipath: saved_lookup_next_index is reused to store
+ * nb of sub-tunnels. If greater than 1, multipath is on */
+ if (PREDICT_TRUE (src_adj0->saved_lookup_next_index > 1))
+ vnet_buffer (b0)->ip.flow_hash =
+ ip4_compute_flow_hash (ip0, IP_FLOW_HASH_DEFAULT);
+ }
+ else
+ {
+ next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
+ }
+
+ if (PREDICT_FALSE (LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next0))
+ vnet_buffer (b0)->lisp.overlay_afi = LISP_AFI_IP;
+
+ vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
+ n_left_to_next, bi0, next0);
+ }
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
}
return from_frame->n_vectors;
}
+/* *INDENT-OFF* */
VLIB_REGISTER_NODE (lgpe_ip4_lookup_node) = {
.function = lgpe_ip4_lookup,
.name = "lgpe-ip4-lookup",
@@ -1034,24 +1040,25 @@ VLIB_REGISTER_NODE (lgpe_ip4_lookup_node) = {
#undef _
},
};
+/* *INDENT-ON* */
static u32
ip6_src_fib_lookup (lisp_gpe_main_t * lgm, u32 src_fib_index,
- ip6_address_t * src)
+ ip6_address_t * src)
{
int i, len;
int rv;
- BVT(clib_bihash_kv) kv, value;
- ip6_src_fib_t * fib = pool_elt_at_index (lgm->ip6_src_fibs, src_fib_index);
+ BVT (clib_bihash_kv) kv, value;
+ ip6_src_fib_t *fib = pool_elt_at_index (lgm->ip6_src_fibs, src_fib_index);
len = vec_len (fib->prefix_lengths_in_search_order);
for (i = 0; i < len; i++)
{
int dst_address_length = fib->prefix_lengths_in_search_order[i];
- ip6_address_t * mask;
+ ip6_address_t *mask;
- ASSERT(dst_address_length >= 0 && dst_address_length <= 128);
+ ASSERT (dst_address_length >= 0 && dst_address_length <= 128);
mask = &fib->fib_masks[dst_address_length];
@@ -1059,9 +1066,11 @@ ip6_src_fib_lookup (lisp_gpe_main_t * lgm, u32 src_fib_index,
kv.key[1] = src->as_u64[1] & mask->as_u64[1];
kv.key[2] = dst_address_length;
- rv = BV(clib_bihash_search_inline_2)(&fib->ip6_lookup_table, &kv, &value);
+ rv =
+ BV (clib_bihash_search_inline_2) (&fib->ip6_lookup_table, &kv,
+ &value);
if (rv == 0)
- return value.value;
+ return value.value;
}
return 0;
@@ -1069,10 +1078,10 @@ ip6_src_fib_lookup (lisp_gpe_main_t * lgm, u32 src_fib_index,
always_inline void
ip6_src_fib_lookup_one (lisp_gpe_main_t * lgm, u32 src_fib_index0,
- ip6_address_t * addr0, u32 * src_adj_index0)
+ ip6_address_t * addr0, u32 * src_adj_index0)
{
/* if default route not hit in ip6 lookup */
- if (PREDICT_TRUE(src_fib_index0 != (u32 ) ~0))
+ if (PREDICT_TRUE (src_fib_index0 != (u32) ~ 0))
src_adj_index0[0] = ip6_src_fib_lookup (lgm, src_fib_index0, addr0);
else
src_adj_index0[0] = ~0;
@@ -1080,15 +1089,16 @@ ip6_src_fib_lookup_one (lisp_gpe_main_t * lgm, u32 src_fib_index0,
always_inline void
ip6_src_fib_lookup_two (lisp_gpe_main_t * lgm, u32 src_fib_index0,
- u32 src_fib_index1, ip6_address_t * addr0,
- ip6_address_t * addr1, u32 * src_adj_index0,
- u32 * src_adj_index1)
+ u32 src_fib_index1, ip6_address_t * addr0,
+ ip6_address_t * addr1, u32 * src_adj_index0,
+ u32 * src_adj_index1)
{
/* if default route not hit in ip6 lookup */
- if (PREDICT_TRUE(src_fib_index0 != (u32 ) ~0 && src_fib_index1 != (u32 ) ~0))
+ if (PREDICT_TRUE
+ (src_fib_index0 != (u32) ~ 0 && src_fib_index1 != (u32) ~ 0))
{
- src_adj_index0[0] = ip6_src_fib_lookup(lgm, src_fib_index0, addr0);
- src_adj_index1[0] = ip6_src_fib_lookup(lgm, src_fib_index1, addr1);
+ src_adj_index0[0] = ip6_src_fib_lookup (lgm, src_fib_index0, addr0);
+ src_adj_index1[0] = ip6_src_fib_lookup (lgm, src_fib_index1, addr1);
}
else
{
@@ -1099,10 +1109,10 @@ ip6_src_fib_lookup_two (lisp_gpe_main_t * lgm, u32 src_fib_index0,
always_inline uword
lgpe_ip6_lookup (vlib_main_t * vm, vlib_node_runtime_t * node,
- vlib_frame_t * from_frame)
+ vlib_frame_t * from_frame)
{
- u32 n_left_from, next_index, * from, * to_next;
- lisp_gpe_main_t * lgm = &lisp_gpe_main;
+ u32 n_left_from, next_index, *from, *to_next;
+ lisp_gpe_main_t *lgm = &lisp_gpe_main;
from = vlib_frame_vector_args (from_frame);
n_left_from = from_frame->n_vectors;
@@ -1113,202 +1123,203 @@ lgpe_ip6_lookup (vlib_main_t * vm, vlib_node_runtime_t * node,
{
u32 n_left_to_next;
- vlib_get_next_frame(vm, node, next_index, to_next, n_left_to_next);
+ vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
while (n_left_from >= 4 && n_left_to_next >= 2)
- {
- u32 bi0, bi1;
- vlib_buffer_t * b0, * b1;
- ip6_header_t * ip0, * ip1;
- u32 dst_adj_index0, src_adj_index0, src_fib_index0, dst_adj_index1,
- src_adj_index1, src_fib_index1;
- ip_adjacency_t * dst_adj0, * src_adj0, * dst_adj1, * src_adj1;
- u32 next0, next1;
-
- next0 = next1 = LGPE_IP6_LOOKUP_NEXT_LISP_CP_LOOKUP;
-
- /* Prefetch next iteration. */
- {
- vlib_buffer_t * p2, * p3;
-
- p2 = vlib_get_buffer (vm, from[2]);
- p3 = vlib_get_buffer (vm, from[3]);
-
- vlib_prefetch_buffer_header (p2, LOAD);
- vlib_prefetch_buffer_header (p3, LOAD);
-
- CLIB_PREFETCH (p2->data, 2*CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (p3->data, 2*CLIB_CACHE_LINE_BYTES, LOAD);
- }
-
- bi0 = from[0];
- bi1 = from[1];
- to_next[0] = bi0;
- to_next[1] = bi1;
- from += 2;
- to_next += 2;
- n_left_to_next -= 2;
- n_left_from -= 2;
-
- b0 = vlib_get_buffer (vm, bi0);
- b1 = vlib_get_buffer (vm, bi1);
-
- ip0 = vlib_buffer_get_current (b0);
- ip1 = vlib_buffer_get_current (b1);
-
- /* dst lookup was done by ip6 lookup */
- dst_adj_index0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
- dst_adj_index1 = vnet_buffer(b1)->ip.adj_index[VLIB_TX];
-
- dst_adj0 = ip_get_adjacency (lgm->lm6, dst_adj_index0);
- dst_adj1 = ip_get_adjacency (lgm->lm6, dst_adj_index1);
-
- src_fib_index0 = dst_adj0->rewrite_header.sw_if_index;
- src_fib_index1 = dst_adj1->rewrite_header.sw_if_index;
-
- ip6_src_fib_lookup_two (lgm, src_fib_index0, src_fib_index1,
- &ip0->src_address, &ip1->src_address,
- &src_adj_index0, &src_adj_index1);
-
- /* if a source fib exists */
- if (PREDICT_TRUE((u32) ~0 != src_adj_index0
- && (u32) ~0 != src_adj_index1))
- {
- vnet_buffer(b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
- vnet_buffer(b1)->ip.adj_index[VLIB_TX] = src_adj_index1;
-
- src_adj0 = ip_get_adjacency (lgm->lm6, src_adj_index0);
- src_adj1 = ip_get_adjacency (lgm->lm6, src_adj_index1);
-
- next0 = src_adj0->explicit_fib_index;
- next1 = src_adj1->explicit_fib_index;
-
- /* prepare buffer for lisp-gpe output node */
- vnet_buffer (b0)->sw_if_index[VLIB_TX] =
- src_adj0->rewrite_header.sw_if_index;
- vnet_buffer (b1)->sw_if_index[VLIB_TX] =
- src_adj1->rewrite_header.sw_if_index;
-
- /* if multipath: saved_lookup_next_index is reused to store
- * nb of sub-tunnels. If greater than 1, multipath is on.
- * Note that flow hash should be 0 after ipx lookup! */
- if (PREDICT_TRUE(src_adj0->saved_lookup_next_index > 1))
- vnet_buffer (b0)->ip.flow_hash = ip6_compute_flow_hash (
- ip0, IP_FLOW_HASH_DEFAULT);
-
- if (PREDICT_TRUE(src_adj1->saved_lookup_next_index > 1))
- vnet_buffer (b1)->ip.flow_hash = ip6_compute_flow_hash (
- ip1, IP_FLOW_HASH_DEFAULT);
- }
- else
- {
- if (src_adj_index0 != (u32) ~0)
- {
- vnet_buffer(b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
- src_adj0 = ip_get_adjacency (lgm->lm6, src_adj_index0);
- next0 = src_adj0->explicit_fib_index;
- vnet_buffer (b0)->sw_if_index[VLIB_TX] =
- src_adj0->rewrite_header.sw_if_index;
-
- if (PREDICT_TRUE(src_adj0->saved_lookup_next_index > 1))
- vnet_buffer (b0)->ip.flow_hash = ip6_compute_flow_hash (
- ip0, IP_FLOW_HASH_DEFAULT);
- }
- else
- {
- next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
- }
-
- if (src_adj_index1 != (u32) ~0)
- {
- vnet_buffer(b1)->ip.adj_index[VLIB_TX] = src_adj_index1;
- src_adj1 = ip_get_adjacency (lgm->lm6, src_adj_index1);
- next1 = src_adj1->explicit_fib_index;
- vnet_buffer (b1)->sw_if_index[VLIB_TX] =
- src_adj1->rewrite_header.sw_if_index;
-
- if (PREDICT_TRUE(src_adj1->saved_lookup_next_index > 1))
- vnet_buffer (b1)->ip.flow_hash = ip6_compute_flow_hash (
- ip1, IP_FLOW_HASH_DEFAULT);
- }
- else
- {
- next1 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
- }
- }
-
- /* mark the packets for CP lookup if needed*/
- if (PREDICT_FALSE(LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next0))
- vnet_buffer (b0)->lisp.overlay_afi = LISP_AFI_IP;
- if (PREDICT_FALSE(LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next1))
- vnet_buffer (b1)->lisp.overlay_afi = LISP_AFI_IP;
-
- vlib_validate_buffer_enqueue_x2(vm, node, next_index, to_next,
- n_left_to_next, bi0, bi1, next0,
- next1);
- }
+ {
+ u32 bi0, bi1;
+ vlib_buffer_t *b0, *b1;
+ ip6_header_t *ip0, *ip1;
+ u32 dst_adj_index0, src_adj_index0, src_fib_index0, dst_adj_index1,
+ src_adj_index1, src_fib_index1;
+ ip_adjacency_t *dst_adj0, *src_adj0, *dst_adj1, *src_adj1;
+ u32 next0, next1;
+
+ next0 = next1 = LGPE_IP6_LOOKUP_NEXT_LISP_CP_LOOKUP;
+
+ /* Prefetch next iteration. */
+ {
+ vlib_buffer_t *p2, *p3;
+
+ p2 = vlib_get_buffer (vm, from[2]);
+ p3 = vlib_get_buffer (vm, from[3]);
+
+ vlib_prefetch_buffer_header (p2, LOAD);
+ vlib_prefetch_buffer_header (p3, LOAD);
+
+ CLIB_PREFETCH (p2->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
+ CLIB_PREFETCH (p3->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
+ }
+
+ bi0 = from[0];
+ bi1 = from[1];
+ to_next[0] = bi0;
+ to_next[1] = bi1;
+ from += 2;
+ to_next += 2;
+ n_left_to_next -= 2;
+ n_left_from -= 2;
+
+ b0 = vlib_get_buffer (vm, bi0);
+ b1 = vlib_get_buffer (vm, bi1);
+
+ ip0 = vlib_buffer_get_current (b0);
+ ip1 = vlib_buffer_get_current (b1);
+
+ /* dst lookup was done by ip6 lookup */
+ dst_adj_index0 = vnet_buffer (b0)->ip.adj_index[VLIB_TX];
+ dst_adj_index1 = vnet_buffer (b1)->ip.adj_index[VLIB_TX];
+
+ dst_adj0 = ip_get_adjacency (lgm->lm6, dst_adj_index0);
+ dst_adj1 = ip_get_adjacency (lgm->lm6, dst_adj_index1);
+
+ src_fib_index0 = dst_adj0->rewrite_header.sw_if_index;
+ src_fib_index1 = dst_adj1->rewrite_header.sw_if_index;
+
+ ip6_src_fib_lookup_two (lgm, src_fib_index0, src_fib_index1,
+ &ip0->src_address, &ip1->src_address,
+ &src_adj_index0, &src_adj_index1);
+
+ /* if a source fib exists */
+ if (PREDICT_TRUE ((u32) ~ 0 != src_adj_index0
+ && (u32) ~ 0 != src_adj_index1))
+ {
+ vnet_buffer (b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
+ vnet_buffer (b1)->ip.adj_index[VLIB_TX] = src_adj_index1;
+
+ src_adj0 = ip_get_adjacency (lgm->lm6, src_adj_index0);
+ src_adj1 = ip_get_adjacency (lgm->lm6, src_adj_index1);
+
+ next0 = src_adj0->explicit_fib_index;
+ next1 = src_adj1->explicit_fib_index;
+
+ /* prepare buffer for lisp-gpe output node */
+ vnet_buffer (b0)->sw_if_index[VLIB_TX] =
+ src_adj0->rewrite_header.sw_if_index;
+ vnet_buffer (b1)->sw_if_index[VLIB_TX] =
+ src_adj1->rewrite_header.sw_if_index;
+
+ /* if multipath: saved_lookup_next_index is reused to store
+ * nb of sub-tunnels. If greater than 1, multipath is on.
+ * Note that flow hash should be 0 after ipx lookup! */
+ if (PREDICT_TRUE (src_adj0->saved_lookup_next_index > 1))
+ vnet_buffer (b0)->ip.flow_hash =
+ ip6_compute_flow_hash (ip0, IP_FLOW_HASH_DEFAULT);
+
+ if (PREDICT_TRUE (src_adj1->saved_lookup_next_index > 1))
+ vnet_buffer (b1)->ip.flow_hash =
+ ip6_compute_flow_hash (ip1, IP_FLOW_HASH_DEFAULT);
+ }
+ else
+ {
+ if (src_adj_index0 != (u32) ~ 0)
+ {
+ vnet_buffer (b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
+ src_adj0 = ip_get_adjacency (lgm->lm6, src_adj_index0);
+ next0 = src_adj0->explicit_fib_index;
+ vnet_buffer (b0)->sw_if_index[VLIB_TX] =
+ src_adj0->rewrite_header.sw_if_index;
+
+ if (PREDICT_TRUE (src_adj0->saved_lookup_next_index > 1))
+ vnet_buffer (b0)->ip.flow_hash =
+ ip6_compute_flow_hash (ip0, IP_FLOW_HASH_DEFAULT);
+ }
+ else
+ {
+ next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
+ }
+
+ if (src_adj_index1 != (u32) ~ 0)
+ {
+ vnet_buffer (b1)->ip.adj_index[VLIB_TX] = src_adj_index1;
+ src_adj1 = ip_get_adjacency (lgm->lm6, src_adj_index1);
+ next1 = src_adj1->explicit_fib_index;
+ vnet_buffer (b1)->sw_if_index[VLIB_TX] =
+ src_adj1->rewrite_header.sw_if_index;
+
+ if (PREDICT_TRUE (src_adj1->saved_lookup_next_index > 1))
+ vnet_buffer (b1)->ip.flow_hash =
+ ip6_compute_flow_hash (ip1, IP_FLOW_HASH_DEFAULT);
+ }
+ else
+ {
+ next1 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
+ }
+ }
+
+ /* mark the packets for CP lookup if needed */
+ if (PREDICT_FALSE (LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next0))
+ vnet_buffer (b0)->lisp.overlay_afi = LISP_AFI_IP;
+ if (PREDICT_FALSE (LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next1))
+ vnet_buffer (b1)->lisp.overlay_afi = LISP_AFI_IP;
+
+ vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next,
+ n_left_to_next, bi0, bi1, next0,
+ next1);
+ }
while (n_left_from > 0 && n_left_to_next > 0)
- {
- vlib_buffer_t * b0;
- ip6_header_t * ip0;
- u32 bi0, dst_adj_index0, src_adj_index0, src_fib_index0;
- u32 next0 = LGPE_IP6_LOOKUP_NEXT_LISP_CP_LOOKUP;
- ip_adjacency_t * dst_adj0, * src_adj0;
-
- bi0 = from[0];
- to_next[0] = bi0;
- from += 1;
- to_next += 1;
- n_left_from -= 1;
- n_left_to_next -= 1;
-
- b0 = vlib_get_buffer (vm, bi0);
- ip0 = vlib_buffer_get_current (b0);
-
- /* dst lookup was done by ip6 lookup */
- dst_adj_index0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
- dst_adj0 = ip_get_adjacency (lgm->lm6, dst_adj_index0);
- src_fib_index0 = dst_adj0->rewrite_header.sw_if_index;
-
- /* do src lookup */
- ip6_src_fib_lookup_one (lgm, src_fib_index0, &ip0->src_address,
- &src_adj_index0);
-
- /* if a source fib exists */
- if (PREDICT_TRUE(src_adj_index0 != (u32 ) ~0))
- {
- vnet_buffer(b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
- src_adj0 = ip_get_adjacency (lgm->lm6, src_adj_index0);
- next0 = src_adj0->explicit_fib_index;
-
- /* prepare packet for lisp-gpe output node */
- vnet_buffer (b0)->sw_if_index[VLIB_TX] =
- src_adj0->rewrite_header.sw_if_index;
-
- /* if multipath: saved_lookup_next_index is reused to store
- * nb of sub-tunnels. If greater than 1, multipath is on */
- if (PREDICT_TRUE(src_adj0->saved_lookup_next_index > 1))
- vnet_buffer (b0)->ip.flow_hash = ip6_compute_flow_hash (
- ip0, IP_FLOW_HASH_DEFAULT);
- }
- else
- {
- next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
- }
-
- /* mark the packets for CP lookup if needed*/
- if (PREDICT_FALSE(LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next0))
- vnet_buffer (b0)->lisp.overlay_afi = LISP_AFI_IP;
-
- vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next,
- n_left_to_next, bi0, next0);
- }
+ {
+ vlib_buffer_t *b0;
+ ip6_header_t *ip0;
+ u32 bi0, dst_adj_index0, src_adj_index0, src_fib_index0;
+ u32 next0 = LGPE_IP6_LOOKUP_NEXT_LISP_CP_LOOKUP;
+ ip_adjacency_t *dst_adj0, *src_adj0;
+
+ bi0 = from[0];
+ to_next[0] = bi0;
+ from += 1;
+ to_next += 1;
+ n_left_from -= 1;
+ n_left_to_next -= 1;
+
+ b0 = vlib_get_buffer (vm, bi0);
+ ip0 = vlib_buffer_get_current (b0);
+
+ /* dst lookup was done by ip6 lookup */
+ dst_adj_index0 = vnet_buffer (b0)->ip.adj_index[VLIB_TX];
+ dst_adj0 = ip_get_adjacency (lgm->lm6, dst_adj_index0);
+ src_fib_index0 = dst_adj0->rewrite_header.sw_if_index;
+
+ /* do src lookup */
+ ip6_src_fib_lookup_one (lgm, src_fib_index0, &ip0->src_address,
+ &src_adj_index0);
+
+ /* if a source fib exists */
+ if (PREDICT_TRUE (src_adj_index0 != (u32) ~ 0))
+ {
+ vnet_buffer (b0)->ip.adj_index[VLIB_TX] = src_adj_index0;
+ src_adj0 = ip_get_adjacency (lgm->lm6, src_adj_index0);
+ next0 = src_adj0->explicit_fib_index;
+
+ /* prepare packet for lisp-gpe output node */
+ vnet_buffer (b0)->sw_if_index[VLIB_TX] =
+ src_adj0->rewrite_header.sw_if_index;
+
+ /* if multipath: saved_lookup_next_index is reused to store
+ * nb of sub-tunnels. If greater than 1, multipath is on */
+ if (PREDICT_TRUE (src_adj0->saved_lookup_next_index > 1))
+ vnet_buffer (b0)->ip.flow_hash =
+ ip6_compute_flow_hash (ip0, IP_FLOW_HASH_DEFAULT);
+ }
+ else
+ {
+ next0 = LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP;
+ }
+
+ /* mark the packets for CP lookup if needed */
+ if (PREDICT_FALSE (LGPE_IP4_LOOKUP_NEXT_LISP_CP_LOOKUP == next0))
+ vnet_buffer (b0)->lisp.overlay_afi = LISP_AFI_IP;
+
+ vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
+ n_left_to_next, bi0, next0);
+ }
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
}
return from_frame->n_vectors;
}
+/* *INDENT-OFF* */
VLIB_REGISTER_NODE (lgpe_ip6_lookup_node) = {
.function = lgpe_ip6_lookup,
.name = "lgpe-ip6-lookup",
@@ -1323,3 +1334,12 @@ VLIB_REGISTER_NODE (lgpe_ip6_lookup_node) = {
#undef _
},
};
+/* *INDENT-ON* */
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */