From a5b0d25d81f858f7815e2690b12503ff54d45be6 Mon Sep 17 00:00:00 2001 From: Vladimir Medvedkin Date: Tue, 27 Oct 2020 15:11:24 +0000 Subject: [PATCH] fib: add lookup runtime selection Add type argument to dir24_8_get_lookup_fn() Now it supports 3 different lookup implementations: RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO RTE_FIB_LOOKUP_DIR24_8_SCALAR_INLINE RTE_FIB_LOOKUP_DIR24_8_SCALAR_UNI Add new rte_fib_select_lookup() - user can change lookup function type runtime. Signed-off-by: Vladimir Medvedkin Acked-by: Konstantin Ananyev --- lib/librte_fib/dir24_8.c | 86 +++++++++++++++++++++++--------------- lib/librte_fib/dir24_8.h | 2 +- lib/librte_fib/rte_fib.c | 21 +++++++++- lib/librte_fib/rte_fib.h | 31 ++++++++++++++ lib/librte_fib/version.map | 1 + 5 files changed, 106 insertions(+), 35 deletions(-) diff --git a/lib/librte_fib/dir24_8.c b/lib/librte_fib/dir24_8.c index c9dce3cbc9..ab5a1b208e 100644 --- a/lib/librte_fib/dir24_8.c +++ b/lib/librte_fib/dir24_8.c @@ -45,13 +45,6 @@ struct dir24_8_tbl { #define ROUNDUP(x, y) RTE_ALIGN_CEIL(x, (1 << (32 - y))) -enum lookup_type { - MACRO, - INLINE, - UNI -}; -enum lookup_type test_lookup = MACRO; - static inline void * get_tbl24_p(struct dir24_8_tbl *dp, uint32_t ip, uint8_t nh_sz) { @@ -252,35 +245,62 @@ dir24_8_lookup_bulk_uni(void *p, const uint32_t *ips, } } +static inline rte_fib_lookup_fn_t +get_scalar_fn(enum rte_fib_dir24_8_nh_sz nh_sz) +{ + switch (nh_sz) { + case RTE_FIB_DIR24_8_1B: + return dir24_8_lookup_bulk_1b; + case RTE_FIB_DIR24_8_2B: + return dir24_8_lookup_bulk_2b; + case RTE_FIB_DIR24_8_4B: + return dir24_8_lookup_bulk_4b; + case RTE_FIB_DIR24_8_8B: + return dir24_8_lookup_bulk_8b; + default: + return NULL; + } +} + +static inline rte_fib_lookup_fn_t +get_scalar_fn_inlined(enum rte_fib_dir24_8_nh_sz nh_sz) +{ + switch (nh_sz) { + case RTE_FIB_DIR24_8_1B: + return dir24_8_lookup_bulk_0; + case RTE_FIB_DIR24_8_2B: + return dir24_8_lookup_bulk_1; + case RTE_FIB_DIR24_8_4B: + return dir24_8_lookup_bulk_2; + case RTE_FIB_DIR24_8_8B: + return dir24_8_lookup_bulk_3; + default: + return NULL; + } +} + rte_fib_lookup_fn_t -dir24_8_get_lookup_fn(struct rte_fib_conf *fib_conf) +dir24_8_get_lookup_fn(void *p, enum rte_fib_lookup_type type) { - enum rte_fib_dir24_8_nh_sz nh_sz = fib_conf->dir24_8.nh_sz; - - if (test_lookup == MACRO) { - switch (nh_sz) { - case RTE_FIB_DIR24_8_1B: - return dir24_8_lookup_bulk_1b; - case RTE_FIB_DIR24_8_2B: - return dir24_8_lookup_bulk_2b; - case RTE_FIB_DIR24_8_4B: - return dir24_8_lookup_bulk_4b; - case RTE_FIB_DIR24_8_8B: - return dir24_8_lookup_bulk_8b; - } - } else if (test_lookup == INLINE) { - switch (nh_sz) { - case RTE_FIB_DIR24_8_1B: - return dir24_8_lookup_bulk_0; - case RTE_FIB_DIR24_8_2B: - return dir24_8_lookup_bulk_1; - case RTE_FIB_DIR24_8_4B: - return dir24_8_lookup_bulk_2; - case RTE_FIB_DIR24_8_8B: - return dir24_8_lookup_bulk_3; - } - } else + enum rte_fib_dir24_8_nh_sz nh_sz; + struct dir24_8_tbl *dp = p; + + if (dp == NULL) + return NULL; + + nh_sz = dp->nh_sz; + + switch (type) { + case RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO: + return get_scalar_fn(nh_sz); + case RTE_FIB_LOOKUP_DIR24_8_SCALAR_INLINE: + return get_scalar_fn_inlined(nh_sz); + case RTE_FIB_LOOKUP_DIR24_8_SCALAR_UNI: return dir24_8_lookup_bulk_uni; + default: + return NULL; + } + return NULL; } diff --git a/lib/librte_fib/dir24_8.h b/lib/librte_fib/dir24_8.h index 1ec437c0cb..6c43f67d49 100644 --- a/lib/librte_fib/dir24_8.h +++ b/lib/librte_fib/dir24_8.h @@ -22,7 +22,7 @@ void dir24_8_free(void *p); rte_fib_lookup_fn_t -dir24_8_get_lookup_fn(struct rte_fib_conf *conf); +dir24_8_get_lookup_fn(void *p, enum rte_fib_lookup_type type); int dir24_8_modify(struct rte_fib *fib, uint32_t ip, uint8_t depth, diff --git a/lib/librte_fib/rte_fib.c b/lib/librte_fib/rte_fib.c index 18a422c3de..f2f343beeb 100644 --- a/lib/librte_fib/rte_fib.c +++ b/lib/librte_fib/rte_fib.c @@ -107,7 +107,8 @@ init_dataplane(struct rte_fib *fib, __rte_unused int socket_id, fib->dp = dir24_8_create(dp_name, socket_id, conf); if (fib->dp == NULL) return -rte_errno; - fib->lookup = dir24_8_get_lookup_fn(conf); + fib->lookup = dir24_8_get_lookup_fn(fib->dp, + RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO); fib->modify = dir24_8_modify; return 0; default: @@ -317,3 +318,21 @@ rte_fib_get_rib(struct rte_fib *fib) { return (fib == NULL) ? NULL : fib->rib; } + +int +rte_fib_select_lookup(struct rte_fib *fib, + enum rte_fib_lookup_type type) +{ + rte_fib_lookup_fn_t fn; + + switch (fib->type) { + case RTE_FIB_DIR24_8: + fn = dir24_8_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_fib.h b/lib/librte_fib/rte_fib.h index a58ac3caea..ddb992c201 100644 --- a/lib/librte_fib/rte_fib.h +++ b/lib/librte_fib/rte_fib.h @@ -57,6 +57,21 @@ enum rte_fib_dir24_8_nh_sz { RTE_FIB_DIR24_8_8B }; +/** Type of lookup function implementation */ +enum rte_fib_lookup_type { + RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO, + /**< Macro based lookup function */ + RTE_FIB_LOOKUP_DIR24_8_SCALAR_INLINE, + /**< + * Lookup implementation using inlined functions + * for different next hop sizes + */ + RTE_FIB_LOOKUP_DIR24_8_SCALAR_UNI, + /**< + * Unified lookup function for all next hop sizes + */ +}; + /** FIB configuration structure */ struct rte_fib_conf { enum rte_fib_type type; /**< Type of FIB struct */ @@ -195,6 +210,22 @@ __rte_experimental struct rte_rib * rte_fib_get_rib(struct rte_fib *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_fib_select_lookup(struct rte_fib *fib, enum rte_fib_lookup_type type); + #ifdef __cplusplus } #endif diff --git a/lib/librte_fib/version.map b/lib/librte_fib/version.map index 9527417d22..5fd792ab42 100644 --- a/lib/librte_fib/version.map +++ b/lib/librte_fib/version.map @@ -9,6 +9,7 @@ EXPERIMENTAL { rte_fib_lookup_bulk; rte_fib_get_dp; rte_fib_get_rib; + rte_fib_select_lookup; rte_fib6_add; rte_fib6_create; -- 2.20.1