get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 104016,
    "url": "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 &amp; 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"
    ]
}