get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132119,
    "url": "https://patches.dpdk.org/api/patches/132119/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20230928102529.4118346-1-rkudurumalla@marvell.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20230928102529.4118346-1-rkudurumalla@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230928102529.4118346-1-rkudurumalla@marvell.com",
    "date": "2023-09-28T10:25:28",
    "name": "[v6,1/2] node: add IPv4 local node to handle local pkts",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "f0a5179013441610f441cb172e5471bff6dc60e3",
    "submitter": {
        "id": 2289,
        "url": "https://patches.dpdk.org/api/people/2289/?format=api",
        "name": "Rakesh Kudurumalla",
        "email": "rkudurumalla@marvell.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20230928102529.4118346-1-rkudurumalla@marvell.com/mbox/",
    "series": [
        {
            "id": 29676,
            "url": "https://patches.dpdk.org/api/series/29676/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=29676",
            "date": "2023-09-28T10:25:28",
            "name": "[v6,1/2] node: add IPv4 local node to handle local pkts",
            "version": 6,
            "mbox": "https://patches.dpdk.org/series/29676/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/132119/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/132119/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 EB2C942660;\n\tThu, 28 Sep 2023 12:25:39 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id BC7224029E;\n\tThu, 28 Sep 2023 12:25:39 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id 362454029D\n for <dev@dpdk.org>; Thu, 28 Sep 2023 12:25:38 +0200 (CEST)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 38SA9iKK012151; Thu, 28 Sep 2023 03:25:37 -0700",
            "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3tcrrs32x0-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Thu, 28 Sep 2023 03:25:37 -0700",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.48;\n Thu, 28 Sep 2023 03:25:35 -0700",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend\n Transport; Thu, 28 Sep 2023 03:25:35 -0700",
            "from localhost.localdomain (unknown [10.28.36.154])\n by maili.marvell.com (Postfix) with ESMTP id 5C4BE5C68EE;\n Thu, 28 Sep 2023 03:25:32 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding : content-type; s=pfpt0220;\n bh=m11cEqPUblwW6tGWVJ12DDh3DGotLhQSuBgLSZfwEMo=;\n b=evObrJDus9xkMUC+lm62Sm5MzHMugW+eZqsmdrjBNVTSKBG7lCBWESx+a1ox2Vk+e4Dx\n Q4xm9z1e56ark+X8zwOCycixGCOaAvEyNHFj8Wkkma2yFi6gX0wq4YjNnb45VvOlR/xd\n kHxwQw4n3BmUMItXtDd+p40Ptueq17lZvkJPp+8JiLeIBm2xAqqlemHZU+SAkz4Lqffe\n lGzOHNKhFTHvH8IdlyLJKvohms3Oo1konOWrTkFnD65uS9hWB5ldrI4F7tGhwROPalo8\n c9GxD7Bs0kVqVs6/rpDwwcNpu3bZi5gDh1PTTkPlnWI3gxsQhNOeOktMfXg6OaeE17Yv TQ==",
        "From": "Rakesh Kudurumalla <rkudurumalla@marvell.com>",
        "To": "Jerin Jacob <jerinj@marvell.com>, Kiran Kumar K <kirankumark@marvell.com>,\n Nithin Dabilpuram <ndabilpuram@marvell.com>, Zhirun Yan\n <zhirun.yan@intel.com>, Pavan Nikhilesh <pbhagavatula@marvell.com>",
        "CC": "<dev@dpdk.org>, Rakesh Kudurumalla <rkudurumalla@marvell.com>",
        "Subject": "[PATCH v6 1/2] node: add IPv4 local node to handle local pkts",
        "Date": "Thu, 28 Sep 2023 15:55:28 +0530",
        "Message-ID": "<20230928102529.4118346-1-rkudurumalla@marvell.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20230927124100.4108588-1-rkudurumalla@marvell.com>",
        "References": "<20230927124100.4108588-1-rkudurumalla@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-ORIG-GUID": "7d2kajWJgCxZNBRe4EEY7c08nyOTMRrh",
        "X-Proofpoint-GUID": "7d2kajWJgCxZNBRe4EEY7c08nyOTMRrh",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26\n definitions=2023-09-28_08,2023-09-28_01,2023-05-22_02",
        "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"
    },
    "content": "Local or Host destined pkts can be redirected IPv4 local node\nusing IP4 Lookup node entries with prefix of 32 and be redirected\nto this IP4 local node for further processing.\n\nSigned-off-by: Rakesh Kudurumalla <rkudurumalla@marvell.com>\n---\nDepends-on: series-29670 (\"remove MAX macro from all nodes\")\n\nv6: Resolve dependency\n\n doc/guides/prog_guide/graph_lib.rst           |  15 ++\n .../img/graph_inbuilt_node_flow.svg           | 138 ++++++++++--------\n lib/node/ip4_local.c                          |  88 +++++++++++\n lib/node/ip4_lookup.c                         |   1 +\n lib/node/meson.build                          |   1 +\n lib/node/rte_node_ip4_api.h                   |  12 ++\n 6 files changed, 196 insertions(+), 59 deletions(-)\n create mode 100644 lib/node/ip4_local.c",
    "diff": "diff --git a/doc/guides/prog_guide/graph_lib.rst b/doc/guides/prog_guide/graph_lib.rst\nindex e7b6e12004..f2e04a68b9 100644\n--- a/doc/guides/prog_guide/graph_lib.rst\n+++ b/doc/guides/prog_guide/graph_lib.rst\n@@ -498,3 +498,18 @@ Uses ``poll`` function to poll on the socket fd\n for ``POLLIN`` events to read the packets from raw socket\n to stream buffer and does ``rte_node_next_stream_move()``\n when there are received packets.\n+\n+ip4_local\n+~~~~~~~~~\n+This node is an intermediate node that does ``packet_type`` lookup for\n+the received ipv4 packets and the result determines each packets next node.\n+\n+On successful ``packet_type`` lookup, for any IPv4 protocol the result\n+contains the ``next_node`` id and ``next-hop`` id with which the packet\n+needs to be further processed.\n+\n+On packet_type lookup failure, objects are redirected to ``pkt_drop`` node.\n+``rte_node_ip4_route_add()`` is control path API to add ipv4 address with 32 bit\n+depth to receive to packets.\n+To achieve home run, node use ``rte_node_stream_move()`` as mentioned in above\n+sections.\ndiff --git a/doc/guides/prog_guide/img/graph_inbuilt_node_flow.svg b/doc/guides/prog_guide/img/graph_inbuilt_node_flow.svg\nindex 7eea94701f..b954f6fba1 100644\n--- a/doc/guides/prog_guide/img/graph_inbuilt_node_flow.svg\n+++ b/doc/guides/prog_guide/img/graph_inbuilt_node_flow.svg\n@@ -37,174 +37,194 @@ digraph dpdk_inbuilt_nodes_flow {\n     ethdev_tx -> pkt_drop [color=\"cyan\" style=\"dashed\"]\n     pkt_cls->pkt_drop   [color=\"cyan\" style=\"dashed\"]\n     kernel_tx -> kernel_rx [color=\"red\" style=\"dashed\"]\n+    ip4_lookup -> ip4_local\n+    ip4_local -> pkt_drop [color=\"cyan\" style=\"dashed\"]\n }\n \n  -->\n <!-- input nodes -->\n <!-- Title: dpdk_inbuilt_nodes_flow Pages: 1 -->\n-<svg width=\"470pt\" height=\"425pt\"\n- viewBox=\"0.00 0.00 470.23 424.50\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n-<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 420.5)\">\n+<svg width=\"525pt\" height=\"458pt\"\n+ viewBox=\"0.00 0.00 524.91 458.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n+<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 454)\">\n <title>dpdk_inbuilt_nodes_flow</title>\n-<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-420.5 466.23,-420.5 466.23,4 -4,4\"/>\n+<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-454 520.91,-454 520.91,4 -4,4\"/>\n <!-- ethdev_rx -->\n <g id=\"node1\" class=\"node\">\n <title>ethdev_rx</title>\n-<ellipse fill=\"none\" stroke=\"green\" cx=\"219.23\" cy=\"-398.5\" rx=\"47.77\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"219.23\" y=\"-393.45\" font-family=\"Times,serif\" font-size=\"14.00\">ethdev_rx</text>\n+<ellipse fill=\"none\" stroke=\"green\" cx=\"120\" cy=\"-432\" rx=\"56.59\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"120\" y=\"-428.3\" font-family=\"Times,serif\" font-size=\"14.00\">ethdev_rx</text>\n </g>\n <!-- pkt_cls -->\n <g id=\"node6\" class=\"node\">\n <title>pkt_cls</title>\n-<ellipse fill=\"none\" stroke=\"red\" cx=\"219.23\" cy=\"-325.5\" rx=\"37.53\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"219.23\" y=\"-320.45\" font-family=\"Times,serif\" font-size=\"14.00\">pkt_cls</text>\n+<ellipse fill=\"none\" stroke=\"red\" cx=\"120\" cy=\"-359\" rx=\"42.79\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"120\" y=\"-355.3\" font-family=\"Times,serif\" font-size=\"14.00\">pkt_cls</text>\n </g>\n <!-- ethdev_rx&#45;&gt;pkt_cls -->\n <g id=\"edge1\" class=\"edge\">\n <title>ethdev_rx&#45;&gt;pkt_cls</title>\n-<path fill=\"none\" stroke=\"black\" d=\"M219.23,-380.31C219.23,-372.55 219.23,-363.18 219.23,-354.45\"/>\n-<polygon fill=\"black\" stroke=\"black\" points=\"222.73,-354.53 219.23,-344.53 215.73,-354.53 222.73,-354.53\"/>\n+<path fill=\"none\" stroke=\"black\" d=\"M120,-413.81C120,-405.79 120,-396.05 120,-387.07\"/>\n+<polygon fill=\"black\" stroke=\"black\" points=\"123.5,-387.03 120,-377.03 116.5,-387.03 123.5,-387.03\"/>\n </g>\n <!-- kernel_rx -->\n <g id=\"node2\" class=\"node\">\n <title>kernel_rx</title>\n-<ellipse fill=\"none\" stroke=\"green\" cx=\"46.23\" cy=\"-164\" rx=\"46.23\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"46.23\" y=\"-158.95\" font-family=\"Times,serif\" font-size=\"14.00\">kernel_rx</text>\n+<ellipse fill=\"none\" stroke=\"green\" cx=\"82\" cy=\"-199\" rx=\"53.89\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"82\" y=\"-195.3\" font-family=\"Times,serif\" font-size=\"14.00\">kernel_rx</text>\n </g>\n <!-- kernel_rx&#45;&gt;pkt_cls -->\n <g id=\"edge2\" class=\"edge\">\n <title>kernel_rx&#45;&gt;pkt_cls</title>\n-<path fill=\"none\" stroke=\"black\" d=\"M41.45,-182.08C37.1,-201.37 33.27,-232.96 47.23,-255 73.68,-296.74 130.21,-313.41 171.26,-320.07\"/>\n-<polygon fill=\"black\" stroke=\"black\" points=\"170.73,-323.68 181.13,-321.66 171.74,-316.75 170.73,-323.68\"/>\n+<path fill=\"none\" stroke=\"black\" d=\"M70.87,-216.92C60.28,-235.27 47.29,-265.24 57,-290 64.12,-308.16 78.62,-324.37 91.92,-336.4\"/>\n+<polygon fill=\"black\" stroke=\"black\" points=\"89.69,-339.1 99.54,-342.99 94.26,-333.8 89.69,-339.1\"/>\n </g>\n <!-- ethdev_tx -->\n <g id=\"node3\" class=\"node\">\n <title>ethdev_tx</title>\n-<ellipse fill=\"none\" stroke=\"magenta\" cx=\"293.23\" cy=\"-91\" rx=\"47.26\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"293.23\" y=\"-85.95\" font-family=\"Times,serif\" font-size=\"14.00\">ethdev_tx</text>\n+<ellipse fill=\"none\" stroke=\"magenta\" cx=\"338\" cy=\"-91\" rx=\"55.79\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"338\" y=\"-87.3\" font-family=\"Times,serif\" font-size=\"14.00\">ethdev_tx</text>\n </g>\n <!-- pkt_drop -->\n <g id=\"node4\" class=\"node\">\n <title>pkt_drop</title>\n-<ellipse fill=\"none\" stroke=\"cyan\" cx=\"349.23\" cy=\"-18\" rx=\"44.19\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"349.23\" y=\"-12.95\" font-family=\"Times,serif\" font-size=\"14.00\">pkt_drop</text>\n+<ellipse fill=\"none\" stroke=\"cyan\" cx=\"254\" cy=\"-18\" rx=\"51.99\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"254\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">pkt_drop</text>\n </g>\n <!-- ethdev_tx&#45;&gt;pkt_drop -->\n <g id=\"edge14\" class=\"edge\">\n <title>ethdev_tx&#45;&gt;pkt_drop</title>\n-<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M306.22,-73.53C313.15,-64.75 321.81,-53.76 329.55,-43.96\"/>\n-<polygon fill=\"cyan\" stroke=\"cyan\" points=\"332.87,-46.4 336.32,-36.38 327.37,-42.06 332.87,-46.4\"/>\n+<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M318.94,-73.89C307.58,-64.29 293,-51.96 280.53,-41.42\"/>\n+<polygon fill=\"cyan\" stroke=\"cyan\" points=\"282.59,-38.58 272.7,-34.8 278.07,-43.93 282.59,-38.58\"/>\n </g>\n <!-- kernel_tx -->\n <g id=\"node5\" class=\"node\">\n <title>kernel_tx</title>\n-<ellipse fill=\"none\" stroke=\"blue\" cx=\"102.23\" cy=\"-237\" rx=\"45.72\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"102.23\" y=\"-231.95\" font-family=\"Times,serif\" font-size=\"14.00\">kernel_tx</text>\n+<ellipse fill=\"none\" stroke=\"blue\" cx=\"120\" cy=\"-272\" rx=\"53.89\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"120\" y=\"-268.3\" font-family=\"Times,serif\" font-size=\"14.00\">kernel_tx</text>\n </g>\n <!-- kernel_tx&#45;&gt;kernel_rx -->\n <g id=\"edge16\" class=\"edge\">\n <title>kernel_tx&#45;&gt;kernel_rx</title>\n-<path fill=\"none\" stroke=\"red\" stroke-dasharray=\"5,2\" d=\"M89.25,-219.53C82.32,-210.75 73.65,-199.76 65.92,-189.96\"/>\n-<polygon fill=\"red\" stroke=\"red\" points=\"68.09,-188.06 59.15,-182.38 62.6,-192.4 68.09,-188.06\"/>\n+<path fill=\"none\" stroke=\"red\" stroke-dasharray=\"5,2\" d=\"M110.99,-254.17C106.52,-245.81 101,-235.51 95.99,-226.14\"/>\n+<polygon fill=\"red\" stroke=\"red\" points=\"99.01,-224.36 91.2,-217.2 92.84,-227.67 99.01,-224.36\"/>\n </g>\n <!-- pkt_cls&#45;&gt;pkt_drop -->\n <g id=\"edge15\" class=\"edge\">\n <title>pkt_cls&#45;&gt;pkt_drop</title>\n-<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M255.09,-319.38C322.68,-308.72 462.23,-281.44 462.23,-238 462.23,-238 462.23,-238 462.23,-90 462.23,-57.84 429.01,-39.68 398.59,-29.8\"/>\n-<polygon fill=\"cyan\" stroke=\"cyan\" points=\"400.02,-26.27 389.44,-26.75 398.01,-32.98 400.02,-26.27\"/>\n+<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M84,-348.97C48.65,-337.7 0,-314.61 0,-273 0,-273 0,-273 0,-90 0,-49.99 118.4,-31.52 193.52,-23.82\"/>\n+<polygon fill=\"cyan\" stroke=\"cyan\" points=\"194.21,-27.27 203.82,-22.81 193.52,-20.31 194.21,-27.27\"/>\n </g>\n <!-- pkt_cls&#45;&gt;kernel_tx -->\n <g id=\"edge5\" class=\"edge\">\n <title>pkt_cls&#45;&gt;kernel_tx</title>\n-<path fill=\"none\" stroke=\"blue\" d=\"M186.99,-315.75C170.62,-310.16 151.14,-301.64 136.48,-289.5 128.23,-282.66 121.2,-273.31 115.7,-264.46\"/>\n-<polygon fill=\"blue\" stroke=\"blue\" points=\"118.38,-263.1 110.34,-256.2 112.32,-266.61 118.38,-263.1\"/>\n-<text text-anchor=\"middle\" x=\"176.61\" y=\"-276.2\" font-family=\"Times,serif\" font-size=\"14.00\">exception pkts</text>\n+<path fill=\"none\" stroke=\"blue\" d=\"M120,-340.8C120,-329.16 120,-313.55 120,-300.24\"/>\n+<polygon fill=\"blue\" stroke=\"blue\" points=\"123.5,-300.18 120,-290.18 116.5,-300.18 123.5,-300.18\"/>\n+<text text-anchor=\"middle\" x=\"172.5\" y=\"-311.8\" font-family=\"Times,serif\" font-size=\"14.00\">exception pkts</text>\n </g>\n <!-- ip4_lookup -->\n <g id=\"node7\" class=\"node\">\n <title>ip4_lookup</title>\n-<ellipse fill=\"none\" stroke=\"black\" cx=\"219.23\" cy=\"-237\" rx=\"52.89\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"219.23\" y=\"-231.95\" font-family=\"Times,serif\" font-size=\"14.00\">ip4_lookup</text>\n+<ellipse fill=\"none\" stroke=\"black\" cx=\"252\" cy=\"-272\" rx=\"60.39\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"252\" y=\"-268.3\" font-family=\"Times,serif\" font-size=\"14.00\">ip4_lookup</text>\n </g>\n <!-- pkt_cls&#45;&gt;ip4_lookup -->\n <g id=\"edge3\" class=\"edge\">\n <title>pkt_cls&#45;&gt;ip4_lookup</title>\n-<path fill=\"none\" stroke=\"black\" d=\"M219.23,-307.41C219.23,-295.64 219.23,-279.73 219.23,-266.11\"/>\n-<polygon fill=\"black\" stroke=\"black\" points=\"222.73,-266.35 219.23,-256.35 215.73,-266.35 222.73,-266.35\"/>\n-<text text-anchor=\"middle\" x=\"231.23\" y=\"-276.2\" font-family=\"Times,serif\" font-size=\"14.00\">ipv4</text>\n+<path fill=\"none\" stroke=\"black\" d=\"M160.54,-352.79C182.64,-348.15 209.23,-339.41 228,-323 235.09,-316.81 240.26,-308.05 243.95,-299.6\"/>\n+<polygon fill=\"black\" stroke=\"black\" points=\"247.32,-300.57 247.62,-289.98 240.78,-298.07 247.32,-300.57\"/>\n+<text text-anchor=\"middle\" x=\"254.5\" y=\"-311.8\" font-family=\"Times,serif\" font-size=\"14.00\">ipv4</text>\n </g>\n <!-- ip6_lookup -->\n <g id=\"node8\" class=\"node\">\n <title>ip6_lookup</title>\n-<ellipse fill=\"none\" stroke=\"black\" cx=\"343.23\" cy=\"-237\" rx=\"52.89\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"343.23\" y=\"-231.95\" font-family=\"Times,serif\" font-size=\"14.00\">ip6_lookup</text>\n+<ellipse fill=\"none\" stroke=\"black\" cx=\"439\" cy=\"-272\" rx=\"60.39\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"439\" y=\"-268.3\" font-family=\"Times,serif\" font-size=\"14.00\">ip6_lookup</text>\n </g>\n <!-- pkt_cls&#45;&gt;ip6_lookup -->\n <g id=\"edge4\" class=\"edge\">\n <title>pkt_cls&#45;&gt;ip6_lookup</title>\n-<path fill=\"none\" stroke=\"black\" d=\"M239.99,-310.02C259.62,-296.33 289.35,-275.59 311.88,-259.87\"/>\n-<polygon fill=\"black\" stroke=\"black\" points=\"313.53,-262.29 319.73,-253.7 309.53,-256.55 313.53,-262.29\"/>\n-<text text-anchor=\"middle\" x=\"304.23\" y=\"-276.2\" font-family=\"Times,serif\" font-size=\"14.00\">ipv6</text>\n+<path fill=\"none\" stroke=\"black\" d=\"M157.52,-350.25C188.82,-343.6 234.51,-333.46 274,-323 313.2,-312.62 357.13,-299.22 389.79,-288.91\"/>\n+<polygon fill=\"black\" stroke=\"black\" points=\"391.08,-292.17 399.55,-285.81 388.96,-285.5 391.08,-292.17\"/>\n+<text text-anchor=\"middle\" x=\"339.5\" y=\"-311.8\" font-family=\"Times,serif\" font-size=\"14.00\">ipv6</text>\n </g>\n <!-- ip4_lookup&#45;&gt;pkt_drop -->\n <g id=\"edge7\" class=\"edge\">\n <title>ip4_lookup&#45;&gt;pkt_drop</title>\n-<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M192.86,-221.12C179.2,-211.83 163.82,-198.49 156.23,-182 149.55,-167.46 150.78,-161.04 156.23,-146 176.39,-90.45 198.32,-78.19 252.23,-54 269.14,-46.41 288.24,-39.24 304.98,-33.38\"/>\n-<polygon fill=\"cyan\" stroke=\"cyan\" points=\"305.75,-36.48 314.07,-29.92 303.47,-29.86 305.75,-36.48\"/>\n+<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M239.17,-254.03C232.31,-243.87 224.56,-230.37 221,-217 204.89,-156.57 227.58,-83.56 242.59,-45.31\"/>\n+<polygon fill=\"cyan\" stroke=\"cyan\" points=\"245.89,-46.5 246.4,-35.92 239.4,-43.87 245.89,-46.5\"/>\n </g>\n <!-- ip4_rewrite -->\n <g id=\"node9\" class=\"node\">\n <title>ip4_rewrite</title>\n-<ellipse fill=\"none\" stroke=\"black\" cx=\"218.23\" cy=\"-164\" rx=\"53.4\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"218.23\" y=\"-158.95\" font-family=\"Times,serif\" font-size=\"14.00\">ip4_rewrite</text>\n+<ellipse fill=\"none\" stroke=\"black\" cx=\"294\" cy=\"-199\" rx=\"63.89\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"294\" y=\"-195.3\" font-family=\"Times,serif\" font-size=\"14.00\">ip4_rewrite</text>\n </g>\n <!-- ip4_lookup&#45;&gt;ip4_rewrite -->\n <g id=\"edge6\" class=\"edge\">\n <title>ip4_lookup&#45;&gt;ip4_rewrite</title>\n-<path fill=\"none\" stroke=\"black\" d=\"M218.99,-218.81C218.88,-211.05 218.75,-201.68 218.63,-192.95\"/>\n-<polygon fill=\"black\" stroke=\"black\" points=\"222.11,-192.98 218.47,-183.03 215.11,-193.08 222.11,-192.98\"/>\n+<path fill=\"none\" stroke=\"black\" d=\"M261.95,-254.17C266.95,-245.72 273.12,-235.29 278.71,-225.85\"/>\n+<polygon fill=\"black\" stroke=\"black\" points=\"281.75,-227.59 283.83,-217.2 275.72,-224.02 281.75,-227.59\"/>\n+</g>\n+<!-- ip4_local -->\n+<g id=\"node11\" class=\"node\">\n+<title>ip4_local</title>\n+<ellipse fill=\"none\" stroke=\"black\" cx=\"136\" cy=\"-145\" rx=\"51.19\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"136\" y=\"-141.3\" font-family=\"Times,serif\" font-size=\"14.00\">ip4_local</text>\n+</g>\n+<!-- ip4_lookup&#45;&gt;ip4_local -->\n+<g id=\"edge17\" class=\"edge\">\n+<title>ip4_lookup&#45;&gt;ip4_local</title>\n+<path fill=\"none\" stroke=\"black\" d=\"M218.11,-256.86C207.64,-251.39 196.61,-244.41 188,-236 169.45,-217.88 155.34,-191.74 146.53,-172.29\"/>\n+<polygon fill=\"black\" stroke=\"black\" points=\"149.72,-170.86 142.52,-163.08 143.3,-173.65 149.72,-170.86\"/>\n </g>\n <!-- ip6_lookup&#45;&gt;pkt_drop -->\n <g id=\"edge11\" class=\"edge\">\n <title>ip6_lookup&#45;&gt;pkt_drop</title>\n-<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M369.2,-221.03C382.65,-211.71 397.78,-198.37 405.23,-182 426.87,-134.45 392.95,-75.95 369.19,-43.54\"/>\n-<polygon fill=\"cyan\" stroke=\"cyan\" points=\"371.64,-41.98 362.81,-36.13 366.06,-46.21 371.64,-41.98\"/>\n+<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M470.57,-256.44C486.08,-247.46 503.27,-234.31 512,-217 519.2,-202.71 517.24,-196.12 512,-181 486.88,-108.48 466,-83.15 395,-54 367.69,-42.79 335.88,-34.51 309.39,-28.83\"/>\n+<polygon fill=\"cyan\" stroke=\"cyan\" points=\"310.02,-25.39 299.52,-26.78 308.6,-32.24 310.02,-25.39\"/>\n </g>\n <!-- ip6_rewrite -->\n <g id=\"node10\" class=\"node\">\n <title>ip6_rewrite</title>\n-<ellipse fill=\"none\" stroke=\"black\" cx=\"343.23\" cy=\"-164\" rx=\"53.4\" ry=\"18\"/>\n-<text text-anchor=\"middle\" x=\"343.23\" y=\"-158.95\" font-family=\"Times,serif\" font-size=\"14.00\">ip6_rewrite</text>\n+<ellipse fill=\"none\" stroke=\"black\" cx=\"439\" cy=\"-199\" rx=\"63.89\" ry=\"18\"/>\n+<text text-anchor=\"middle\" x=\"439\" y=\"-195.3\" font-family=\"Times,serif\" font-size=\"14.00\">ip6_rewrite</text>\n </g>\n <!-- ip6_lookup&#45;&gt;ip6_rewrite -->\n <g id=\"edge10\" class=\"edge\">\n <title>ip6_lookup&#45;&gt;ip6_rewrite</title>\n-<path fill=\"none\" stroke=\"black\" d=\"M343.23,-218.81C343.23,-211.05 343.23,-201.68 343.23,-192.95\"/>\n-<polygon fill=\"black\" stroke=\"black\" points=\"346.73,-193.03 343.23,-183.03 339.73,-193.03 346.73,-193.03\"/>\n+<path fill=\"none\" stroke=\"black\" d=\"M439,-253.81C439,-245.79 439,-236.05 439,-227.07\"/>\n+<polygon fill=\"black\" stroke=\"black\" points=\"442.5,-227.03 439,-217.03 435.5,-227.03 442.5,-227.03\"/>\n </g>\n <!-- ip4_rewrite&#45;&gt;ethdev_tx -->\n <g id=\"edge8\" class=\"edge\">\n <title>ip4_rewrite&#45;&gt;ethdev_tx</title>\n-<path fill=\"none\" stroke=\"green\" d=\"M235.63,-146.53C245.35,-137.33 257.64,-125.7 268.36,-115.54\"/>\n-<polygon fill=\"green\" stroke=\"green\" points=\"270.34,-118.55 275.19,-109.13 265.52,-113.47 270.34,-118.55\"/>\n+<path fill=\"none\" stroke=\"green\" d=\"M301.07,-180.97C308.09,-164.05 318.96,-137.86 327.09,-118.28\"/>\n+<polygon fill=\"green\" stroke=\"green\" points=\"330.35,-119.57 330.95,-108.99 323.88,-116.88 330.35,-119.57\"/>\n </g>\n <!-- ip4_rewrite&#45;&gt;pkt_drop -->\n <g id=\"edge9\" class=\"edge\">\n <title>ip4_rewrite&#45;&gt;pkt_drop</title>\n-<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M217.56,-145.54C217.71,-125.89 220.78,-93.99 237.23,-73 253.17,-52.67 278.68,-39.55 301.33,-31.33\"/>\n-<polygon fill=\"cyan\" stroke=\"cyan\" points=\"302.14,-34.42 310.5,-27.9 299.9,-27.79 302.14,-34.42\"/>\n+<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M289.85,-180.97C285.53,-163.07 278.61,-134.1 273,-109 268.3,-87.99 263.29,-64.16 259.59,-46.3\"/>\n+<polygon fill=\"cyan\" stroke=\"cyan\" points=\"262.97,-45.37 257.52,-36.28 256.11,-46.78 262.97,-45.37\"/>\n </g>\n <!-- ip6_rewrite&#45;&gt;ethdev_tx -->\n <g id=\"edge12\" class=\"edge\">\n <title>ip6_rewrite&#45;&gt;ethdev_tx</title>\n-<path fill=\"none\" stroke=\"green\" d=\"M331.38,-146.17C325.34,-137.6 317.87,-126.99 311.15,-117.44\"/>\n-<polygon fill=\"green\" stroke=\"green\" points=\"313.62,-115.87 305,-109.71 307.89,-119.9 313.62,-115.87\"/>\n+<path fill=\"none\" stroke=\"green\" d=\"M423.22,-181.44C406.47,-163.86 379.84,-135.91 360.81,-115.94\"/>\n+<polygon fill=\"green\" stroke=\"green\" points=\"363.1,-113.27 353.67,-108.45 358.03,-118.1 363.1,-113.27\"/>\n </g>\n <!-- ip6_rewrite&#45;&gt;pkt_drop -->\n <g id=\"edge13\" class=\"edge\">\n <title>ip6_rewrite&#45;&gt;pkt_drop</title>\n-<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M345.67,-145.53C347.02,-134.98 348.56,-121.24 349.23,-109 350.38,-88.27 350.34,-64.81 350.03,-47.04\"/>\n-<polygon fill=\"cyan\" stroke=\"cyan\" points=\"353.51,-47.19 349.8,-37.27 346.51,-47.34 353.51,-47.19\"/>\n+<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M438.77,-180.67C437.49,-154.09 431.22,-103.19 403,-73 379.35,-47.7 342.93,-34.22 312.02,-27.06\"/>\n+<polygon fill=\"cyan\" stroke=\"cyan\" points=\"312.71,-23.63 302.2,-24.95 311.24,-30.47 312.71,-23.63\"/>\n+</g>\n+<!-- ip4_local&#45;&gt;pkt_drop -->\n+<g id=\"edge18\" class=\"edge\">\n+<title>ip4_local&#45;&gt;pkt_drop</title>\n+<path fill=\"none\" stroke=\"cyan\" stroke-dasharray=\"5,2\" d=\"M142.47,-126.87C150.6,-107.23 166.18,-75.04 188,-54 195,-47.25 203.56,-41.45 212.16,-36.63\"/>\n+<polygon fill=\"cyan\" stroke=\"cyan\" points=\"213.85,-39.7 221.08,-31.95 210.6,-33.5 213.85,-39.7\"/>\n </g>\n </g>\n </svg>\ndiff --git a/lib/node/ip4_local.c b/lib/node/ip4_local.c\nnew file mode 100644\nindex 0000000000..fb31d0f970\n--- /dev/null\n+++ b/lib/node/ip4_local.c\n@@ -0,0 +1,88 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2023 Marvell International Ltd.\n+ */\n+\n+#include <arpa/inet.h>\n+#include <sys/socket.h>\n+\n+#include <rte_ethdev.h>\n+#include <rte_ether.h>\n+#include <rte_graph.h>\n+#include <rte_graph_worker.h>\n+#include <rte_ip.h>\n+#include <rte_lpm.h>\n+#include <rte_hash.h>\n+#include <rte_fbk_hash.h>\n+#include <rte_jhash.h>\n+#include <rte_hash_crc.h>\n+\n+\n+#include \"rte_node_ip4_api.h\"\n+\n+#include \"node_private.h\"\n+\n+static uint16_t\n+ip4_local_node_process_scalar(struct rte_graph *graph, struct rte_node *node,\n+\t\t\t      void **objs, uint16_t nb_objs)\n+{\n+\tvoid **to_next, **from;\n+\tuint16_t last_spec = 0;\n+\trte_edge_t next_index;\n+\tstruct rte_mbuf *mbuf;\n+\tuint16_t held = 0;\n+\tuint32_t l4;\n+\tint i;\n+\n+\t/* Speculative next */\n+\tnext_index = RTE_NODE_IP4_LOCAL_NEXT_UDP4_INPUT;\n+\n+\tfrom = objs;\n+\tto_next = rte_node_next_stream_get(graph, node, next_index, nb_objs);\n+\tfor (i = 0; i < nb_objs; i++) {\n+\t\tuint16_t next;\n+\n+\t\tmbuf = (struct rte_mbuf *)objs[i];\n+\t\tl4 = mbuf->packet_type & RTE_PTYPE_L4_MASK;\n+\n+\t\tnext = (l4 == RTE_PTYPE_L4_UDP)\n+\t\t\t\t? next_index\n+\t\t\t\t: RTE_NODE_IP4_LOCAL_NEXT_PKT_DROP;\n+\n+\t\tif (unlikely(next_index != next)) {\n+\t\t\t/* Copy things successfully speculated till now */\n+\t\t\trte_memcpy(to_next, from, last_spec * sizeof(from[0]));\n+\t\t\tfrom += last_spec;\n+\t\t\tto_next += last_spec;\n+\t\t\theld += last_spec;\n+\t\t\tlast_spec = 0;\n+\n+\t\t\trte_node_enqueue_x1(graph, node, next, from[0]);\n+\t\t\tfrom += 1;\n+\t\t} else {\n+\t\t\tlast_spec += 1;\n+\t\t}\n+\t}\n+\t/* !!! Home run !!! */\n+\tif (likely(last_spec == nb_objs)) {\n+\t\trte_node_next_stream_move(graph, node, next_index);\n+\t\treturn nb_objs;\n+\t}\n+\theld += last_spec;\n+\trte_memcpy(to_next, from, last_spec * sizeof(from[0]));\n+\trte_node_next_stream_put(graph, node, next_index, held);\n+\n+\treturn nb_objs;\n+}\n+\n+static struct rte_node_register ip4_local_node = {\n+\t.process = ip4_local_node_process_scalar,\n+\t.name = \"ip4_local\",\n+\n+\t.nb_edges = RTE_NODE_IP4_LOCAL_NEXT_PKT_DROP + 1,\n+\t.next_nodes = {\n+\t\t[RTE_NODE_IP4_LOCAL_NEXT_UDP4_INPUT] = \"udp4_input\",\n+\t\t[RTE_NODE_IP4_LOCAL_NEXT_PKT_DROP] = \"pkt_drop\",\n+\t},\n+};\n+\n+RTE_NODE_REGISTER(ip4_local_node);\ndiff --git a/lib/node/ip4_lookup.c b/lib/node/ip4_lookup.c\nindex 72fd760512..0dbfde64fe 100644\n--- a/lib/node/ip4_lookup.c\n+++ b/lib/node/ip4_lookup.c\n@@ -227,6 +227,7 @@ static struct rte_node_register ip4_lookup_node = {\n \n \t.nb_edges = RTE_NODE_IP4_LOOKUP_NEXT_PKT_DROP + 1,\n \t.next_nodes = {\n+\t\t[RTE_NODE_IP4_LOOKUP_NEXT_IP4_LOCAL] = \"ip4_local\",\n \t\t[RTE_NODE_IP4_LOOKUP_NEXT_REWRITE] = \"ip4_rewrite\",\n \t\t[RTE_NODE_IP4_LOOKUP_NEXT_PKT_DROP] = \"pkt_drop\",\n \t},\ndiff --git a/lib/node/meson.build b/lib/node/meson.build\nindex 2fa7c1c8f3..c0d5b09e2f 100644\n--- a/lib/node/meson.build\n+++ b/lib/node/meson.build\n@@ -12,6 +12,7 @@ sources = files(\n         'ethdev_rx.c',\n         'ethdev_tx.c',\n         'ip4_lookup.c',\n+        'ip4_local.c',\n         'ip4_rewrite.c',\n         'ip6_lookup.c',\n         'ip6_rewrite.c',\ndiff --git a/lib/node/rte_node_ip4_api.h b/lib/node/rte_node_ip4_api.h\nindex 0f997761b6..40af3860b5 100644\n--- a/lib/node/rte_node_ip4_api.h\n+++ b/lib/node/rte_node_ip4_api.h\n@@ -28,10 +28,22 @@ extern \"C\" {\n enum rte_node_ip4_lookup_next {\n \tRTE_NODE_IP4_LOOKUP_NEXT_REWRITE,\n \t/**< Rewrite node. */\n+\tRTE_NODE_IP4_LOOKUP_NEXT_IP4_LOCAL,\n+\t/** IP Local node. */\n \tRTE_NODE_IP4_LOOKUP_NEXT_PKT_DROP,\n \t/**< Number of next nodes of lookup node. */\n };\n \n+/**\n+ * IP4 Local next nodes.\n+ */\n+enum rte_node_ip4_local_next {\n+\tRTE_NODE_IP4_LOCAL_NEXT_UDP4_INPUT,\n+\t/**< ip4 Local node. */\n+\tRTE_NODE_IP4_LOCAL_NEXT_PKT_DROP,\n+\t/**< Packet drop node. */\n+};\n+\n /**\n  * Add ipv4 route to lookup table.\n  *\n",
    "prefixes": [
        "v6",
        "1/2"
    ]
}