[2/6] fib: make lookup function type configurable

Message ID 1583757826-375246-3-git-send-email-vladimir.medvedkin@intel.com (mailing list archive)
State Superseded, archived
Delegated to: David Marchand
Headers
Series fib: implement AVX512 vector lookup |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Vladimir Medvedkin March 9, 2020, 12:43 p.m. UTC
  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

Ray Kinsella April 1, 2020, 5:47 a.m. UTC | #1
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;
>
  
Vladimir Medvedkin April 1, 2020, 6:48 p.m. UTC | #2
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;
>
  

Patch

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
 };
 
+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;