Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
MTRIE Optimisations 2
[vpp.git]
/
src
/
vnet
/
fib
/
mpls_fib.c
diff --git
a/src/vnet/fib/mpls_fib.c
b/src/vnet/fib/mpls_fib.c
index
6a9b1ac
..
4b2b76e
100644
(file)
--- a/
src/vnet/fib/mpls_fib.c
+++ b/
src/vnet/fib/mpls_fib.c
@@
-44,10
+44,11
@@
* Switching between schemes based on observed/measured action similarity is not
* considered on the grounds of complexity and flip-flopping.
*
* Switching between schemes based on observed/measured action similarity is not
* considered on the grounds of complexity and flip-flopping.
*
- * VPP mantra - favour performance over memory. We choose a 21 bit key.
+ * VPP mantra - favour performance over memory. We choose a 21 bit key.
*/
#include <vnet/fib/fib_table.h>
*/
#include <vnet/fib/fib_table.h>
+#include <vnet/fib/mpls_fib.h>
#include <vnet/dpo/load_balance.h>
#include <vnet/dpo/drop_dpo.h>
#include <vnet/dpo/punt_dpo.h>
#include <vnet/dpo/load_balance.h>
#include <vnet/dpo/drop_dpo.h>
#include <vnet/dpo/punt_dpo.h>
@@
-96,11
+97,15
@@
mpls_fib_create_with_table_id (u32 table_id)
int i;
pool_get_aligned(mpls_main.fibs, fib_table, CLIB_CACHE_LINE_BYTES);
int i;
pool_get_aligned(mpls_main.fibs, fib_table, CLIB_CACHE_LINE_BYTES);
+ pool_get_aligned(mpls_main.mpls_fibs, mf, CLIB_CACHE_LINE_BYTES);
+
+ ASSERT((fib_table - mpls_main.fibs) ==
+ (mf - mpls_main.mpls_fibs));
+
memset(fib_table, 0, sizeof(*fib_table));
fib_table->ft_proto = FIB_PROTOCOL_MPLS;
memset(fib_table, 0, sizeof(*fib_table));
fib_table->ft_proto = FIB_PROTOCOL_MPLS;
- fib_table->ft_index =
- (fib_table - mpls_main.fibs);
+ fib_table->ft_index = (fib_table - mpls_main.fibs);
hash_set (mpls_main.fib_index_by_table_id, table_id, fib_table->ft_index);
hash_set (mpls_main.fib_index_by_table_id, table_id, fib_table->ft_index);
@@
-108,8
+113,6
@@
mpls_fib_create_with_table_id (u32 table_id)
table_id;
fib_table->ft_flow_hash_config =
MPLS_FLOW_HASH_DEFAULT;
table_id;
fib_table->ft_flow_hash_config =
MPLS_FLOW_HASH_DEFAULT;
- fib_table->v4.fwd_classify_table_index = ~0;
- fib_table->v4.rev_classify_table_index = ~0;
fib_table_lock(fib_table->ft_index, FIB_PROTOCOL_MPLS);
fib_table_lock(fib_table->ft_index, FIB_PROTOCOL_MPLS);
@@
-121,7
+124,6
@@
mpls_fib_create_with_table_id (u32 table_id)
drop_dpo_get(DPO_PROTO_MPLS));
}
drop_dpo_get(DPO_PROTO_MPLS));
}
- mf = &fib_table->mpls;
mf->mf_entries = hash_create(0, sizeof(fib_node_index_t));
for (i = 0; i < MPLS_FIB_DB_SIZE; i++)
{
mf->mf_entries = hash_create(0, sizeof(fib_node_index_t));
for (i = 0; i < MPLS_FIB_DB_SIZE; i++)
{
@@
-240,9
+242,10
@@
mpls_fib_table_create_and_lock (void)
}
void
}
void
-mpls_fib_table_destroy (
mpls_fib_t *mf
)
+mpls_fib_table_destroy (
u32 fib_index
)
{
{
- fib_table_t *fib_table = (fib_table_t*)mf;
+ fib_table_t *fib_table = pool_elt_at_index(mpls_main.fibs, fib_index);
+ mpls_fib_t *mf = pool_elt_at_index(mpls_main.mpls_fibs, fib_index);
fib_prefix_t prefix = {
.fp_proto = FIB_PROTOCOL_MPLS,
};
fib_prefix_t prefix = {
.fp_proto = FIB_PROTOCOL_MPLS,
};
@@
-271,8
+274,9
@@
mpls_fib_table_destroy (mpls_fib_t *mf)
hash_unset(mpls_main.fib_index_by_table_id,
fib_table->ft_table_id);
}
hash_unset(mpls_main.fib_index_by_table_id,
fib_table->ft_table_id);
}
- hash_
delet
e(mf->mf_entries);
+ hash_
fre
e(mf->mf_entries);
+ pool_put(mpls_main.mpls_fibs, mf);
pool_put(mpls_main.fibs, fib_table);
}
pool_put(mpls_main.fibs, fib_table);
}
@@
-342,6
+346,20
@@
mpls_fib_table_get_flow_hash_config (u32 fib_index)
return (0);
}
return (0);
}
+void
+mpls_fib_table_walk (mpls_fib_t *mpls_fib,
+ fib_table_walk_fn_t fn,
+ void *ctx)
+{
+ fib_node_index_t lfei;
+ mpls_label_t key;
+
+ hash_foreach(key, lfei, mpls_fib->mf_entries,
+ ({
+ fn(lfei, ctx);
+ }));
+}
+
static void
mpls_fib_table_show_all (const mpls_fib_t *mpls_fib,
vlib_main_t * vm)
static void
mpls_fib_table_show_all (const mpls_fib_t *mpls_fib,
vlib_main_t * vm)
@@
-421,11
+439,11
@@
mpls_fib_show (vlib_main_t * vm,
if (MPLS_LABEL_INVALID == label)
{
if (MPLS_LABEL_INVALID == label)
{
- mpls_fib_table_show_all(
&(fib_table->mpls
), vm);
+ mpls_fib_table_show_all(
mpls_fib_get(fib_table->ft_index
), vm);
}
else
{
}
else
{
- mpls_fib_table_show_one(
&(fib_table->mpls
), label, vm);
+ mpls_fib_table_show_one(
mpls_fib_get(fib_table->ft_index
), label, vm);
}
}));
}
}));