get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1526189,
    "url": "http://patchwork.ozlabs.org/api/patches/1526189/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/ovn/patch/3ee28b22a6379522182d1b3e00edf5854b44e4a5.1631191707.git.lorenzo.bianconi@redhat.com/",
    "project": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/projects/68/?format=api",
        "name": "Open Virtual Network development",
        "link_name": "ovn",
        "list_id": "ovs-dev.openvswitch.org",
        "list_email": "ovs-dev@openvswitch.org",
        "web_url": "http://openvswitch.org/",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<3ee28b22a6379522182d1b3e00edf5854b44e4a5.1631191707.git.lorenzo.bianconi@redhat.com>",
    "list_archive_url": null,
    "date": "2021-09-09T12:50:24",
    "name": "[ovs-dev,v3] northd: reduce number of nd_na lb logical flows",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "98bed6f70372fc7fbe7f506c995178e8039894d8",
    "submitter": {
        "id": 73083,
        "url": "http://patchwork.ozlabs.org/api/people/73083/?format=api",
        "name": "Lorenzo Bianconi",
        "email": "lorenzo.bianconi@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/ovn/patch/3ee28b22a6379522182d1b3e00edf5854b44e4a5.1631191707.git.lorenzo.bianconi@redhat.com/mbox/",
    "series": [
        {
            "id": 261606,
            "url": "http://patchwork.ozlabs.org/api/series/261606/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/ovn/list/?series=261606",
            "date": "2021-09-09T12:50:24",
            "name": "[ovs-dev,v3] northd: reduce number of nd_na lb logical flows",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/261606/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/1526189/comments/",
    "check": "fail",
    "checks": "http://patchwork.ozlabs.org/api/patches/1526189/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<ovs-dev-bounces@openvswitch.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "ovs-dev@openvswitch.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "ovs-dev@lists.linuxfoundation.org"
        ],
        "Authentication-Results": [
            "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=akkwNNM6;\n\tdkim-atps=neutral",
            "ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::136; helo=smtp3.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN>)",
            "smtp4.osuosl.org (amavisd-new);\n dkim=pass (1024-bit key) header.d=redhat.com",
            "relay.mimecast.com;\n auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lorenzo.bianconi@redhat.com"
        ],
        "Received": [
            "from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 4H4zPx2z0qz9t9y\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  9 Sep 2021 22:50:44 +1000 (AEST)",
            "from localhost (localhost [127.0.0.1])\n\tby smtp3.osuosl.org (Postfix) with ESMTP id 2EF5960B16;\n\tThu,  9 Sep 2021 12:50:42 +0000 (UTC)",
            "from smtp3.osuosl.org ([127.0.0.1])\n\tby localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id LTStqm6XxA0i; Thu,  9 Sep 2021 12:50:40 +0000 (UTC)",
            "from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp3.osuosl.org (Postfix) with ESMTPS id 0E93560ADF;\n\tThu,  9 Sep 2021 12:50:40 +0000 (UTC)",
            "from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id D04D1C0011;\n\tThu,  9 Sep 2021 12:50:39 +0000 (UTC)",
            "from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n by lists.linuxfoundation.org (Postfix) with ESMTP id BD754C000D\n for <ovs-dev@openvswitch.org>; Thu,  9 Sep 2021 12:50:37 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id ACD9040348\n for <ovs-dev@openvswitch.org>; Thu,  9 Sep 2021 12:50:37 +0000 (UTC)",
            "from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n with ESMTP id h-imGpD7RB2M for <ovs-dev@openvswitch.org>;\n Thu,  9 Sep 2021 12:50:35 +0000 (UTC)",
            "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [216.205.24.124])\n by smtp4.osuosl.org (Postfix) with ESMTPS id 8B53140342\n for <ovs-dev@openvswitch.org>; Thu,  9 Sep 2021 12:50:35 +0000 (UTC)",
            "from mail-ed1-f72.google.com (mail-ed1-f72.google.com\n [209.85.208.72]) (Using TLS) by relay.mimecast.com with ESMTP id\n us-mta-175-HX1W2dk2Nzuk-xi0N_v4dQ-1; Thu, 09 Sep 2021 08:50:33 -0400",
            "by mail-ed1-f72.google.com with SMTP id\n g17-20020a056402425100b003cd5ba2852fso926400edb.1\n for <ovs-dev@openvswitch.org>; Thu, 09 Sep 2021 05:50:33 -0700 (PDT)",
            "from lore-desk.redhat.com (net-37-179-26-33.cust.vodafonedsl.it.\n [37.179.26.33])\n by smtp.gmail.com with ESMTPSA id t16sm890897ejj.54.2021.09.09.05.50.30\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 09 Sep 2021 05:50:30 -0700 (PDT)"
        ],
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.8.0",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1631191834;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding;\n bh=Ohz/jV7GY4NaKY6CwxeZBBNfRmaW11TQgrQt7rZt7/Q=;\n b=akkwNNM6+o3+Fds2K8tvfZAfaZqe4RpehqITjfI+Uj/tQO8BQvw5/gc3YKzSCNSSoK3Vxj\n npLtG9K1YOoYxfpE5qYrsGYGNMnuGl48lKSYOFPPMPoozUMTPGC7GLeTw/1zE9qkpZ5H6J\n aWhmzUgeFsAIAweeIo5az5Uxhs43R1k=",
        "X-MC-Unique": "HX1W2dk2Nzuk-xi0N_v4dQ-1",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20210112;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version\n :content-transfer-encoding;\n bh=Ohz/jV7GY4NaKY6CwxeZBBNfRmaW11TQgrQt7rZt7/Q=;\n b=f9zPKmH/D4+ivJS8fZB8mK6cuM3Yhe+x7ygGJp8VwEa7nYP1CrOtvJM5V1+7uh6+Ks\n uc70AGF58SMfGKnAKTjORl5a5dWyx0mx3r4E/1nd+y5OVOYN3lfgc7lUZ+VvQdgO14oh\n ajRnbAuoH5L4ko8TJMZVCx4T70+Nkd3KAM7Sq8Kr/qIF1bg5JLdjj8NAdckcA3AZj8uU\n A3h0BNVsWSvI+OgD8lZ38Nxcw0X2BfWwb/7LyU3SpQ5uNId2hTMLNKuILbCfANSZzHcD\n QsIBZRFLwf8aXBRLBVBo2ic9wF1qW18oldToX7c+HEVen1nKOjAMr/FBTltV1ch1A3Nt\n 1w6Q==",
        "X-Gm-Message-State": "AOAM531XYaBKhvhY8YR8DMjVVWy7cs7FHehqxGoNmFLZf/gAs24N56zf\n fteregC6b9MTZpHlLrmOUtS4cy3KuQiuh50fPMCCN1zN/zGJ4J0N8C4wikjyxZm2OcHkEx3IPvU\n 1XevbBslfefplbwDyWytnG0sRH7osZCx/egtC5NnTNXxi8RYxU9i53sQnw/IQ9yMqaGEitPaZWp\n a7GCky",
        "X-Received": [
            "by 2002:aa7:c993:: with SMTP id c19mr3039825edt.239.1631191831667;\n Thu, 09 Sep 2021 05:50:31 -0700 (PDT)",
            "by 2002:aa7:c993:: with SMTP id c19mr3039779edt.239.1631191831149;\n Thu, 09 Sep 2021 05:50:31 -0700 (PDT)"
        ],
        "X-Google-Smtp-Source": "\n ABdhPJwBGeCmnG5UDQJ8RWkbhDPU1ZvkUxzvCmEuzOMIbYyqGw1rg7/hI7NnEETKV6FbEDAcr1g+qQ==",
        "From": "Lorenzo Bianconi <lorenzo.bianconi@redhat.com>",
        "To": "ovs-dev@openvswitch.org",
        "Date": "Thu,  9 Sep 2021 14:50:24 +0200",
        "Message-Id": "\n <3ee28b22a6379522182d1b3e00edf5854b44e4a5.1631191707.git.lorenzo.bianconi@redhat.com>",
        "X-Mailer": "git-send-email 2.31.1",
        "MIME-Version": "1.0",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-Originator": "redhat.com",
        "Subject": "[ovs-dev] [PATCH v3 ovn] northd: reduce number of nd_na lb logical\n\tflows",
        "X-BeenThere": "ovs-dev@openvswitch.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "<ovs-dev.openvswitch.org>",
        "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>",
        "List-Archive": "<http://mail.openvswitch.org/pipermail/ovs-dev/>",
        "List-Post": "<mailto:ovs-dev@openvswitch.org>",
        "List-Help": "<mailto:ovs-dev-request@openvswitch.org?subject=help>",
        "List-Subscribe": "<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "ovs-dev-bounces@openvswitch.org",
        "Sender": "\"dev\" <ovs-dev-bounces@openvswitch.org>"
    },
    "content": "As it has been already done for IPv4, collapse IPv6 Neighbour\nAdvertisment flows for load balancer using address list and\nreduce the number of logical flows from N*M to N where N is\nthe number of logical router port and M is the number of\nVirtual IPs.\n\nhttps://bugzilla.redhat.com/show_bug.cgi?id=1970258\nSigned-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>\n---\nChanges since v2:\n- remove open code and run build_lrouter_nd_flow() instead\n\nChanges since v1:\n- rebase on top of ovn master\n- add DDlog support\n---\n northd/ovn-northd.c  | 25 ++++++++++-------\n northd/ovn_northd.dl | 66 ++++++++++++++++++++++++++++++++------------\n tests/ovn-northd.at  | 36 ++++++++----------------\n 3 files changed, 75 insertions(+), 52 deletions(-)",
    "diff": "diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c\nindex ee761cef0..fc623bcbe 100644\n--- a/northd/ovn-northd.c\n+++ b/northd/ovn-northd.c\n@@ -9851,8 +9851,7 @@ build_lrouter_nd_flow(struct ovn_datapath *od, struct ovn_port *op,\n         ds_put_format(&actions,\n                       \"%s { \"\n                         \"eth.src = %s; \"\n-                        \"ip6.src = %s; \"\n-                        \"nd.target = %s; \"\n+                        \"ip6.src = nd.target; \"\n                         \"nd.tll = %s; \"\n                         \"outport = inport; \"\n                         \"flags.loopback = 1; \"\n@@ -9860,8 +9859,6 @@ build_lrouter_nd_flow(struct ovn_datapath *od, struct ovn_port *op,\n                       \"};\",\n                       action,\n                       eth_addr,\n-                      ip_address,\n-                      ip_address,\n                       eth_addr);\n         ovn_lflow_add_with_hint__(lflows, od, S_ROUTER_IN_IP_INPUT, priority,\n                                   ds_cstr(&match), ds_cstr(&actions), NULL,\n@@ -11899,7 +11896,6 @@ build_lrouter_ipv4_ip_input(struct ovn_port *op,\n                                    &op->nbrp->header_, lflows);\n         }\n \n-        const char *ip_address;\n         if (sset_count(&op->od->lb_ips_v4)) {\n             ds_clear(match);\n             if (is_l3dgw_port(op)) {\n@@ -11920,17 +11916,26 @@ build_lrouter_ipv4_ip_input(struct ovn_port *op,\n             ds_destroy(&load_balancer_ips_v4);\n         }\n \n-        SSET_FOR_EACH (ip_address, &op->od->lb_ips_v6) {\n+        if (sset_count(&op->od->lb_ips_v6)) {\n             ds_clear(match);\n+            ds_clear(actions);\n+\n+            struct ds load_balancer_ips_v6 = DS_EMPTY_INITIALIZER;\n+\n+            ds_put_cstr(&load_balancer_ips_v6, \"{ \");\n+            ds_put_and_free_cstr(&load_balancer_ips_v6,\n+                                 sset_join(&op->od->lb_ips_v6, \", \", \" }\"));\n+\n             if (is_l3dgw_port(op)) {\n                 ds_put_format(match, \"is_chassis_resident(%s)\",\n                               op->cr_port->json_key);\n             }\n-\n             build_lrouter_nd_flow(op->od, op, \"nd_na\",\n-                                  ip_address, NULL, REG_INPORT_ETH_ADDR,\n-                                  match, false, 90, NULL,\n-                                  lflows, meter_groups);\n+                                  ds_cstr(&load_balancer_ips_v6), NULL,\n+                                  REG_INPORT_ETH_ADDR, match, false, 90,\n+                                  NULL, lflows, meter_groups);\n+\n+            ds_destroy(&load_balancer_ips_v6);\n         }\n \n         if (!op->od->is_gw_router && !op->od->n_l3dgw_ports) {\ndiff --git a/northd/ovn_northd.dl b/northd/ovn_northd.dl\nindex ff92c989c..d91f8111f 100644\n--- a/northd/ovn_northd.dl\n+++ b/northd/ovn_northd.dl\n@@ -5537,6 +5537,44 @@ LogicalRouterNdFlow(router, lrp, \"nd_na\", ipv6, true, mac, extra_match, drop, pr\n     LogicalRouterArpNdFlow(router, nat@NAT{.external_ip = IPv6{ipv6}}, lrp,\n                            mac, extra_match, drop, priority).\n \n+relation LogicalRouterNdFlowLB(\n+    lr: Intern<Router>,\n+    lrp: Option<Intern<nb::Logical_Router_Port>>,\n+    ip: string,\n+    mac: string,\n+    extra_match: Option<string>,\n+    stage_hint: bit<32>)\n+Flow(.logical_datapath = lr._uuid,\n+     .stage = s_ROUTER_IN_IP_INPUT(),\n+     .priority = 90,\n+     .__match = __match.intern(),\n+     .actions = actions,\n+     .stage_hint = stage_hint,\n+     .io_port = None,\n+     .controller_meter = lr.copp.get(cOPP_ND_NA())) :-\n+    LogicalRouterNdFlowLB(.lr = lr, .lrp = lrp, .ip = ip,\n+                          .mac = mac, .extra_match = extra_match,\n+                          .stage_hint = stage_hint),\n+    var __match = {\n+        var clauses = vec_with_capacity(4);\n+        match (lrp) {\n+            Some{p} -> clauses.push(\"inport == ${json_string_escape(p.name)}\"),\n+            None -> ()\n+        };\n+        clauses.push(\"nd_ns && nd.target == ${ip}\");\n+        clauses.append(extra_match.to_vec());\n+        clauses.join(\" && \")\n+    },\n+    var actions =\n+        i\"nd_na { \"\n+           \"eth.src = ${mac}; \"\n+           \"ip6.src = nd.target; \"\n+           \"nd.tll = ${mac}; \"\n+           \"outport = inport; \"\n+           \"flags.loopback = 1; \"\n+           \"output; \"\n+         \"};\".\n+\n relation LogicalRouterArpFlow(\n     lr: Intern<Router>,\n     lrp: Option<Intern<nb::Logical_Router_Port>>,\n@@ -5622,8 +5660,7 @@ Flow(.logical_datapath = lr._uuid,\n     } else {\n         (i\"${action} { \"\n            \"eth.src = ${mac}; \"\n-           \"ip6.src = ${ip}; \"\n-           \"nd.target = ${ip}; \"\n+           \"ip6.src = nd.target; \"\n            \"nd.tll = ${mac}; \"\n            \"outport = inport; \"\n            \"flags.loopback = 1; \"\n@@ -5693,7 +5730,7 @@ var residence_check = match (is_redirect) {\n     true -> Some{\"is_chassis_resident(${json_string_escape(chassis_redirect_name(lrp.name))})\"},\n     false -> None\n } in {\n-    (var all_ips_v4, _) = get_router_load_balancer_ips(router, false) in {\n+    (var all_ips_v4, var all_ips_v6) = get_router_load_balancer_ips(router, false) in {\n         if (not all_ips_v4.is_empty()) {\n             LogicalRouterArpFlow(.lr = router,\n                                  .lrp = Some{lrp},\n@@ -5703,21 +5740,14 @@ var residence_check = match (is_redirect) {\n                                  .drop = false,\n                                  .priority = 90,\n                                  .stage_hint = 0)\n-        }\n-    };\n-    for (RouterLBVIP(.router = &Router{._uuid= lr_uuid}, .vip = vip)) {\n-        Some{(var ip_address, _)} = ip_address_and_port_from_lb_key(vip) in {\n-            IPv6{var ipv6} = ip_address in\n-            LogicalRouterNdFlow(.lr = router,\n-                                .lrp = Some{lrp},\n-                                .action = \"nd_na\",\n-                                .ip = ipv6,\n-                                .sn_ip = false,\n-                                .mac = rEG_INPORT_ETH_ADDR(),\n-                                .extra_match = residence_check,\n-                                .drop = false,\n-                                .priority = 90,\n-                                .stage_hint = 0)\n+        };\n+        if (not all_ips_v6.is_empty()) {\n+            LogicalRouterNdFlowLB(.lr = router,\n+                                  .lrp = Some{lrp},\n+                                  .ip = \"{ \" ++ all_ips_v6.join(\", \") ++ \" }\",\n+                                  .mac = rEG_INPORT_ETH_ADDR(),\n+                                  .extra_match = residence_check,\n+                                  .stage_hint = 0)\n         }\n     }\n }\ndiff --git a/tests/ovn-northd.at b/tests/ovn-northd.at\nindex 11886b94e..8200eb655 100644\n--- a/tests/ovn-northd.at\n+++ b/tests/ovn-northd.at\n@@ -1707,13 +1707,10 @@ match=(inport == \"lrp\" && arp.op == 1 && arp.tpa == { 192.168.2.1, 192.168.2.4,\n action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; output;)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n match=(inport == \"lrp\" && ip6.dst == {fe80::200:ff:fe00:1, ff02::1:ff00:1} && nd_ns && nd.target == fe80::200:ff:fe00:1), dnl\n-action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:1; nd.target = fe80::200:ff:fe00:1; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n+action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n-match=(inport == \"lrp\" && nd_ns && nd.target == fe80::200:ff:fe00:101:8080), dnl\n-action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:101:8080; nd.target = fe80::200:ff:fe00:101:8080; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n-  table=3 (lr_in_ip_input     ), priority=90   , dnl\n-match=(inport == \"lrp\" && nd_ns && nd.target == fe80::200:ff:fe00:102:8080), dnl\n-action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:102:8080; nd.target = fe80::200:ff:fe00:102:8080; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n+match=(inport == \"lrp\" && nd_ns && nd.target == { fe80::200:ff:fe00:101:8080, fe80::200:ff:fe00:102:8080 }), dnl\n+action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n match=(inport == \"lrp-public\" && arp.op == 1 && arp.tpa == 43.43.43.1 && arp.spa == 43.43.43.0/24), dnl\n action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; output;)\n@@ -1722,13 +1719,10 @@ match=(inport == \"lrp-public\" && arp.op == 1 && arp.tpa == { 192.168.2.1, 192.16\n action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; output;)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n match=(inport == \"lrp-public\" && ip6.dst == {fe80::200:ff:fe00:100, ff02::1:ff00:100} && nd_ns && nd.target == fe80::200:ff:fe00:100), dnl\n-action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:100; nd.target = fe80::200:ff:fe00:100; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n-  table=3 (lr_in_ip_input     ), priority=90   , dnl\n-match=(inport == \"lrp-public\" && nd_ns && nd.target == fe80::200:ff:fe00:101:8080), dnl\n-action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:101:8080; nd.target = fe80::200:ff:fe00:101:8080; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n+action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n-match=(inport == \"lrp-public\" && nd_ns && nd.target == fe80::200:ff:fe00:102:8080), dnl\n-action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:102:8080; nd.target = fe80::200:ff:fe00:102:8080; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n+match=(inport == \"lrp-public\" && nd_ns && nd.target == { fe80::200:ff:fe00:101:8080, fe80::200:ff:fe00:102:8080 }), dnl\n+action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n ])\n \n # xreg0[0..47] isn't used anywhere else.\n@@ -1782,13 +1776,10 @@ match=(inport == \"lrp\" && arp.op == 1 && arp.tpa == { 192.168.2.1, 192.168.2.4,\n action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; output;)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n match=(inport == \"lrp\" && ip6.dst == {fe80::200:ff:fe00:1, ff02::1:ff00:1} && nd_ns && nd.target == fe80::200:ff:fe00:1), dnl\n-action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:1; nd.target = fe80::200:ff:fe00:1; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n+action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n-match=(inport == \"lrp\" && nd_ns && nd.target == fe80::200:ff:fe00:101:8080), dnl\n-action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:101:8080; nd.target = fe80::200:ff:fe00:101:8080; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n-  table=3 (lr_in_ip_input     ), priority=90   , dnl\n-match=(inport == \"lrp\" && nd_ns && nd.target == fe80::200:ff:fe00:102:8080), dnl\n-action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:102:8080; nd.target = fe80::200:ff:fe00:102:8080; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n+match=(inport == \"lrp\" && nd_ns && nd.target == { fe80::200:ff:fe00:101:8080, fe80::200:ff:fe00:102:8080 }), dnl\n+action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n match=(inport == \"lrp-public\" && arp.op == 1 && arp.tpa == 43.43.43.1 && arp.spa == 43.43.43.0/24), dnl\n action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; output;)\n@@ -1797,13 +1788,10 @@ match=(inport == \"lrp-public\" && arp.op == 1 && arp.tpa == { 192.168.2.1, 192.16\n action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; output;)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n match=(inport == \"lrp-public\" && ip6.dst == {fe80::200:ff:fe00:100, ff02::1:ff00:100} && nd_ns && nd.target == fe80::200:ff:fe00:100 && is_chassis_resident(\"cr-lrp-public\")), dnl\n-action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:100; nd.target = fe80::200:ff:fe00:100; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n-  table=3 (lr_in_ip_input     ), priority=90   , dnl\n-match=(inport == \"lrp-public\" && nd_ns && nd.target == fe80::200:ff:fe00:101:8080 && is_chassis_resident(\"cr-lrp-public\")), dnl\n-action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:101:8080; nd.target = fe80::200:ff:fe00:101:8080; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n+action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n   table=3 (lr_in_ip_input     ), priority=90   , dnl\n-match=(inport == \"lrp-public\" && nd_ns && nd.target == fe80::200:ff:fe00:102:8080 && is_chassis_resident(\"cr-lrp-public\")), dnl\n-action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = fe80::200:ff:fe00:102:8080; nd.target = fe80::200:ff:fe00:102:8080; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n+match=(inport == \"lrp-public\" && nd_ns && nd.target == { fe80::200:ff:fe00:101:8080, fe80::200:ff:fe00:102:8080 } && is_chassis_resident(\"cr-lrp-public\")), dnl\n+action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)\n ])\n \n # Priority 91 drop flows (per distributed gw port), if port is not resident.\n",
    "prefixes": [
        "ovs-dev",
        "v3"
    ]
}