Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/104016/?format=api
http://patches.dpdk.org/api/patches/104016/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20211108173727.133124-2-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": "<20211108173727.133124-2-vladimir.medvedkin@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20211108173727.133124-2-vladimir.medvedkin@intel.com", "date": "2021-11-08T17:37:26", "name": "[2/2] doc: add programmer's guide for the FIB library", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "0f7397d88ad288a715b44ed904bdf0714c8bb51d", "submitter": { "id": 1216, "url": "http://patches.dpdk.org/api/people/1216/?format=api", "name": "Vladimir Medvedkin", "email": "vladimir.medvedkin@intel.com" }, "delegate": { "id": 24651, "url": "http://patches.dpdk.org/api/users/24651/?format=api", "username": "dmarchand", "first_name": "David", "last_name": "Marchand", "email": "david.marchand@redhat.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20211108173727.133124-2-vladimir.medvedkin@intel.com/mbox/", "series": [ { "id": 20401, "url": "http://patches.dpdk.org/api/series/20401/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=20401", "date": "2021-11-08T17:37:26", "name": "[1/2] doc: add programmer's guide for the RIB library", "version": 1, "mbox": "http://patches.dpdk.org/series/20401/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/104016/comments/", "check": "fail", "checks": "http://patches.dpdk.org/api/patches/104016/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 862C2A0C4E;\n\tMon, 8 Nov 2021 18:50:43 +0100 (CET)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 6CE66410FB;\n\tMon, 8 Nov 2021 18:50:43 +0100 (CET)", "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by mails.dpdk.org (Postfix) with ESMTP id E5213410FB\n for <dev@dpdk.org>; Mon, 8 Nov 2021 18:50:40 +0100 (CET)", "from orsmga007.jf.intel.com ([10.7.209.58])\n by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 08 Nov 2021 09:37:58 -0800", "from silpixa00400072.ir.intel.com (HELO\n silpixa00400072.ger.corp.intel.com) ([10.237.222.91])\n by orsmga007.jf.intel.com with ESMTP; 08 Nov 2021 09:37:57 -0800" ], "X-IronPort-AV": [ "E=McAfee;i=\"6200,9189,10162\"; a=\"295726472\"", "E=Sophos;i=\"5.87,218,1631602800\"; d=\"scan'208\";a=\"295726472\"", "E=Sophos;i=\"5.87,218,1631602800\"; d=\"scan'208\";a=\"491306995\"" ], "X-ExtLoop1": "1", "From": "Vladimir Medvedkin <vladimir.medvedkin@intel.com>", "To": "dev@dpdk.org", "Date": "Mon, 8 Nov 2021 17:37:26 +0000", "Message-Id": "<20211108173727.133124-2-vladimir.medvedkin@intel.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20211108173727.133124-1-vladimir.medvedkin@intel.com>", "References": "<20211108173727.133124-1-vladimir.medvedkin@intel.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[dpdk-dev] [PATCH 2/2] doc: add programmer's guide for the FIB\n library", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "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": "Currently, programmer's guide for the FIB library is missing.\nThis commit adds it.\n\nSigned-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>\n---\n doc/guides/prog_guide/fib_lib.rst | 139 +++++++++++++++++++++\n doc/guides/prog_guide/img/dir_24_8_alg.svg | 136 ++++++++++++++++++++\n doc/guides/prog_guide/index.rst | 1 +\n doc/guides/prog_guide/rib_lib.rst | 2 +-\n 4 files changed, 277 insertions(+), 1 deletion(-)\n create mode 100644 doc/guides/prog_guide/fib_lib.rst\n create mode 100644 doc/guides/prog_guide/img/dir_24_8_alg.svg", "diff": "diff --git a/doc/guides/prog_guide/fib_lib.rst b/doc/guides/prog_guide/fib_lib.rst\nnew file mode 100644\nindex 0000000000..4aa02e1ed9\n--- /dev/null\n+++ b/doc/guides/prog_guide/fib_lib.rst\n@@ -0,0 +1,139 @@\n+.. SPDX-License-Identifier: BSD-3-Clause\n+ Copyright(c) 2021 Intel Corporation.\n+\n+.. _FIB_Library:\n+\n+FIB Library\n+===========\n+\n+The FIB library provides a fast Longest Prefix Match (LPM) search for 32-bit\n+keys or 128-bit for IPv6. It can be used in a variety of applications,\n+the most typical of which is IPv4/IPv6 forwarding.\n+\n+.. note::\n+\n+ The API and implementation are very similar for IPv4's ``fib`` library and\n+ IPv6's ``fib6`` library, therefore only the ``fib`` library will be discussed here.\n+ Everything within this document except for the size of the prefixes applies\n+ to the ``rib6`` library.\n+\n+FIB API Overview\n+----------------\n+\n+The main configuration struct contains:\n+\n+* Type of :ref:`dataplane algorithm <fib_dataplane_algorithms>`.\n+\n+* Default next hop ID.\n+\n+* The maximum number of routes.\n+\n+* Settings for the data algorithm (:ref:`will be discussed later <fib_dataplane_algorithms>`).\n+\n+A FIB rule consists of a prefix and an associated next hop ID. The prefix consists\n+of an IPv4 network address (``uint32_t``) and the corresponding prefix length.\n+The prefix serves as the key and the next hop ID as the value while doing an LPM\n+search within FIB. The size of the next hop ID is variable and must be configured\n+during initialization.\n+\n+The main methods within the ``fib`` library are:\n+\n+* ``rte_fib_add()``: Add a new route with a corresponding next hop ID to the\n+ table or update the next hop ID if the prefix already exists in a table.\n+\n+* ``rte_fib_delete()``: Delete an existing route from the table.\n+\n+* ``rte_fib_lookup_bulk()``: Provides a bulk Longest Prefix Match (LPM) lookup function\n+ for a set of IP addresses, it will return a set of corresponding next hop IDs.\n+\n+\n+Implementation details\n+----------------------\n+\n+Internally FIB contains the ``rte_rib`` data struct to help maintain the dataplane struct.\n+The dataplane struct is opaque, so that users can add their own algorithm implementations.\n+\n+\n+.. _fib_dataplane_algorithms:\n+\n+Dataplane Algorithms\n+--------------------\n+\n+Dummy\n+~~~~~\n+\n+This algorithm uses ``rte_rib`` as a dataplane struct. Lookups are relatively slow,\n+but extra memory isn't used for the dataplane struct. This algorithm should only\n+be used for testing and debugging purposes.\n+\n+This algorithm will be used if the ``RTE_FIB_DUMMY`` type is configured as the\n+dataplane algorithm on FIB creation.\n+\n+\n+DIR-24-8\n+~~~~~~~~\n+\n+The current implementation of this algorithm uses a variation of the DIR-24-8\n+algorithm that trades memory usage for improved LPM lookup speed.\n+This algorithm allows the lookup operation to be performed using only a single\n+memory read access in most cases. In the statistically rare case where the best\n+match rule has a depth larger than 24, the lookup operation will require two\n+memory read accesses.\n+\n+This algorithm will be used if the ``RTE_FIB_DIR24_8`` type is configured as the\n+dataplane algorithm on FIB creation.\n+\n+The main FIB configuration struct stores the dataplane parameters inside ``dir24_8``\n+within the ``rte_fib_conf`` and it consists of:\n+\n+* ``nh_sz``: The size of the entry containing the next hop ID.\n+ This could be 1, 2, 4 or 8 bytes long.\n+ Note that all available bits except one are used to store the actual next hop ID.\n+\n+* ``num_tbl8``: The number of tbl8 groups, each group consists of 256 entries\n+ corresponding to the ``nh_sz`` size.\n+\n+The main elements of the dataplane struct for the DIR-24-8 algorithm are:\n+\n+* TBL24: An array with 2\\ :sup:`24` entries, corresponding to the ``nh_sz`` size.\n+\n+* TBL8: An array of ``num_tbl8`` tbl8 groups.\n+\n+The lookup algorithms logic can be seen in :numref:`figure_dir_24_8_alg`:\n+\n+.. _figure_dir_24_8_alg:\n+\n+.. figure:: img/dir_24_8_alg.*\n+\n+ DIR-24-8 Lookup algorithm\n+\n+The first table ``tbl24``, is indexed using the first 24 bits of the IP address to be looked up,\n+while the second table(s) ``tbl8``, is indexed using the last 8 bits of the IP address.\n+This means that depending on the outcome of trying to match the IP address of an incoming packet\n+to a rule stored in the tbl24 we might need to continue the lookup process in the second level.\n+\n+Since every entry of the tbl24 can potentially point to a tbl8,\n+ideally we would have 2\\ :sup:`24` tbl8s, which would be the same as having a\n+single table with 2\\ :sup:`32` entries. This is not feasible due to resource restrictions.\n+Instead, this approach takes advantage of the fact that rules longer than 24 bits are very rare.\n+By splitting the process into two different tables/levels and limiting the number of tbl8s,\n+we can greatly reduce memory consumption while maintaining a very good lookup speed.\n+This method generally results in one memory access per lookup.\n+\n+An entry in a tbl8 contains the following fields:\n+\n+* The next hop ID.\n+\n+* 1 bit indicating if the lookup should proceed inside the tbl8.\n+\n+Use cases\n+---------\n+\n+The FIB library is useful for any use cases that rely on the Longest Prefix Match (LPM)\n+algorithm such as IP forwarding or packet classification.\n+\n+More complex use cases are also possible, as it is possible to have next hop IDs\n+which are 63 bits long (using ``RTE_FIB_DIR24_8_8B`` as a next hop size).\n+These use cases could include storing two next hop IDs inside the 63 bits of the next hop.\n+This may be useful to provide a fallback next hop ID, ASN or forwarding class\n+corresponding to a given prefix without having to perform an additional lookup.\ndiff --git a/doc/guides/prog_guide/img/dir_24_8_alg.svg b/doc/guides/prog_guide/img/dir_24_8_alg.svg\nnew file mode 100644\nindex 0000000000..17725b7b97\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/dir_24_8_alg.svg\n@@ -0,0 +1,136 @@\n+<svg width=\"945.881\" height=\"658.889\" viewBox=\"0 0 709.411 494.167\" xml:space=\"preserve\" color-interpolation-filters=\"sRGB\" version=\"1.1\" id=\"svg220\" style=\"fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\">\n+ <style type=\"text/css\" id=\"style2\">\n+ .st1{fill:url(#grad0-4);stroke:#3c63ac;stroke-width:.749999}.st2{fill:#3c63ac;font-family:Calibri;font-size:1.16666em}.st3{marker-end:url(#mrkr4-55);stroke:#4672c4;stroke-linecap:round;stroke-linejoin:round;stroke-width:.999999}.st5{fill:url(#grad0-4);stroke:#3d64ac;stroke-width:.749999}.st6{fill:#3d64ac;font-family:Calibri;font-size:1.16666em}.st8,.st9{stroke:none}.st8{fill:#fff;stroke-linecap:butt;stroke-width:7.2}.st9{fill:none;stroke-width:.25}.st10{fill:#4672c4;font-family:Calibri;font-size:1.16666em;font-weight:700}\n+ </style>\n+ <defs id=\"Patterns_And_Gradients\">\n+ <linearGradient id=\"grad0-4\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n+ <stop offset=\"0\" stop-color=\"#e8ebf4\" stop-opacity=\"1\" id=\"stop4\"/>\n+ <stop offset=\".24\" stop-color=\"#f4f5f9\" stop-opacity=\"1\" id=\"stop6\"/>\n+ <stop offset=\".54\" stop-color=\"#feffff\" stop-opacity=\"1\" id=\"stop8\"/>\n+ </linearGradient>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient224\" x1=\"-.573\" y1=\"46.345\" x2=\"277.982\" y2=\"46.345\" gradientTransform=\"scale(.65397 1.52912)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient226\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient228\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient230\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient232\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient234\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient236\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient238\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient240\" x1=\"-.378\" y1=\"309.413\" x2=\"183.201\" y2=\"309.413\" gradientTransform=\"scale(.9923 1.00775)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient242\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient244\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient246\" x1=\"-.185\" y1=\"928.807\" x2=\"75.865\" y2=\"928.807\" gradientTransform=\"scale(2.02261 .49441)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient248\" x1=\"-.181\" y1=\"987.935\" x2=\"42.539\" y2=\"987.935\" gradientTransform=\"scale(2.07454 .48204)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient250\" x1=\"-.315\" y1=\"566.074\" x2=\"24.162\" y2=\"566.074\" gradientTransform=\"scale(1.18868 .84127)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient252\" x1=\"-.565\" y1=\"550.271\" x2=\"90.593\" y2=\"550.271\" gradientTransform=\"scale(1.29092 .77464)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient254\" x1=\"-.181\" y1=\"987.935\" x2=\"42.539\" y2=\"987.935\" gradientTransform=\"scale(2.07454 .48204)\" gradientUnits=\"userSpaceOnUse\"/>\n+ <linearGradient xlink:href=\"#grad0-4\" id=\"linearGradient256\" x1=\"-.204\" y1=\"834.253\" x2=\"79.387\" y2=\"834.253\" gradientTransform=\"scale(1.83941 .54365)\" gradientUnits=\"userSpaceOnUse\"/>\n+ </defs>\n+ <defs id=\"Markers\">\n+ <marker id=\"mrkr4-55\" refX=\"0\" orient=\"auto\" markerUnits=\"strokeWidth\" overflow=\"visible\" style=\"fill:#4672c4;fill-opacity:1;stroke:#4672c4;stroke-opacity:1;stroke-width:.28409061414099\">\n+ <use xlink:href=\"#lend4\" transform=\"scale(-3.52)\" id=\"use15\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\"/>\n+ </marker>\n+ <g id=\"lend4\">\n+ <path d=\"M2 1 0 0l2-1v2\" style=\"stroke:none\" id=\"path12\"/>\n+ </g>\n+ </defs>\n+ <g id=\"g218\" transform=\"translate(0 -2.27)\">\n+ <g id=\"shape1-1\" transform=\"translate(113.761 -.375)\">\n+ <path class=\"st1\" id=\"rect23\" style=\"fill:url(#linearGradient224)\" d=\"M0 71.242h181.417v425.196H0z\"/>\n+ </g>\n+ <g id=\"shape2-5\" transform=\"translate(127.934 -374.549)\">\n+ <path class=\"st1\" id=\"rect30\" style=\"fill:url(#linearGradient226)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ <text x=\"25.03\" y=\"482.21\" class=\"st2\" id=\"text32\">uint[8,16,32,64]_t</text>\n+ </g>\n+ <g id=\"shape3-9\" transform=\"translate(127.934 -332.029)\">\n+ <path class=\"st1\" id=\"rect37\" style=\"fill:url(#linearGradient228)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ </g>\n+ <g id=\"shape4-12\" transform=\"translate(127.934 -289.509)\">\n+ <path class=\"st1\" id=\"rect44\" style=\"fill:url(#linearGradient230)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ <text x=\"60.41\" y=\"482.21\" class=\"st2\" id=\"text46\">nh_id</text>\n+ </g>\n+ <g id=\"shape5-16\" transform=\"translate(127.934 -246.99)\">\n+ <path class=\"st1\" id=\"rect51\" style=\"fill:url(#linearGradient232)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ </g>\n+ <g id=\"shape6-19\" transform=\"translate(127.934 -110.927)\">\n+ <path class=\"st1\" id=\"rect56\" style=\"fill:url(#linearGradient234)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ </g>\n+ <g id=\"shape7-22\" transform=\"translate(127.934 -62.738)\">\n+ <path class=\"st1\" id=\"rect61\" style=\"fill:url(#linearGradient236)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ </g>\n+ <g id=\"shape8-25\" transform=\"translate(127.934 -14.549)\">\n+ <path class=\"st1\" id=\"rect66\" style=\"fill:url(#linearGradient238)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ </g>\n+ <g id=\"shape9-28\" transform=\"translate(527.619 -241.319)\">\n+ <path class=\"st1\" id=\"rect71\" style=\"fill:url(#linearGradient240)\" d=\"M0 312.186h181.417v184.252H0z\"/>\n+ </g>\n+ <g id=\"shape10-31\" transform=\"translate(541.792 -377.383)\">\n+ <path class=\"st1\" id=\"rect78\" style=\"fill:url(#linearGradient242)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ <text x=\"25.03\" y=\"482.21\" class=\"st2\" id=\"text80\">uint[8,16,32,64]_t</text>\n+ </g>\n+ <g id=\"shape11-35\" transform=\"translate(541.792 -334.864)\">\n+ <path class=\"st1\" id=\"rect87\" style=\"fill:url(#linearGradient244)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ <text x=\"60.41\" y=\"482.21\" class=\"st2\" id=\"text89\">nh_id</text>\n+ </g>\n+ <g id=\"shape12-39\" transform=\"translate(541.792 -252.659)\">\n+ <path class=\"st1\" id=\"rect94\" style=\"fill:url(#linearGradient246)\" d=\"M0 459.587h153.071v36.85H0z\"/>\n+ </g>\n+ <g id=\"shape13-42\" transform=\"translate(.375 -461.004)\">\n+ <path class=\"st1\" id=\"rect101\" style=\"fill:url(#linearGradient248)\" d=\"M0 476.595h87.874v19.843H0z\"/>\n+ <text x=\"36.84\" y=\"490.72\" class=\"st2\" id=\"text103\">24</text>\n+ </g>\n+ <g id=\"shape14-46\" transform=\"translate(88.25 -461.004)\">\n+ <path class=\"st1\" id=\"rect110\" style=\"fill:url(#linearGradient250)\" d=\"M0 476.595h28.346v19.843H0z\"/>\n+ <text x=\"10.63\" y=\"490.72\" class=\"st2\" id=\"text112\">8</text>\n+ </g>\n+ <g id=\"shape15-50\" transform=\"translate(44.312 -307.93)\">\n+ <path d=\"M0 343.37v153.07h83.62\" class=\"st3\" id=\"path117\"/>\n+ </g>\n+ <g id=\"shape16-56\" transform=\"translate(317.855 -198.796)\">\n+ <path d=\"m0 461.57 58.11-34.87 58.11 34.87-58.11 34.87z\" class=\"st5\" id=\"path124\" style=\"fill:url(#linearGradient252)\"/>\n+ <text x=\"31.32\" y=\"457.37\" class=\"st6\" id=\"text128\">Extended <tspan x=\"39.75\" dy=\"1.2em\" id=\"tspan126\" style=\"font-size:1em\">entry?</tspan></text>\n+ </g>\n+ <g id=\"shape17-61\" transform=\"translate(332.028 -79.745)\">\n+ <path class=\"st1\" id=\"rect135\" style=\"fill:url(#linearGradient254)\" d=\"M0 476.595h87.874v19.843H0z\"/>\n+ <text x=\"6.8\" y=\"490.72\" class=\"st2\" id=\"text137\">Return nh_id</text>\n+ </g>\n+ <g id=\"shape18-65\" transform=\"translate(375.969 -99.587)\">\n+ <path d=\"M0 397.23v99.21\" class=\"st3\" id=\"path144\"/>\n+ <path class=\"st8\" id=\"rect146\" d=\"M-7.372 438.43H7.366v16.8H-7.372z\"/>\n+ <text x=\"-7.37\" y=\"451.03\" class=\"st2\" id=\"text148\">no</text>\n+ </g>\n+ <g id=\"shape19-72\" transform=\"translate(281.005 -268.529)\">\n+ <path d=\"M0 457.04h94.96v39.4\" class=\"st3\" id=\"path153\"/>\n+ </g>\n+ <g id=\"shape20-77\" transform=\"translate(344.409 -371.713)\">\n+ <path class=\"st5\" id=\"rect160\" style=\"fill:url(#linearGradient256)\" d=\"M0 453.918h145.65v42.52H0z\"/>\n+ <text x=\"8.68\" y=\"479.38\" class=\"st6\" id=\"text162\">nh_id * 256 + ip & 0xff </text>\n+ </g>\n+ <g id=\"shape21-81\" transform=\"translate(116.595 -414.232)\">\n+ <path d=\"M0 439.75h300.1v56.69\" class=\"st3\" id=\"path167\"/>\n+ </g>\n+ <g id=\"shape22-86\" transform=\"translate(490.06 -353.289)\">\n+ <path d=\"M0 456.76h21.26v39.68h30.47\" class=\"st3\" id=\"path172\"/>\n+ </g>\n+ <g id=\"shape23-91\" transform=\"translate(434.073 -233.662)\">\n+ <path d=\"M0 496.44h12.05V358.39\" class=\"st3\" id=\"path179\"/>\n+ <path class=\"st8\" id=\"rect181\" d=\"M2.661 425.034h18.778v16.8H2.661z\"/>\n+ <text x=\"2.66\" y=\"437.63\" class=\"st2\" id=\"text183\">yes</text>\n+ </g>\n+ <g id=\"shape24-98\" transform=\"translate(375.591 -99.591)\">\n+ <path d=\"M242.74 262.59v212.59H0v21.26\" class=\"st3\" id=\"path188\"/>\n+ </g>\n+ <g id=\"shape25-103\" transform=\"translate(12.047 -483.914)\">\n+ <path class=\"st9\" id=\"rect195\" d=\"M0 486.517h89.291v9.921H0z\"/>\n+ <text x=\"7.26\" y=\"495.68\" class=\"st10\" id=\"text197\">IPv4 Address</text>\n+ </g>\n+ <g id=\"shape26-106\" transform=\"translate(170.079 -426.331)\">\n+ <path class=\"st9\" id=\"rect204\" d=\"M0 483.398h68.031v13.039H0z\"/>\n+ <text x=\"16.57\" y=\"494.12\" class=\"st10\" id=\"text206\">tbl24</text>\n+ </g>\n+ <g id=\"shape27-109\" transform=\"translate(597.067 -426.331)\">\n+ <path class=\"st9\" id=\"rect213\" d=\"M0 483.398h46.772v13.039H0z\"/>\n+ <text x=\"9.49\" y=\"494.12\" class=\"st10\" id=\"text215\">tbl8</text>\n+ </g>\n+ </g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst\nindex 0a53ec71c8..42c4a690c6 100644\n--- a/doc/guides/prog_guide/index.rst\n+++ b/doc/guides/prog_guide/index.rst\n@@ -38,6 +38,7 @@ Programmer's Guide\n member_lib\n lpm_lib\n lpm6_lib\n+ fib_lib\n rib_lib\n flow_classify_lib\n packet_distrib_lib\ndiff --git a/doc/guides/prog_guide/rib_lib.rst b/doc/guides/prog_guide/rib_lib.rst\nindex e8bb35a2b6..0a6c3d7063 100644\n--- a/doc/guides/prog_guide/rib_lib.rst\n+++ b/doc/guides/prog_guide/rib_lib.rst\n@@ -7,7 +7,7 @@ RIB Library\n The Routing Information Base (RIB) library provides a data store for routing information.\n This library is intended for use in control or management plane applications.\n There are more suitable libraries for use in data plane applications such as\n-:ref:`LPM <LPM_Library>` or FIB.\n+:ref:`LPM <LPM_Library>` or :ref:`FIB <FIB_Library>`.\n \n \n Implementation details\n", "prefixes": [ "2/2" ] }{ "id": 104016, "url": "