From 6f53fcc7b2b3f62ec82adbca281cea6f851c9a8d Mon Sep 17 00:00:00 2001 From: Vladimir Medvedkin Date: Tue, 27 Oct 2020 15:11:27 +0000 Subject: [PATCH] fib6: add lookup runtime selection Add type argument to trie_get_lookup_fn() Now it only supports RTE_FIB6_LOOKUP_TRIE_SCALAR Add new rte_fib6_select_lookup() - user can change lookup function type runtime. Signed-off-by: Vladimir Medvedkin Acked-by: Konstantin Ananyev --- lib/librte_fib/rte_fib6.c | 20 +++++++++++++++- lib/librte_fib/rte_fib6.h | 22 +++++++++++++++++ lib/librte_fib/trie.c | 49 ++++++++++++++++++++++---------------- lib/librte_fib/trie.h | 2 +- lib/librte_fib/version.map | 1 + 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/lib/librte_fib/rte_fib6.c b/lib/librte_fib/rte_fib6.c index 9652ac71d6..3f5f20a668 100644 --- a/lib/librte_fib/rte_fib6.c +++ b/lib/librte_fib/rte_fib6.c @@ -107,7 +107,7 @@ init_dataplane(struct rte_fib6 *fib, __rte_unused int socket_id, fib->dp = trie_create(dp_name, socket_id, conf); if (fib->dp == NULL) return -rte_errno; - fib->lookup = rte_trie_get_lookup_fn(conf); + fib->lookup = trie_get_lookup_fn(fib->dp, RTE_FIB6_LOOKUP_TRIE_SCALAR); fib->modify = trie_modify; return 0; default: @@ -319,3 +319,21 @@ rte_fib6_get_rib(struct rte_fib6 *fib) { return (fib == NULL) ? NULL : fib->rib; } + +int +rte_fib6_select_lookup(struct rte_fib6 *fib, + enum rte_fib6_lookup_type type) +{ + rte_fib6_lookup_fn_t fn; + + switch (fib->type) { + case RTE_FIB6_TRIE: + fn = trie_get_lookup_fn(fib->dp, type); + if (fn == NULL) + return -EINVAL; + fib->lookup = fn; + return 0; + default: + return -EINVAL; + } +} diff --git a/lib/librte_fib/rte_fib6.h b/lib/librte_fib/rte_fib6.h index 338a416fb8..a5f0e8d732 100644 --- a/lib/librte_fib/rte_fib6.h +++ b/lib/librte_fib/rte_fib6.h @@ -52,12 +52,18 @@ enum rte_fib6_op { RTE_FIB6_DEL, }; +/** Size of nexthop (1 << nh_sz) bits for TRIE based FIB */ enum rte_fib_trie_nh_sz { RTE_FIB6_TRIE_2B = 1, RTE_FIB6_TRIE_4B, RTE_FIB6_TRIE_8B }; +/** Type of lookup function implementation */ +enum rte_fib6_lookup_type { + RTE_FIB6_LOOKUP_TRIE_SCALAR /**< Scalar lookup function implementation*/ +}; + /** FIB configuration structure */ struct rte_fib6_conf { enum rte_fib6_type type; /**< Type of FIB struct */ @@ -200,6 +206,22 @@ __rte_experimental struct rte_rib6 * rte_fib6_get_rib(struct rte_fib6 *fib); +/** + * Set lookup function based on type + * + * @param fib + * FIB object handle + * @param type + * type of lookup function + * + * @return + * 0 on success + * -EINVAL on failure + */ +__rte_experimental +int +rte_fib6_select_lookup(struct rte_fib6 *fib, enum rte_fib6_lookup_type type); + #ifdef __cplusplus } #endif diff --git a/lib/librte_fib/trie.c b/lib/librte_fib/trie.c index 2ae2add4f3..11a7ca285d 100644 --- a/lib/librte_fib/trie.c +++ b/lib/librte_fib/trie.c @@ -59,13 +59,6 @@ enum edge { REDGE }; -enum lookup_type { - MACRO, - INLINE, - UNI -}; -static enum lookup_type test_lookup = MACRO; - static inline uint32_t get_tbl24_idx(const uint8_t *ip) { @@ -153,22 +146,38 @@ LOOKUP_FUNC(2b, uint16_t, 1) LOOKUP_FUNC(4b, uint32_t, 2) LOOKUP_FUNC(8b, uint64_t, 3) -rte_fib6_lookup_fn_t -rte_trie_get_lookup_fn(struct rte_fib6_conf *conf) +static inline rte_fib6_lookup_fn_t +get_scalar_fn(enum rte_fib_trie_nh_sz nh_sz) { - enum rte_fib_trie_nh_sz nh_sz = conf->trie.nh_sz; - - if (test_lookup == MACRO) { - switch (nh_sz) { - case RTE_FIB6_TRIE_2B: - return rte_trie_lookup_bulk_2b; - case RTE_FIB6_TRIE_4B: - return rte_trie_lookup_bulk_4b; - case RTE_FIB6_TRIE_8B: - return rte_trie_lookup_bulk_8b; - } + switch (nh_sz) { + case RTE_FIB6_TRIE_2B: + return rte_trie_lookup_bulk_2b; + case RTE_FIB6_TRIE_4B: + return rte_trie_lookup_bulk_4b; + case RTE_FIB6_TRIE_8B: + return rte_trie_lookup_bulk_8b; + default: + return NULL; } +} + +rte_fib6_lookup_fn_t +trie_get_lookup_fn(void *p, enum rte_fib6_lookup_type type) +{ + enum rte_fib_trie_nh_sz nh_sz; + struct rte_trie_tbl *dp = p; + + if (dp == NULL) + return NULL; + + nh_sz = dp->nh_sz; + switch (type) { + case RTE_FIB6_LOOKUP_TRIE_SCALAR: + return get_scalar_fn(nh_sz); + default: + return NULL; + } return NULL; } diff --git a/lib/librte_fib/trie.h b/lib/librte_fib/trie.h index bb750c5aee..e328bef046 100644 --- a/lib/librte_fib/trie.h +++ b/lib/librte_fib/trie.h @@ -22,7 +22,7 @@ void trie_free(void *p); rte_fib6_lookup_fn_t -rte_trie_get_lookup_fn(struct rte_fib6_conf *fib_conf); +trie_get_lookup_fn(void *p, enum rte_fib6_lookup_type type); int trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], diff --git a/lib/librte_fib/version.map b/lib/librte_fib/version.map index 5fd792ab42..be975eab8e 100644 --- a/lib/librte_fib/version.map +++ b/lib/librte_fib/version.map @@ -19,6 +19,7 @@ EXPERIMENTAL { rte_fib6_lookup_bulk; rte_fib6_get_dp; rte_fib6_get_rib; + rte_fib6_select_lookup; local: *; }; -- 2.20.1