From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7FEEAA052A; Fri, 10 Jul 2020 16:47:07 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D3D1F1DEAA; Fri, 10 Jul 2020 16:46:53 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id CCF2C1DAFB for ; Fri, 10 Jul 2020 16:46:49 +0200 (CEST) IronPort-SDR: ZnbkFpXrnav5OYYGO0ieaw3/7N823ZGkqh7RRykPrImPaP5qb0BmfEz+4jXqvGCPkJ/faFM12F 1s8MYf3PjcbA== X-IronPort-AV: E=McAfee;i="6000,8403,9678"; a="166299002" X-IronPort-AV: E=Sophos;i="5.75,336,1589266800"; d="scan'208";a="166299002" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jul 2020 07:46:48 -0700 IronPort-SDR: jN+YmIt5mcUrGm1Ia2+rnWvZAgf2VFjsQ3TTU+zP2f6VGBANTTy1qZUZEbetn13M+AWEix6/Qa QSPj/Zq+Rp/g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,336,1589266800"; d="scan'208";a="358856605" Received: from silpixa00400322.ir.intel.com ([10.237.214.86]) by orsmga001.jf.intel.com with ESMTP; 10 Jul 2020 07:46:47 -0700 From: Vladimir Medvedkin To: dev@dpdk.org Cc: konstantin.ananyev@intel.com, bruce.richardson@intel.com Date: Fri, 10 Jul 2020 15:46:37 +0100 Message-Id: X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v5 2/8] fib: make lookup function type configurable X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- lib/librte_fib/dir24_8.c | 32 +++++++++++++++++++----------- lib/librte_fib/dir24_8.h | 2 +- lib/librte_fib/rte_fib.c | 21 +++++++++++++++++++- lib/librte_fib/rte_fib.h | 23 +++++++++++++++++++++ lib/librte_fib/rte_fib_version.map | 1 + 5 files changed, 65 insertions(+), 14 deletions(-) diff --git a/lib/librte_fib/dir24_8.c b/lib/librte_fib/dir24_8.c index c9dce3cbc..825d061fd 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 1ec437c0c..53c5dd29e 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 e0908084f..b9f6efbb1 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,21 @@ rte_fib_get_rib(struct rte_fib *fib) { return (fib == NULL) ? NULL : fib->rib; } + +int +rte_fib_set_lookup_fn(struct rte_fib *fib, + enum rte_fib_dir24_8_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; + } +} diff --git a/lib/librte_fib/rte_fib.h b/lib/librte_fib/rte_fib.h index 84ee774d2..892898c6f 100644 --- a/lib/librte_fib/rte_fib.h +++ b/lib/librte_fib/rte_fib.h @@ -58,6 +58,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 */ @@ -196,6 +202,23 @@ __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, + enum rte_fib_dir24_8_lookup_type type); + #ifdef __cplusplus } #endif diff --git a/lib/librte_fib/rte_fib_version.map b/lib/librte_fib/rte_fib_version.map index 9527417d2..216af66b3 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; -- 2.17.1