get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 104017,
    "url": "http://patches.dpdk.org/api/patches/104017/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20211108173727.133124-1-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-1-vladimir.medvedkin@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211108173727.133124-1-vladimir.medvedkin@intel.com",
    "date": "2021-11-08T17:37:25",
    "name": "[1/2] doc: add programmer's guide for the RIB library",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "dff295ffdbc4b85a6199cf90f4371fbf4b6ed650",
    "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-1-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/104017/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/104017/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 92D70A0C4E;\n\tMon,  8 Nov 2021 18:50:51 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id EE14241121;\n\tMon,  8 Nov 2021 18:50:44 +0100 (CET)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by mails.dpdk.org (Postfix) with ESMTP id 41426410E4\n for <dev@dpdk.org>; Mon,  8 Nov 2021 18:50:42 +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:57 -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:56 -0800"
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10162\"; a=\"295726467\"",
            "E=Sophos;i=\"5.87,218,1631602800\"; d=\"scan'208\";a=\"295726467\"",
            "E=Sophos;i=\"5.87,218,1631602800\"; d=\"scan'208\";a=\"491306984\""
        ],
        "X-ExtLoop1": "1",
        "From": "Vladimir Medvedkin <vladimir.medvedkin@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon,  8 Nov 2021 17:37:25 +0000",
        "Message-Id": "<20211108173727.133124-1-vladimir.medvedkin@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 1/2] doc: add programmer's guide for the RIB\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 RIB library is missing.\nThis commit adds it.\n\nSigned-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>\n---\n doc/guides/prog_guide/img/rib_internals.svg | 148 +++++++++++++++++\n doc/guides/prog_guide/img/rib_pic.svg       | 152 +++++++++++++++++\n doc/guides/prog_guide/index.rst             |   1 +\n doc/guides/prog_guide/rib_lib.rst           | 172 ++++++++++++++++++++\n 4 files changed, 473 insertions(+)\n create mode 100644 doc/guides/prog_guide/img/rib_internals.svg\n create mode 100644 doc/guides/prog_guide/img/rib_pic.svg\n create mode 100644 doc/guides/prog_guide/rib_lib.rst",
    "diff": "diff --git a/doc/guides/prog_guide/img/rib_internals.svg b/doc/guides/prog_guide/img/rib_internals.svg\nnew file mode 100644\nindex 0000000000..7e40046cba\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/rib_internals.svg\n@@ -0,0 +1,148 @@\n+<svg width=\"1740.327\" height=\"670.034\" viewBox=\"0 0 1305.249 502.526\" xml:space=\"preserve\" color-interpolation-filters=\"sRGB\" version=\"1.1\" id=\"svg997\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\" style=\"fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3\">\n+  <style type=\"text/css\" id=\"style740\">\n+    .st1{fill:#ff0;fill-opacity:.15;stroke:#3c63ac;stroke-width:.75}.st2,.st3{fill:#fee599;stroke:#c7c8c8;stroke-width:.25}.st3{fill:#bfbfbf}.st4{marker-end:url(#mrkr4-12);stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}.st10{stroke-width:.25}.st6{fill:#23d127}.st6,.st7,.st8,.st9{stroke:#c7c8c8;stroke-width:.25}.st7{fill:#00b0f0}.st8{fill:red}.st9{fill:#7030a0}.st10{fill:none;stroke:none}.st11{fill:#4672c4;font-family:Calibri;font-size:1.5em}.st12{font-size:1em}\n+  </style>\n+  <defs id=\"Markers\">\n+    <marker id=\"mrkr4-12\" refX=\"-7.04\" orient=\"auto\" markerUnits=\"strokeWidth\" overflow=\"visible\" style=\"fill:#000;fill-opacity:1;stroke:#000;stroke-opacity:1;stroke-width:.28409090909091\">\n+      <use xlink:href=\"#lend4\" transform=\"scale(-3.52)\" id=\"use745\" 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=\"path742\"/>\n+    </g>\n+  </defs>\n+  <g id=\"g995\" transform=\"translate(-217.077 -27.932)\">\n+    <g id=\"shape1025-1\" transform=\"translate(504.643 -65.197)\">\n+      <path d=\"M583.63 595.28 290.41 324.57 0 595.28Z\" class=\"st1\" id=\"path753\"/>\n+    </g>\n+    <g id=\"shape2-3\" transform=\"translate(992.354 -368.504)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path758\"/>\n+    </g>\n+    <g id=\"shape3-5\" transform=\"translate(1182.05 -467.717)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path763\"/>\n+    </g>\n+    <g id=\"shape8-7\" transform=\"translate(1190.35 -476.016)\">\n+      <path d=\"m0 595.28-143.05 56.53\" class=\"st4\" id=\"path768\"/>\n+    </g>\n+    <g id=\"shape22-13\" transform=\"translate(1094.1 -297.638)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path773\"/>\n+    </g>\n+    <g id=\"shape31-15\" transform=\"translate(1366.3 -368.504)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path778\"/>\n+    </g>\n+    <g id=\"shape33-17\" transform=\"translate(1465.51 -297.638)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path783\"/>\n+    </g>\n+    <g id=\"shape36-19\" transform=\"translate(1230.44 -476.016)\">\n+      <path d=\"m0 595.28 137.65 56.44\" class=\"st4\" id=\"path788\"/>\n+    </g>\n+    <g id=\"shape1000-24\" transform=\"translate(881.803 -297.638)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path793\"/>\n+    </g>\n+    <g id=\"shape1002-26\" transform=\"translate(994.885 -226.772)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st6\" id=\"path798\"/>\n+    </g>\n+    <g id=\"shape1006-28\" transform=\"translate(1257.06 -297.638)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path803\"/>\n+    </g>\n+    <g id=\"shape1007-30\" transform=\"translate(1153.7 -226.772)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path808\"/>\n+    </g>\n+    <g id=\"shape1008-32\" transform=\"translate(1366.3 -226.772)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path813\"/>\n+    </g>\n+    <g id=\"shape1012-34\" transform=\"translate(768.113 -226.772)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path818\"/>\n+    </g>\n+    <g id=\"shape1013-36\" transform=\"translate(668.9 -155.906)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st7\" id=\"path823\"/>\n+    </g>\n+    <g id=\"shape1018-38\" transform=\"translate(868.818 -155.906)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st8\" id=\"path828\"/>\n+    </g>\n+    <g id=\"shape1019-40\" transform=\"translate(769.125 -85.04)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st9\" id=\"path833\"/>\n+    </g>\n+    <g id=\"shape1026-42\" transform=\"translate(238.475 -510.236)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path838\"/>\n+    </g>\n+    <g id=\"shape1027-44\" transform=\"translate(238.475 -439.37)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path843\"/>\n+    </g>\n+    <g id=\"shape1028-46\" transform=\"translate(238.475 -368.504)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st6\" id=\"path848\"/>\n+    </g>\n+    <g id=\"shape1029-48\" transform=\"translate(238.475 -297.638)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st7\" id=\"path853\"/>\n+    </g>\n+    <g id=\"shape1030-50\" transform=\"translate(238.475 -226.772)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st8\" id=\"path858\"/>\n+    </g>\n+    <g id=\"shape1031-52\" transform=\"translate(238.475 -155.906)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st9\" id=\"path863\"/>\n+    </g>\n+    <g id=\"shape1032-54\" transform=\"translate(300.688 -518.013)\">\n+      <path class=\"st10\" id=\"rect870\" d=\"M0 554.136h164.559v41.14H0z\"/>\n+      <text x=\"13.67\" y=\"580.11\" class=\"st11\" id=\"text872\">Intermediate node</text>\n+    </g>\n+    <g id=\"shape1033-57\" transform=\"translate(300.688 -447.147)\">\n+      <path class=\"st10\" id=\"rect879\" d=\"M0 554.136h164.559v41.14H0z\"/>\n+      <text x=\"15.71\" y=\"569.31\" class=\"st11\" id=\"text883\">Node containing a <tspan x=\"62.17\" dy=\"1.2em\" class=\"st12\" id=\"tspan881\">route</tspan></text>\n+    </g>\n+    <g id=\"shape1034-61\" transform=\"translate(300.688 -376.281)\">\n+      <path class=\"st10\" id=\"rect890\" d=\"M0 554.136h164.559v41.14H0z\"/>\n+      <text x=\"35.5\" y=\"580.11\" class=\"st11\" id=\"text892\">10.15.0.0/23</text>\n+    </g>\n+    <g id=\"shape1035-64\" transform=\"translate(300.688 -305.414)\">\n+      <path class=\"st10\" id=\"rect899\" d=\"M0 554.136h164.559v41.14H0z\"/>\n+      <text x=\"40.06\" y=\"580.11\" class=\"st11\" id=\"text901\">10.0.0.0/29</text>\n+    </g>\n+    <g id=\"shape1036-67\" transform=\"translate(300.688 -234.548)\">\n+      <path class=\"st10\" id=\"rect908\" d=\"M0 554.136h164.559v41.14H0z\"/>\n+      <text x=\"30.93\" y=\"580.11\" class=\"st11\" id=\"text910\">10.0.0.128/25</text>\n+    </g>\n+    <g id=\"shape1037-70\" transform=\"translate(300.688 -163.682)\">\n+      <path class=\"st10\" id=\"rect917\" d=\"M0 554.136h164.559v41.14H0z\"/>\n+      <text x=\"30.93\" y=\"580.11\" class=\"st11\" id=\"text919\">10.0.0.160/27</text>\n+    </g>\n+    <g id=\"shape1038-73\" transform=\"translate(218.008 -100.593)\">\n+      <path d=\"m85.56 595.28-42.78-41.14L0 595.28Z\" class=\"st1\" id=\"path924\"/>\n+    </g>\n+    <g id=\"shape1039-75\" transform=\"translate(308.827 -92.816)\">\n+      <path class=\"st10\" id=\"rect931\" d=\"M0 554.136h164.559v41.14H0z\"/>\n+      <text x=\"8.82\" y=\"558.51\" class=\"st11\" id=\"text937\">Routes falling under <tspan x=\"5.62\" dy=\"1.2em\" class=\"st12\" id=\"tspan933\">common 10.0.0.0/24 </tspan><tspan x=\"61.23\" dy=\"1.2em\" class=\"st12\" id=\"tspan935\">prefix</tspan></text>\n+    </g>\n+    <g id=\"shape1040-80\" transform=\"translate(1374.6 -376.804)\">\n+      <path d=\"m0 595.28-62.71 27.91\" class=\"st4\" id=\"path942\"/>\n+    </g>\n+    <g id=\"shape1041-85\" transform=\"translate(1414.69 -376.804)\">\n+      <path d=\"m0 595.28 52.87 27.52\" class=\"st4\" id=\"path947\"/>\n+    </g>\n+    <g id=\"shape1042-90\" transform=\"translate(1305.46 -305.938)\">\n+      <path d=\"m0 595.28 62.71 27.91\" class=\"st4\" id=\"path952\"/>\n+    </g>\n+    <g id=\"shape1043-95\" transform=\"translate(1265.36 -305.938)\">\n+      <path d=\"m0 595.28-56.94 27.69\" class=\"st4\" id=\"path957\"/>\n+    </g>\n+    <g id=\"shape1044-100\" transform=\"translate(1040.75 -376.804)\">\n+      <path d=\"m0 595.28 55.35 27.62\" class=\"st4\" id=\"path962\"/>\n+    </g>\n+    <g id=\"shape1045-105\" transform=\"translate(1000.65 -376.804)\">\n+      <path d=\"m0 595.28-64.01 27.95\" class=\"st4\" id=\"path967\"/>\n+    </g>\n+    <g id=\"shape1046-110\" transform=\"translate(930.196 -305.938)\">\n+      <path d=\"m0 595.28 66.5 28.03\" class=\"st4\" id=\"path972\"/>\n+    </g>\n+    <g id=\"shape1047-115\" transform=\"translate(890.102 -305.938)\">\n+      <path d=\"m0 595.28-67.1 28.05\" class=\"st4\" id=\"path977\"/>\n+    </g>\n+    <g id=\"shape1048-120\" transform=\"translate(816.506 -235.071)\">\n+      <path d=\"m0 595.28 54.33 27.58\" class=\"st4\" id=\"path982\"/>\n+    </g>\n+    <g id=\"shape1049-125\" transform=\"translate(776.413 -235.071)\">\n+      <path d=\"m0 595.28-52.87 27.52\" class=\"st4\" id=\"path987\"/>\n+    </g>\n+    <g id=\"shape1050-130\" transform=\"translate(877.117 -164.205)\">\n+      <path d=\"m0 595.28-53.34 27.54\" class=\"st4\" id=\"path992\"/>\n+    </g>\n+  </g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/img/rib_pic.svg b/doc/guides/prog_guide/img/rib_pic.svg\nnew file mode 100644\nindex 0000000000..8a8b176502\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/rib_pic.svg\n@@ -0,0 +1,152 @@\n+<svg width=\"1280.324\" height=\"563.481\" viewBox=\"0 0 960.246 422.611\" xml:space=\"preserve\" color-interpolation-filters=\"sRGB\" version=\"1.1\" id=\"svg249\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\" style=\"fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3\">\n+  <style type=\"text/css\" id=\"style9\">\n+    .st1{fill:#eb94e0}.st1,.st2,.st3{stroke:#c7c8c8;stroke-width:.25}.st2{fill:#bfbfbf}.st3{fill:#00b0f0}.st4{marker-end:url(#mrkr4-16);stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}.st7{fill:#00b0f0;fill-opacity:1;stroke:#00b0f0;stroke-opacity:1;stroke-width:.28409090909091}.st8,.st9{marker-end:url(#mrkr4-113);stroke:#00b0f0;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}.st9{marker-end:url(#mrkr4-129);stroke:#eb94e0}.st11{fill:none;stroke:none;stroke-width:.25}.st12{fill:#4672c4;font-family:Calibri;font-size:1.5em}\n+  </style>\n+  <defs id=\"Markers\">\n+    <marker id=\"mrkr4-16\" refX=\"-7.04\" orient=\"auto\" markerUnits=\"strokeWidth\" overflow=\"visible\" style=\"fill:#000;fill-opacity:1;stroke:#000;stroke-opacity:1;stroke-width:.28409090909091\">\n+      <use xlink:href=\"#lend4\" transform=\"scale(-3.52)\" id=\"use14\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\"/>\n+    </marker>\n+    <marker id=\"mrkr4-107\" class=\"st7\" refX=\"-7.04\" orient=\"auto\" markerUnits=\"strokeWidth\" overflow=\"visible\">\n+      <use xlink:href=\"#lend4\" transform=\"scale(-3.52)\" id=\"use17\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\"/>\n+    </marker>\n+    <marker id=\"mrkr4-113\" class=\"st7\" refX=\"-6.68\" orient=\"auto\" markerUnits=\"strokeWidth\" overflow=\"visible\">\n+      <use xlink:href=\"#lend4\" transform=\"scale(-3.52)\" id=\"use20\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\"/>\n+    </marker>\n+    <marker id=\"mrkr4-129\" refX=\"-6.68\" orient=\"auto\" markerUnits=\"strokeWidth\" overflow=\"visible\" style=\"fill:#eb94e0;fill-opacity:1;stroke:#eb94e0;stroke-opacity:1;stroke-width:.28409090909091\">\n+      <use xlink:href=\"#lend4\" transform=\"scale(-3.52)\" id=\"use23\" 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=\"path11\"/>\n+    </g>\n+  </defs>\n+  <g id=\"g247\" transform=\"translate(-624.44 -59.113)\">\n+    <g id=\"shape1000-1\" transform=\"translate(1428.66 -396.85)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st1\" id=\"path31\"/>\n+    </g>\n+    <g id=\"shape1001-3\" transform=\"translate(1527.87 -325.984)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st1\" id=\"path36\"/>\n+    </g>\n+    <g id=\"shape1002-5\" transform=\"translate(1319.43 -325.984)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path41\"/>\n+    </g>\n+    <g id=\"shape1003-7\" transform=\"translate(1216.06 -255.118)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st1\" id=\"path46\"/>\n+    </g>\n+    <g id=\"shape1004-9\" transform=\"translate(1428.66 -255.118)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path51\"/>\n+    </g>\n+    <g id=\"shape1005-11\" transform=\"translate(1436.96 -405.15)\">\n+      <path d=\"m0 595.28-62.71 27.91\" class=\"st4\" id=\"path56\"/>\n+    </g>\n+    <g id=\"shape1006-17\" transform=\"translate(1477.05 -405.15)\">\n+      <path d=\"m0 595.28 52.87 27.52\" class=\"st4\" id=\"path61\"/>\n+    </g>\n+    <g id=\"shape1007-22\" transform=\"translate(1367.82 -334.284)\">\n+      <path d=\"m0 595.28 62.71 27.91\" class=\"st4\" id=\"path66\"/>\n+    </g>\n+    <g id=\"shape1008-27\" transform=\"translate(1327.73 -334.284)\">\n+      <path d=\"m0 595.28-56.94 27.69\" class=\"st4\" id=\"path71\"/>\n+    </g>\n+    <g id=\"shape1009-32\" transform=\"translate(1230.24 -479.055)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path76\"/>\n+    </g>\n+    <g id=\"shape1010-34\" transform=\"translate(1031.81 -396.85)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st1\" id=\"path81\"/>\n+    </g>\n+    <g id=\"shape1011-36\" transform=\"translate(1131.02 -325.984)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path86\"/>\n+    </g>\n+    <g id=\"shape1014-38\" transform=\"translate(1080.2 -405.15)\">\n+      <path d=\"m0 595.28 52.87 27.52\" class=\"st4\" id=\"path91\"/>\n+    </g>\n+    <g id=\"shape1015-43\" transform=\"translate(1238.54 -487.355)\">\n+      <path d=\"m0 595.28-151.53 40.3\" class=\"st4\" id=\"path96\"/>\n+    </g>\n+    <g id=\"shape1016-48\" transform=\"translate(1278.63 -487.355)\">\n+      <path d=\"m0 595.28 151.53 40.3\" class=\"st4\" id=\"path101\"/>\n+    </g>\n+    <g id=\"shape1017-53\" transform=\"translate(922.779 -325.984)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path106\"/>\n+    </g>\n+    <g id=\"shape1019-55\" transform=\"translate(813.543 -255.118)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st1\" id=\"path111\"/>\n+    </g>\n+    <g id=\"shape1020-57\" transform=\"translate(931.079 -334.284)\">\n+      <path d=\"m0 595.28-62.71 27.91\" class=\"st4\" id=\"path116\"/>\n+    </g>\n+    <g id=\"shape1022-62\" transform=\"translate(1022.65 -255.118)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st2\" id=\"path121\"/>\n+    </g>\n+    <g id=\"shape1023-64\" transform=\"translate(1121.86 -184.252)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path126\"/>\n+    </g>\n+    <g id=\"shape1026-66\" transform=\"translate(1071.04 -263.418)\">\n+      <path d=\"m0 595.28 52.87 27.52\" class=\"st4\" id=\"path131\"/>\n+    </g>\n+    <g id=\"shape1027-71\" transform=\"translate(1040.11 -405.15)\">\n+      <path d=\"m0 595.28-62.51 27.9\" class=\"st4\" id=\"path136\"/>\n+    </g>\n+    <g id=\"shape1028-76\" transform=\"translate(971.172 -334.284)\">\n+      <path d=\"m0 595.28 53.52 27.55\" class=\"st4\" id=\"path141\"/>\n+    </g>\n+    <g id=\"shape1029-81\" transform=\"translate(914.275 -184.252)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st1\" id=\"path146\"/>\n+    </g>\n+    <g id=\"shape1030-83\" transform=\"translate(1013.49 -113.386)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path151\"/>\n+    </g>\n+    <g id=\"shape1031-85\" transform=\"translate(805.039 -113.386)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path156\"/>\n+    </g>\n+    <g id=\"shape1032-87\" transform=\"translate(922.575 -192.552)\">\n+      <path d=\"m0 595.28-62.71 27.91\" class=\"st4\" id=\"path161\"/>\n+    </g>\n+    <g id=\"shape1033-92\" transform=\"translate(962.668 -192.552)\">\n+      <path d=\"m0 595.28 52.87 27.52\" class=\"st4\" id=\"path166\"/>\n+    </g>\n+    <g id=\"shape1034-97\" transform=\"translate(1030.95 -263.418)\">\n+      <path d=\"m0 595.28-61.86 27.88\" class=\"st4\" id=\"path171\"/>\n+    </g>\n+    <g id=\"shape1035-102\" transform=\"translate(861.732 -134.646)\">\n+      <path d=\"M0 588.19h144.72\" id=\"path176\" style=\"marker-end:url(#mrkr4-107);stroke:#00b0f0;stroke-linecap:round;stroke-linejoin:round;stroke-width:1\"/>\n+    </g>\n+    <g id=\"shape1036-108\" transform=\"translate(1061.88 -161.779)\">\n+      <path d=\"M0 595.28c17.07 0 45.07 0 57.76-6.9 7.54-4.1 9.68-10.64 10.28-16.84l.01-.36\" class=\"st8\" id=\"path181\"/>\n+    </g>\n+    <g id=\"shape1037-114\" transform=\"translate(1147.7 -240.945)\">\n+      <path d=\"M2.51 595.28c0-21.26 4.17-21.26 6.44-27.88 2.51-7.31 2.7-22.68 2.72-50.12v-.36\" class=\"st8\" id=\"path186\"/>\n+    </g>\n+    <g id=\"shape1038-119\" transform=\"translate(1187.72 -354.331)\">\n+      <path d=\"M0 595.28c104.41 0 106.27 68.37 233.91 70.8h.36\" class=\"st8\" id=\"path191\"/>\n+    </g>\n+    <g id=\"shape1039-124\" transform=\"translate(870.236 -283.465)\">\n+      <path d=\"M0 595.28c19.54 0 21.12 42.91 45.36 49.87l.36.05\" class=\"st9\" id=\"path196\"/>\n+    </g>\n+    <g id=\"shape1040-130\" transform=\"translate(942.622 -240.945)\">\n+      <path d=\"M0 595.28c0-63.78 30.02-63.78 44.53-77.43 13.58-12.76 13.58-37.48 31.95-48.45 12.86-7.69 34.73-8.64 39.92-23.08l.06-.36\" class=\"st9\" id=\"path201\"/>\n+    </g>\n+    <g id=\"shape1041-135\" transform=\"translate(1088.5 -425.197)\">\n+      <path d=\"M0 595.28c38.98 0 99.97 0 129.15 23.13 24.61 19.52 26.58 55.51 26.74 83.21v.36\" class=\"st9\" id=\"path206\"/>\n+    </g>\n+    <g id=\"shape1042-140\" transform=\"translate(1272.76 -283.465)\">\n+      <path d=\"M0 595.28c15.13 0 20.44 0 23.89-5.12 6.37-9.46 6.37-36.42 6.37-61.42 0-27.19 0-52.06 16.86-64.04 15.08-10.73 43.68-11.14 101.75-11.16h.36\" class=\"st9\" id=\"path211\"/>\n+    </g>\n+    <g id=\"shape1043-145\" transform=\"translate(1485.35 -425.197)\">\n+      <path d=\"M0 595.28c17.72 0 46.05 0 59.28 9.06 9.19 6.29 11.09 16.97 11.48 26.42l.01.36\" class=\"st9\" id=\"path216\"/>\n+    </g>\n+    <g id=\"shape1044-150\" transform=\"translate(624.567 -479.055)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st3\" id=\"path221\"/>\n+    </g>\n+    <g id=\"shape1045-152\" transform=\"translate(624.567 -379.843)\">\n+      <path d=\"M0 566.93a28.346 28.346 0 1 1 56.69 0 28.346 28.346 0 0 1-56.69 0z\" class=\"st1\" id=\"path226\"/>\n+    </g>\n+    <g id=\"shape1046-154\" transform=\"translate(695.501 -493.654)\">\n+      <path class=\"st11\" id=\"rect233\" d=\"M0 567.78h90.709v27.496H0z\"/>\n+      <text x=\"4.67\" y=\"586.93\" class=\"st12\" id=\"text235\">Next hop A</text>\n+    </g>\n+    <g id=\"shape1047-157\" transform=\"translate(697.019 -394.441)\">\n+      <path class=\"st11\" id=\"rect242\" d=\"M0 567.78h90.709v27.496H0z\"/>\n+      <text x=\"4.99\" y=\"586.93\" class=\"st12\" id=\"text244\">Next hop B</text>\n+    </g>\n+  </g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst\nindex 89af28dacb..0a53ec71c8 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+    rib_lib\n     flow_classify_lib\n     packet_distrib_lib\n     reorder_lib\ndiff --git a/doc/guides/prog_guide/rib_lib.rst b/doc/guides/prog_guide/rib_lib.rst\nnew file mode 100644\nindex 0000000000..e8bb35a2b6\n--- /dev/null\n+++ b/doc/guides/prog_guide/rib_lib.rst\n@@ -0,0 +1,172 @@\n+..  SPDX-License-Identifier: BSD-3-Clause\n+    Copyright(c) 2021 Intel Corporation.\n+\n+RIB Library\n+===========\n+\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+\n+\n+Implementation details\n+----------------------\n+\n+RIB implements a key-value store for routing information.\n+\n+Routing information is represented by a prefix (key) and a next hop ID (value).\n+The prefix type depends on the address family. IPv4 addresses are represented by\n+``uint32_t`` values. IPv6 addresses are represented as ``uint8_t[16]`` values.\n+Next hop IDs are represented by ``uint64_t`` values.\n+\n+.. note::\n+\n+   The API and implementation are very similar for IPv4's ``rib`` library and IPv6's ``rib6``\n+   library, therefore only the ``rib`` library will be discussed here.\n+   Everything within this document except for the size of the prefixes is applicable to  the\n+   ``rib6`` library.\n+\n+Internally RIB is represented as a binary tree as shown in :numref:`figure_rib_internals`:\n+\n+.. _figure_rib_internals:\n+\n+.. figure:: img/rib_internals.*\n+\n+   RIB internals overview\n+\n+The binary tree consists of two types of nodes:\n+\n+* Actual Routes.\n+\n+* Intermediate Nodes which are used internally to preserve the binary tree structure.\n+\n+\n+RIB API Overview\n+----------------\n+\n+RIB has two configuration parameters:\n+\n+* The maximum number of nodes.\n+\n+* The size of the extension block within each node. This space is used to store\n+  additional user defined data.\n+\n+The main methods within the ``rib`` library are:\n+\n+* ``rte_rib_insert()``: Add new routes.\n+\n+* ``rte_rib_remove()``: Delete an existing route.\n+\n+* ``rte_rib_lookup()``: Lookup an IP in the structure using longest match.\n+\n+* ``rte_rib_lookup_exact()``: Lookup an IP in the structure using exact match.\n+\n+* ``rte_rib_lookup_parent()``: Find a parent prefix within the structure.\n+\n+* ``rte_rib_get_nxt()``: Traverse a subtree within the structure.\n+\n+Given a RIB structure with the routes depicted in :numref:`figure_rib_internals`,\n+here are several usage examples:\n+\n+* The best route for ``10.0.0.1`` can be found by calling:\n+\n+.. code-block:: c\n+\n+      struct rte_rib_node *route = rte_rib_lookup(rib, RTE_IPV4(10,0,0,1));\n+\n+This returns an ``rte_rib_node`` pointing to the ``10.0.0.0/29`` prefix.\n+\n+* To find an exact match route:\n+\n+.. code-block:: c\n+\n+      struct rte_rib_node *route = rte_rib_lookup_exact(rib, RTE_IPV4(10,0,0,128), 25);\n+\n+This returns an ``rte_rib_node`` pointing to the ``10.0.0.128/25`` prefix.\n+\n+and\n+\n+.. code-block:: c\n+\n+      struct rte_rib_node *route = rte_rib_lookup_exact(rib, RTE_IPV4(10,0,0,0), 24);\n+\n+This returns ``NULL`` as no exact match can be found.\n+\n+* To retrieve a group of routes under the common prefix ``10.0.0.0/24``\n+  (yellow triangle in :numref:`figure_rib_internals`):\n+\n+.. code-block:: c\n+\n+      struct rte_rib_node *route = NULL;\n+      do {\n+         route = rte_rib_get_nxt(rib, RTE_IPV4(10,0,0,0), 24, route, RTE_RIB_GET_NXT_ALL);\n+      } while (route != NULL)\n+\n+This returns 3 ``rte_rib_node`` nodes pointing to ``10.0.0.0/29``, ``10.0.0.160/27``\n+and ``10.0.0.128/25``.\n+\n+Extensions usage example\n+------------------------\n+\n+Extensions can be used for a wide range of tasks.\n+By default, an ``rte_rib_node`` node contains only crucial information such as the prefix and\n+next hop ID, but it doesn't contain protocol specific information such as\n+metrics, administrative distance and other routing protocol information.\n+These examples are application specific data and the user can decide what to keep\n+and how it is stored within the extension memory region in each ``rte_rib_node``.\n+\n+It is possible to implement a prefix independent convergence using the RIB extension feature.\n+If the routing daemon can provide a feasible next hop ID along with a best (active) next hop ID,\n+it is possible to react to a neighbour failing relatively fast.\n+Consider a RIB with a number of routes with different next hops (A and B) as\n+shown in :numref:`figure_rib_pic`. Every route can have a feasible next hop\n+provided by the routing daemon.\n+\n+.. _figure_rib_pic:\n+\n+.. figure:: img/rib_pic.*\n+\n+   RIB prefix independent convergence\n+\n+In case of a next hop failure, we need to replace an active failed next hop with a\n+feasible next hop for every corresponding route without waiting for the routing daemon\n+recalculation process to complete.\n+To achieve this we can link all existing routes with the same active next hop in a linked list,\n+saving the feasible next hop ID and a pointer inside the extension space of each ``rte_rib_node``.\n+\n+.. code-block:: c\n+\n+      struct my_route_ext {\n+         struct rte_rib_node *next;\n+         uint64_t feasible_nh;\n+      };\n+\n+      struct rte_rib_conf conf;\n+      conf.ext_sz = sizeof(struct my_route_ext);\n+      rib = rte_rib_create(\"test\", 0, &conf);\n+      ...\n+      /* routing daemon task */\n+      struct rte_rib_node *route = rte_rib_insert(rib, RTE_IPV4(192,0,2,0), 24);\n+      rte_rib_set_nh(route, active_nh_from_rd);\n+      struct my_route_ext *ext = rte_rib_get_ext(route);\n+      ext->feasible_nh = feasible_nh_from_rd;\n+      list_insert(nh_table[active_nh_from_rd].list_head, route);\n+      ...\n+      /* dataplane monitoring thread */\n+      /* nexthop id fail_nh fails */\n+      route = NULL;\n+      do {\n+         route = get_next(nh_table[fail_nh].list_head, route);\n+         uint32_t ip;\n+         uint8_t depth;\n+         rte_rib_get_ip(route, &ip);\n+         rte_rib_get_depth(route, &depth);\n+         ext = rte_rib_get_ext(route);\n+         uint64_t new_nh = ext->feasible_nh;\n+         /* do update to the dataplane, for example to the fib */\n+         rte_fib_add(fib, ip, depth, new_nh);\n+         /* update nexthop if necessary */\n+         rte_rib_set_nh(route, new_nh);\n+      } while (route != NULL);\n+\n",
    "prefixes": [
        "1/2"
    ]
}