Hi Vladimir, On 09/03/2020 12:43, Vladimir Medvedkin wrote: > Add type argument to dir24_8_get_lookup_fn() > Now it supports 3 different lookup implementations: > RTE_FIB_DIR24_8_SCALAR_MACRO > RTE_FIB_DIR24_8_SCALAR_INLINE > RTE_FIB_DIR24_8_SCALAR_UNI > > Add new rte_fib_set_lookup_fn() - user can change lookup > function type runtime. > > Signed-off-by: Vladimir Medvedkin <vladimir.medved...@intel.com> > --- > lib/librte_fib/dir24_8.c | 32 ++++++++++++++++++++------------ > lib/librte_fib/dir24_8.h | 2 +- > lib/librte_fib/rte_fib.c | 20 +++++++++++++++++++- > lib/librte_fib/rte_fib.h | 22 ++++++++++++++++++++++ > lib/librte_fib/rte_fib_version.map | 1 + > 5 files changed, 63 insertions(+), 14 deletions(-) > > diff --git a/lib/librte_fib/dir24_8.c b/lib/librte_fib/dir24_8.c > index c9dce3c..825d061 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) > { > @@ -253,11 +246,18 @@ dir24_8_lookup_bulk_uni(void *p, const uint32_t *ips, > } > > 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_dir24_8_lookup_type type) > { > - enum rte_fib_dir24_8_nh_sz nh_sz = fib_conf->dir24_8.nh_sz; > + enum rte_fib_dir24_8_nh_sz nh_sz; > + struct dir24_8_tbl *dp = p; > > - if (test_lookup == MACRO) { > + if (dp == NULL) > + return NULL; > + > + nh_sz = dp->nh_sz; > + > + switch (type) { > + case RTE_FIB_DIR24_8_SCALAR_MACRO: > switch (nh_sz) { > case RTE_FIB_DIR24_8_1B: > return dir24_8_lookup_bulk_1b; > @@ -267,8 +267,10 @@ dir24_8_get_lookup_fn(struct rte_fib_conf *fib_conf) > return dir24_8_lookup_bulk_4b; > case RTE_FIB_DIR24_8_8B: > return dir24_8_lookup_bulk_8b; > + default: > + return NULL; > } > - } else if (test_lookup == INLINE) { > + case RTE_FIB_DIR24_8_SCALAR_INLINE: > switch (nh_sz) { > case RTE_FIB_DIR24_8_1B: > return dir24_8_lookup_bulk_0; > @@ -278,9 +280,15 @@ dir24_8_get_lookup_fn(struct rte_fib_conf *fib_conf) > return dir24_8_lookup_bulk_2; > case RTE_FIB_DIR24_8_8B: > return dir24_8_lookup_bulk_3; > + default: > + return NULL; > } > - } else > + case RTE_FIB_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 1ec437c..53c5dd2 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_dir24_8_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 e090808..59120b5 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_DIR24_8_SCALAR_MACRO); > fib->modify = dir24_8_modify; > return 0; > default: > @@ -317,3 +318,20 @@ rte_fib_get_rib(struct rte_fib *fib) > { > return (fib == NULL) ? NULL : fib->rib; > } > + > +int > +rte_fib_set_lookup_fn(struct rte_fib *fib, int 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 d06c5ef..0e98775 100644 > --- a/lib/librte_fib/rte_fib.h > +++ b/lib/librte_fib/rte_fib.h > @@ -47,6 +47,12 @@ enum rte_fib_dir24_8_nh_sz { > RTE_FIB_DIR24_8_8B > }; Do we provide the user guidance anywhere on the merits/advantages of each option?
> +enum rte_fib_dir24_8_lookup_type { > + RTE_FIB_DIR24_8_SCALAR_MACRO, > + RTE_FIB_DIR24_8_SCALAR_INLINE, > + RTE_FIB_DIR24_8_SCALAR_UNI > +}; > + > /** FIB configuration structure */ > struct rte_fib_conf { > enum rte_fib_type type; /**< Type of FIB struct */ > @@ -185,4 +191,20 @@ __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 > + * -EINVAL on failure > + * 0 on success > + */ > +__rte_experimental > +int > +rte_fib_set_lookup_fn(struct rte_fib *fib, int type); > + > #endif /* _RTE_FIB_H_ */ > diff --git a/lib/librte_fib/rte_fib_version.map > b/lib/librte_fib/rte_fib_version.map > index 9527417..216af66 100644 > --- a/lib/librte_fib/rte_fib_version.map > +++ b/lib/librte_fib/rte_fib_version.map > @@ -9,6 +9,7 @@ EXPERIMENTAL { > rte_fib_lookup_bulk; > rte_fib_get_dp; > rte_fib_get_rib; > + rte_fib_set_lookup_fn; > > rte_fib6_add; > rte_fib6_create; >