[2/6] fib: make lookup function type configurable
Checks
Commit Message
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.medvedkin@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(-)
Comments
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.medvedkin@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;
>
Hi Ray,
-----Original Message-----
From: Ray Kinsella <mdr@ashroe.eu>
Sent: Wednesday, April 1, 2020 6:48 AM
To: Medvedkin, Vladimir <vladimir.medvedkin@intel.com>; dev@dpdk.org
Cc: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Richardson, Bruce <bruce.richardson@intel.com>
Subject: Re: [dpdk-dev] [PATCH 2/6] fib: make lookup function type configurable
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.medvedkin@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?
No, we don't at the moment. I covered this in my slides about FIB. In my ToDo I have a plan to add documentation for this library and I will reflect this option there.
> +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;
>
@@ -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;
}
@@ -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,
@@ -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;
+ }
+}
@@ -47,6 +47,12 @@ enum rte_fib_dir24_8_nh_sz {
RTE_FIB_DIR24_8_8B
};
+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_ */
@@ -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;