get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/62321/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 62321,
    "url": "http://patches.dpdk.org/api/patches/62321/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/45bd28f190e5cb0526e8fe66ae03eefcc2005796.1572621163.git.vladimir.medvedkin@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<45bd28f190e5cb0526e8fe66ae03eefcc2005796.1572621163.git.vladimir.medvedkin@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/45bd28f190e5cb0526e8fe66ae03eefcc2005796.1572621163.git.vladimir.medvedkin@intel.com",
    "date": "2019-11-01T15:21:39",
    "name": "[v6,06/12] fib: add FIB ipv6 support",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "f2e0fc1dc3e8f8e079f798f67305079e4b079434",
    "submitter": {
        "id": 1216,
        "url": "http://patches.dpdk.org/api/people/1216/?format=api",
        "name": "Vladimir Medvedkin",
        "email": "vladimir.medvedkin@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/45bd28f190e5cb0526e8fe66ae03eefcc2005796.1572621163.git.vladimir.medvedkin@intel.com/mbox/",
    "series": [
        {
            "id": 7198,
            "url": "http://patches.dpdk.org/api/series/7198/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=7198",
            "date": "2019-11-01T15:21:33",
            "name": "lib: add RIB and FIB liraries",
            "version": 6,
            "mbox": "http://patches.dpdk.org/series/7198/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/62321/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/62321/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id B07F6A00BE;\n\tFri,  1 Nov 2019 16:23:08 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id D93011E868;\n\tFri,  1 Nov 2019 16:22:05 +0100 (CET)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n by dpdk.org (Postfix) with ESMTP id 768EE1E54C\n for <dev@dpdk.org>; Fri,  1 Nov 2019 16:22:02 +0100 (CET)",
            "from orsmga004.jf.intel.com ([10.7.209.38])\n by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n 01 Nov 2019 08:22:02 -0700",
            "from silpixa00400072.ir.intel.com ([10.237.222.213])\n by orsmga004.jf.intel.com with ESMTP; 01 Nov 2019 08:22:00 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.68,256,1569308400\"; d=\"scan'208\";a=\"351979118\"",
        "From": "Vladimir Medvedkin <vladimir.medvedkin@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "bruce.richardson@intel.com, konstantin.ananyev@intel.com,\n thomas@monjalon.net, aconole@redhat.com",
        "Date": "Fri,  1 Nov 2019 15:21:39 +0000",
        "Message-Id": "\n <45bd28f190e5cb0526e8fe66ae03eefcc2005796.1572621163.git.vladimir.medvedkin@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": [
            "<cover.1572621162.git.vladimir.medvedkin@intel.com>",
            "<cover.1572621162.git.vladimir.medvedkin@intel.com>"
        ],
        "References": [
            "<cover.1572621162.git.vladimir.medvedkin@intel.com>",
            "<cover.1568221361.git.vladimir.medvedkin@intel.com>\n <cover.1572621162.git.vladimir.medvedkin@intel.com>"
        ],
        "Subject": "[dpdk-dev] [PATCH v6 06/12] fib: add FIB ipv6 support",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add FIB library support for IPv6.\nIt implements a dataplane structures and algorithms designed for\nfast IPv6 longest prefix match.\n\nSigned-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>\n---\n lib/librte_fib/Makefile            |   4 +-\n lib/librte_fib/meson.build         |   4 +-\n lib/librte_fib/rte_fib6.c          | 308 +++++++++++++++++++++++++++++++++++++\n lib/librte_fib/rte_fib6.h          | 179 +++++++++++++++++++++\n lib/librte_fib/rte_fib_version.map |   9 ++\n 5 files changed, 500 insertions(+), 4 deletions(-)\n create mode 100644 lib/librte_fib/rte_fib6.c\n create mode 100644 lib/librte_fib/rte_fib6.h",
    "diff": "diff --git a/lib/librte_fib/Makefile b/lib/librte_fib/Makefile\nindex 7362f68..0bdf55b 100644\n--- a/lib/librte_fib/Makefile\n+++ b/lib/librte_fib/Makefile\n@@ -17,9 +17,9 @@ EXPORT_MAP := rte_fib_version.map\n LIBABIVER := 1\n \n # all source are stored in SRCS-y\n-SRCS-$(CONFIG_RTE_LIBRTE_FIB) := rte_fib.c\n+SRCS-$(CONFIG_RTE_LIBRTE_FIB) := rte_fib.c rte_fib6.c\n \n # install this header file\n-SYMLINK-$(CONFIG_RTE_LIBRTE_FIB)-include := rte_fib.h\n+SYMLINK-$(CONFIG_RTE_LIBRTE_FIB)-include := rte_fib.h rte_fib6.h\n \n include $(RTE_SDK)/mk/rte.lib.mk\ndiff --git a/lib/librte_fib/meson.build b/lib/librte_fib/meson.build\nindex 6b72360..32dfdec 100644\n--- a/lib/librte_fib/meson.build\n+++ b/lib/librte_fib/meson.build\n@@ -3,6 +3,6 @@\n # Copyright(c) 2019 Intel Corporation\n \n allow_experimental_apis = true\n-sources = files('rte_fib.c')\n-headers = files('rte_fib.h')\n+sources = files('rte_fib.c', 'rte_fib6.c')\n+headers = files('rte_fib.h', 'rte_fib6.h')\n deps += ['rib']\ndiff --git a/lib/librte_fib/rte_fib6.c b/lib/librte_fib/rte_fib6.c\nnew file mode 100644\nindex 0000000..9f00a80\n--- /dev/null\n+++ b/lib/librte_fib/rte_fib6.c\n@@ -0,0 +1,308 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com>\n+ * Copyright(c) 2019 Intel Corporation\n+ */\n+\n+#include <stdint.h>\n+#include <string.h>\n+\n+#include <rte_eal.h>\n+#include <rte_eal_memconfig.h>\n+#include <rte_tailq.h>\n+#include <rte_errno.h>\n+#include <rte_rwlock.h>\n+#include <rte_malloc.h>\n+#include <rte_string_fns.h>\n+\n+#include <rte_rib6.h>\n+#include <rte_fib6.h>\n+\n+TAILQ_HEAD(rte_fib6_list, rte_tailq_entry);\n+static struct rte_tailq_elem rte_fib6_tailq = {\n+\t.name = \"RTE_FIB6\",\n+};\n+EAL_REGISTER_TAILQ(rte_fib6_tailq)\n+\n+/* Maximum length of a FIB name. */\n+#define FIB6_NAMESIZE\t64\n+\n+#if defined(RTE_LIBRTE_FIB_DEBUG)\n+#define FIB6_RETURN_IF_TRUE(cond, retval) do {\t\t\\\n+\tif (cond)\t\t\t\t\t\\\n+\t\treturn retval;\t\t\t\t\\\n+} while (0)\n+#else\n+#define FIB6_RETURN_IF_TRUE(cond, retval)\n+#endif\n+\n+struct rte_fib6 {\n+\tchar\t\t\tname[FIB6_NAMESIZE];\n+\tenum rte_fib6_type\ttype;\t/**< Type of FIB struct */\n+\tstruct rte_rib6\t\t*rib;\t/**< RIB helper datastruct */\n+\tvoid\t\t\t*dp;\t/**< pointer to the dataplane struct*/\n+\trte_fib6_lookup_fn_t\tlookup;\t/**< fib lookup function */\n+\trte_fib6_modify_fn_t\tmodify; /**< modify fib datastruct */\n+\tuint64_t\t\tdef_nh;\n+};\n+\n+static void\n+dummy_lookup(void *fib_p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE],\n+\tuint64_t *next_hops, const unsigned int n)\n+{\n+\tunsigned int i;\n+\tstruct rte_fib6 *fib = fib_p;\n+\tstruct rte_rib6_node *node;\n+\n+\tfor (i = 0; i < n; i++) {\n+\t\tnode = rte_rib6_lookup(fib->rib, ips[i]);\n+\t\tif (node != NULL)\n+\t\t\trte_rib6_get_nh(node, &next_hops[i]);\n+\t\telse\n+\t\t\tnext_hops[i] = fib->def_nh;\n+\t}\n+}\n+\n+static int\n+dummy_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE],\n+\tuint8_t depth, uint64_t next_hop, int op)\n+{\n+\tstruct rte_rib6_node *node;\n+\tif ((fib == NULL) || (depth > RTE_FIB6_MAXDEPTH))\n+\t\treturn -EINVAL;\n+\n+\tnode = rte_rib6_lookup_exact(fib->rib, ip, depth);\n+\n+\tswitch (op) {\n+\tcase RTE_FIB6_ADD:\n+\t\tif (node == NULL)\n+\t\t\tnode = rte_rib6_insert(fib->rib, ip, depth);\n+\t\tif (node == NULL)\n+\t\t\treturn -rte_errno;\n+\t\treturn rte_rib6_set_nh(node, next_hop);\n+\tcase RTE_FIB6_DEL:\n+\t\tif (node == NULL)\n+\t\t\treturn -ENOENT;\n+\t\trte_rib6_remove(fib->rib, ip, depth);\n+\t\treturn 0;\n+\t}\n+\treturn -EINVAL;\n+}\n+\n+static int\n+init_dataplane(struct rte_fib6 *fib, __rte_unused int socket_id,\n+\tstruct rte_fib6_conf *conf)\n+{\n+\tswitch (conf->type) {\n+\tcase RTE_FIB6_DUMMY:\n+\t\tfib->dp = fib;\n+\t\tfib->lookup = dummy_lookup;\n+\t\tfib->modify = dummy_modify;\n+\t\treturn 0;\n+\tdefault:\n+\t\treturn -EINVAL;\n+\t}\n+\treturn 0;\n+}\n+\n+int\n+rte_fib6_add(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE],\n+\tuint8_t depth, uint64_t next_hop)\n+{\n+\tif ((fib == NULL) || (ip == NULL) || (fib->modify == NULL) ||\n+\t\t\t(depth > RTE_FIB6_MAXDEPTH))\n+\t\treturn -EINVAL;\n+\treturn fib->modify(fib, ip, depth, next_hop, RTE_FIB6_ADD);\n+}\n+\n+int\n+rte_fib6_delete(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE],\n+\tuint8_t depth)\n+{\n+\tif ((fib == NULL) || (ip == NULL) || (fib->modify == NULL) ||\n+\t\t\t(depth > RTE_FIB6_MAXDEPTH))\n+\t\treturn -EINVAL;\n+\treturn fib->modify(fib, ip, depth, 0, RTE_FIB6_DEL);\n+}\n+\n+int\n+rte_fib6_lookup_bulk(struct rte_fib6 *fib,\n+\tuint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE],\n+\tuint64_t *next_hops, int n)\n+{\n+\tFIB6_RETURN_IF_TRUE((fib == NULL) || (ips == NULL) ||\n+\t\t(next_hops == NULL) || (fib->lookup == NULL), -EINVAL);\n+\tfib->lookup(fib->dp, ips, next_hops, n);\n+\treturn 0;\n+}\n+\n+struct rte_fib6 *\n+rte_fib6_create(const char *name, int socket_id, struct rte_fib6_conf *conf)\n+{\n+\tchar mem_name[FIB6_NAMESIZE];\n+\tint ret;\n+\tstruct rte_fib6 *fib = NULL;\n+\tstruct rte_rib6 *rib = NULL;\n+\tstruct rte_tailq_entry *te;\n+\tstruct rte_fib6_list *fib_list;\n+\tstruct rte_rib6_conf rib_conf;\n+\n+\t/* Check user arguments. */\n+\tif ((name == NULL) || (conf == NULL) || (conf->max_routes < 0) ||\n+\t\t\t(conf->type >= RTE_FIB6_TYPE_MAX)) {\n+\t\trte_errno = EINVAL;\n+\t\treturn NULL;\n+\t}\n+\n+\trib_conf.ext_sz = 0;\n+\trib_conf.max_nodes = conf->max_routes * 2;\n+\n+\trib = rte_rib6_create(name, socket_id, &rib_conf);\n+\tif (rib == NULL) {\n+\t\tRTE_LOG(ERR, LPM,\n+\t\t\t\"Can not allocate RIB %s\\n\", name);\n+\t\treturn NULL;\n+\t}\n+\n+\tsnprintf(mem_name, sizeof(mem_name), \"FIB6_%s\", name);\n+\tfib_list = RTE_TAILQ_CAST(rte_fib6_tailq.head, rte_fib6_list);\n+\n+\trte_mcfg_tailq_write_lock();\n+\n+\t/* guarantee there's no existing */\n+\tTAILQ_FOREACH(te, fib_list, next) {\n+\t\tfib = (struct rte_fib6 *)te->data;\n+\t\tif (strncmp(name, fib->name, FIB6_NAMESIZE) == 0)\n+\t\t\tbreak;\n+\t}\n+\tfib = NULL;\n+\tif (te != NULL) {\n+\t\trte_errno = EEXIST;\n+\t\tgoto exit;\n+\t}\n+\n+\t/* allocate tailq entry */\n+\tte = rte_zmalloc(\"FIB_TAILQ_ENTRY\", sizeof(*te), 0);\n+\tif (te == NULL) {\n+\t\tRTE_LOG(ERR, LPM,\n+\t\t\t\"Can not allocate tailq entry for FIB %s\\n\", name);\n+\t\trte_errno = ENOMEM;\n+\t\tgoto exit;\n+\t}\n+\n+\t/* Allocate memory to store the FIB data structures. */\n+\tfib = rte_zmalloc_socket(mem_name,\n+\t\tsizeof(struct rte_fib6), RTE_CACHE_LINE_SIZE, socket_id);\n+\tif (fib == NULL) {\n+\t\tRTE_LOG(ERR, LPM, \"FIB %s memory allocation failed\\n\", name);\n+\t\trte_errno = ENOMEM;\n+\t\tgoto free_te;\n+\t}\n+\n+\trte_strlcpy(fib->name, name, sizeof(fib->name));\n+\tfib->rib = rib;\n+\tfib->type = conf->type;\n+\tfib->def_nh = conf->default_nh;\n+\tret = init_dataplane(fib, socket_id, conf);\n+\tif (ret < 0) {\n+\t\tRTE_LOG(ERR, LPM,\n+\t\t\t\"FIB dataplane struct %s memory allocation failed\\n\",\n+\t\t\tname);\n+\t\trte_errno = -ret;\n+\t\tgoto free_fib;\n+\t}\n+\n+\tte->data = (void *)fib;\n+\tTAILQ_INSERT_TAIL(fib_list, te, next);\n+\n+\trte_mcfg_tailq_write_unlock();\n+\n+\treturn fib;\n+\n+free_fib:\n+\trte_free(fib);\n+free_te:\n+\trte_free(te);\n+exit:\n+\trte_mcfg_tailq_write_unlock();\n+\trte_rib6_free(rib);\n+\n+\treturn NULL;\n+}\n+\n+struct rte_fib6 *\n+rte_fib6_find_existing(const char *name)\n+{\n+\tstruct rte_fib6 *fib = NULL;\n+\tstruct rte_tailq_entry *te;\n+\tstruct rte_fib6_list *fib_list;\n+\n+\tfib_list = RTE_TAILQ_CAST(rte_fib6_tailq.head, rte_fib6_list);\n+\n+\trte_mcfg_tailq_read_lock();\n+\tTAILQ_FOREACH(te, fib_list, next) {\n+\t\tfib = (struct rte_fib6 *) te->data;\n+\t\tif (strncmp(name, fib->name, FIB6_NAMESIZE) == 0)\n+\t\t\tbreak;\n+\t}\n+\trte_mcfg_tailq_read_unlock();\n+\n+\tif (te == NULL) {\n+\t\trte_errno = ENOENT;\n+\t\treturn NULL;\n+\t}\n+\n+\treturn fib;\n+}\n+\n+static void\n+free_dataplane(struct rte_fib6 *fib)\n+{\n+\tswitch (fib->type) {\n+\tcase RTE_FIB6_DUMMY:\n+\t\treturn;\n+\tdefault:\n+\t\treturn;\n+\t}\n+}\n+\n+void\n+rte_fib6_free(struct rte_fib6 *fib)\n+{\n+\tstruct rte_tailq_entry *te;\n+\tstruct rte_fib6_list *fib_list;\n+\n+\tif (fib == NULL)\n+\t\treturn;\n+\n+\tfib_list = RTE_TAILQ_CAST(rte_fib6_tailq.head, rte_fib6_list);\n+\n+\trte_mcfg_tailq_write_lock();\n+\n+\t/* find our tailq entry */\n+\tTAILQ_FOREACH(te, fib_list, next) {\n+\t\tif (te->data == (void *)fib)\n+\t\t\tbreak;\n+\t}\n+\tif (te != NULL)\n+\t\tTAILQ_REMOVE(fib_list, te, next);\n+\n+\trte_mcfg_tailq_write_unlock();\n+\n+\tfree_dataplane(fib);\n+\trte_rib6_free(fib->rib);\n+\trte_free(fib);\n+\trte_free(te);\n+}\n+\n+void *\n+rte_fib6_get_dp(struct rte_fib6 *fib)\n+{\n+\treturn (fib == NULL) ? NULL : fib->dp;\n+}\n+\n+struct rte_rib6 *\n+rte_fib6_get_rib(struct rte_fib6 *fib)\n+{\n+\treturn (fib == NULL) ? NULL : fib->rib;\n+}\n+\ndiff --git a/lib/librte_fib/rte_fib6.h b/lib/librte_fib/rte_fib6.h\nnew file mode 100644\nindex 0000000..3322123\n--- /dev/null\n+++ b/lib/librte_fib/rte_fib6.h\n@@ -0,0 +1,179 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com>\n+ * Copyright(c) 2019 Intel Corporation\n+ */\n+\n+#ifndef _RTE_FIB6_H_\n+#define _RTE_FIB6_H_\n+\n+/**\n+ * @file\n+ * FIB (Forwarding information base) implementation\n+ * for IPv6 Longest Prefix Match\n+ */\n+\n+#include <rte_compat.h>\n+\n+#define RTE_FIB6_IPV6_ADDR_SIZE\t\t16\n+/** Maximum depth value possible for IPv6 FIB. */\n+#define RTE_FIB6_MAXDEPTH       128\n+\n+struct rte_fib6;\n+\n+/** Type of FIB struct */\n+enum rte_fib6_type {\n+\tRTE_FIB6_DUMMY,\t\t/**< RIB6 tree based FIB */\n+\tRTE_FIB6_TYPE_MAX\n+};\n+\n+/** Modify FIB function */\n+typedef int (*rte_fib6_modify_fn_t)(struct rte_fib6 *fib,\n+\tconst uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], uint8_t depth,\n+\tuint64_t next_hop, int op);\n+/** FIB bulk lookup function */\n+typedef void (*rte_fib6_lookup_fn_t)(void *fib,\n+\tuint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE],\n+\tuint64_t *next_hops, const unsigned int n);\n+\n+enum rte_fib6_op {\n+\tRTE_FIB6_ADD,\n+\tRTE_FIB6_DEL,\n+};\n+\n+/** FIB configuration structure */\n+struct rte_fib6_conf {\n+\tenum rte_fib6_type type; /**< Type of FIB struct */\n+\t/** Default value returned on lookup if there is no route */\n+\tuint64_t default_nh;\n+\tint\tmax_routes;\n+};\n+\n+/**\n+ * Create FIB\n+ *\n+ * @param name\n+ *  FIB name\n+ * @param socket_id\n+ *  NUMA socket ID for FIB table memory allocation\n+ * @param conf\n+ *  Structure containing the configuration\n+ * @return\n+ *  Handle to FIB object on success\n+ *  NULL otherwise with rte_errno set to an appropriate values.\n+ */\n+__rte_experimental\n+struct rte_fib6 *\n+rte_fib6_create(const char *name, int socket_id, struct rte_fib6_conf *conf);\n+\n+/**\n+ * Find an existing FIB object and return a pointer to it.\n+ *\n+ * @param name\n+ *  Name of the fib object as passed to rte_fib6_create()\n+ * @return\n+ *  Pointer to fib object or NULL if object not found with rte_errno\n+ *  set appropriately. Possible rte_errno values include:\n+ *   - ENOENT - required entry not available to return.\n+ */\n+__rte_experimental\n+struct rte_fib6 *\n+rte_fib6_find_existing(const char *name);\n+\n+/**\n+ * Free an FIB object.\n+ *\n+ * @param fib\n+ *   FIB object handle\n+ * @return\n+ *   None\n+ */\n+__rte_experimental\n+void\n+rte_fib6_free(struct rte_fib6 *fib);\n+\n+/**\n+ * Add a route to the FIB.\n+ *\n+ * @param fib\n+ *   FIB object handle\n+ * @param ip\n+ *   IPv6 prefix address to be added to the FIB\n+ * @param depth\n+ *   Prefix length\n+ * @param next_hop\n+ *   Next hop to be added to the FIB\n+ * @return\n+ *   0 on success, negative value otherwise\n+ */\n+__rte_experimental\n+int\n+rte_fib6_add(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE],\n+\tuint8_t depth, uint64_t next_hop);\n+\n+/**\n+ * Delete a rule from the FIB.\n+ *\n+ * @param fib\n+ *   FIB object handle\n+ * @param ip\n+ *   IPv6 prefix address to be deleted from the FIB\n+ * @param depth\n+ *   Prefix length\n+ * @return\n+ *   0 on success, negative value otherwise\n+ */\n+__rte_experimental\n+int\n+rte_fib6_delete(struct rte_fib6 *fib,\n+\tconst uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], uint8_t depth);\n+\n+/**\n+ * Lookup multiple IP addresses in the FIB.\n+ *\n+ * @param fib\n+ *   FIB object handle\n+ * @param ips\n+ *   Array of IPv6s to be looked up in the FIB\n+ * @param next_hops\n+ *   Next hop of the most specific rule found for IP.\n+ *   This is an array of eight byte values.\n+ *   If the lookup for the given IP failed, then corresponding element would\n+ *   contain default nexthop value configured for a FIB.\n+ * @param n\n+ *   Number of elements in ips (and next_hops) array to lookup.\n+ *  @return\n+ *   -EINVAL for incorrect arguments, otherwise 0\n+ */\n+__rte_experimental\n+int\n+rte_fib6_lookup_bulk(struct rte_fib6 *fib,\n+\tuint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE],\n+\tuint64_t *next_hops, int n);\n+\n+/**\n+ * Get pointer to the dataplane specific struct\n+ *\n+ * @param fib\n+ *   FIB6 object handle\n+ * @return\n+ *   Pointer on the dataplane struct on success\n+ *   NULL othervise\n+ */\n+__rte_experimental\n+void *\n+rte_fib6_get_dp(struct rte_fib6 *fib);\n+\n+/**\n+ * Get pointer to the RIB6\n+ *\n+ * @param fib\n+ *   FIB object handle\n+ * @return\n+ *   Pointer on the RIB6 on success\n+ *   NULL othervise\n+ */\n+__rte_experimental\n+struct rte_rib6 *\n+rte_fib6_get_rib(struct rte_fib6 *fib);\n+\n+#endif /* _RTE_FIB6_H_ */\ndiff --git a/lib/librte_fib/rte_fib_version.map b/lib/librte_fib/rte_fib_version.map\nindex 776195f..9527417 100644\n--- a/lib/librte_fib/rte_fib_version.map\n+++ b/lib/librte_fib/rte_fib_version.map\n@@ -10,5 +10,14 @@ EXPERIMENTAL {\n \trte_fib_get_dp;\n \trte_fib_get_rib;\n \n+\trte_fib6_add;\n+\trte_fib6_create;\n+\trte_fib6_delete;\n+\trte_fib6_find_existing;\n+\trte_fib6_free;\n+\trte_fib6_lookup_bulk;\n+\trte_fib6_get_dp;\n+\trte_fib6_get_rib;\n+\n \tlocal: *;\n };\n",
    "prefixes": [
        "v6",
        "06/12"
    ]
}