fib: add lookup runtime selection
authorVladimir Medvedkin <vladimir.medvedkin@intel.com>
Tue, 27 Oct 2020 15:11:24 +0000 (15:11 +0000)
committerDavid Marchand <david.marchand@redhat.com>
Wed, 28 Oct 2020 20:29:03 +0000 (21:29 +0100)
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 <vladimir.medvedkin@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/librte_fib/dir24_8.c
lib/librte_fib/dir24_8.h
lib/librte_fib/rte_fib.c
lib/librte_fib/rte_fib.h
lib/librte_fib/version.map

index c9dce3c..ab5a1b2 100644 (file)
@@ -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;
 }
 
index 1ec437c..6c43f67 100644 (file)
@@ -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,
index 18a422c..f2f343b 100644 (file)
@@ -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;
+       }
+}
index a58ac3c..ddb992c 100644 (file)
@@ -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
index 9527417..5fd792a 100644 (file)
@@ -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;