#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)
{
}
}
+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;
}
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:
{
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;
+ }
+}
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 */
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