Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/104017/?format=api
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" ] }{ "id": 104017, "url": "