Add type argument to trie_get_lookup_fn() Now it only supports RTE_FIB6_TRIE_SCALAR
Add new rte_fib6_set_lookup_fn() - user can change lookup function type runtime. Signed-off-by: Vladimir Medvedkin <vladimir.medved...@intel.com> Acked-by: Konstantin Ananyev <konstantin.anan...@intel.com> --- lib/librte_fib/rte_fib6.c | 20 +++++++++++++++- lib/librte_fib/rte_fib6.h | 23 +++++++++++++++++++ lib/librte_fib/rte_fib_version.map | 1 + lib/librte_fib/trie.c | 47 +++++++++++++++++++++++--------------- lib/librte_fib/trie.h | 2 +- 5 files changed, 72 insertions(+), 21 deletions(-) diff --git a/lib/librte_fib/rte_fib6.c b/lib/librte_fib/rte_fib6.c index a1f0db8..566cd5f 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_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_set_lookup_fn(struct rte_fib6 *fib, + enum rte_fib_trie_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 bbfcf23..cd0c75e 100644 --- a/lib/librte_fib/rte_fib6.h +++ b/lib/librte_fib/rte_fib6.h @@ -53,12 +53,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_fib_trie_lookup_type { + RTE_FIB6_TRIE_SCALAR /**< Scalar lookup function implementation*/ +}; + /** FIB configuration structure */ struct rte_fib6_conf { enum rte_fib6_type type; /**< Type of FIB struct */ @@ -201,6 +207,23 @@ __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 + * -EINVAL on failure + * 0 on success + */ +__rte_experimental +int +rte_fib6_set_lookup_fn(struct rte_fib6 *fib, + enum rte_fib_trie_lookup_type type); + #ifdef __cplusplus } #endif diff --git a/lib/librte_fib/rte_fib_version.map b/lib/librte_fib/rte_fib_version.map index 216af66..9d1e181 100644 --- a/lib/librte_fib/rte_fib_version.map +++ b/lib/librte_fib/rte_fib_version.map @@ -19,6 +19,7 @@ EXPERIMENTAL { rte_fib6_lookup_bulk; rte_fib6_get_dp; rte_fib6_get_rib; + rte_fib6_set_lookup_fn; local: *; }; diff --git a/lib/librte_fib/trie.c b/lib/librte_fib/trie.c index 2ae2add..fc14670 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) +static inline rte_fib6_lookup_fn_t +get_scalar_fn(enum rte_fib_trie_nh_sz nh_sz) +{ + 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 -rte_trie_get_lookup_fn(struct rte_fib6_conf *conf) +trie_get_lookup_fn(void *p, enum rte_fib_trie_lookup_type type) { - enum rte_fib_trie_nh_sz nh_sz = conf->trie.nh_sz; + enum rte_fib_trie_nh_sz nh_sz; + struct rte_trie_tbl *dp = p; - 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; - } + if (dp == NULL) + return NULL; + + nh_sz = dp->nh_sz; + + switch (type) { + case RTE_FIB6_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 bb750c5..0d5ef9a 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_fib_trie_lookup_type type); int trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], -- 2.7.4