get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 787927,
    "url": "http://patchwork.ozlabs.org/api/patches/787927/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/openvswitch/patch/1499965361-32021-7-git-send-email-majopela@redhat.com/",
    "project": {
        "id": 47,
        "url": "http://patchwork.ozlabs.org/api/projects/47/?format=api",
        "name": "Open vSwitch",
        "link_name": "openvswitch",
        "list_id": "ovs-dev.openvswitch.org",
        "list_email": "ovs-dev@openvswitch.org",
        "web_url": "http://openvswitch.org/",
        "scm_url": "git@github.com:openvswitch/ovs.git",
        "webscm_url": "https://github.com/openvswitch/ovs",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1499965361-32021-7-git-send-email-majopela@redhat.com>",
    "list_archive_url": null,
    "date": "2017-07-13T17:02:40",
    "name": "[ovs-dev,v5,7/8] ovn: l3ha, gratuitous ARP for HA router",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "af2e7741686bbf8790ac78dc7ba3f859cfedc3e9",
    "submitter": {
        "id": 67170,
        "url": "http://patchwork.ozlabs.org/api/people/67170/?format=api",
        "name": "Miguel Angel Ajo",
        "email": "majopela@redhat.com"
    },
    "delegate": {
        "id": 55721,
        "url": "http://patchwork.ozlabs.org/api/users/55721/?format=api",
        "username": "russellb",
        "first_name": "Russell",
        "last_name": "Bryant",
        "email": "rbryant@redhat.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/openvswitch/patch/1499965361-32021-7-git-send-email-majopela@redhat.com/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/787927/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/787927/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<ovs-dev-bounces@openvswitch.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "dev@openvswitch.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "ovs-dev@mail.linuxfoundation.org"
        ],
        "Received": [
            "from mail.linuxfoundation.org (mail.linuxfoundation.org\n\t[140.211.169.12])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3x7j196cPzz9t2h\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 14 Jul 2017 03:07:25 +1000 (AEST)",
            "from mail.linux-foundation.org (localhost [127.0.0.1])\n\tby mail.linuxfoundation.org (Postfix) with ESMTP id 07CF4BAF;\n\tThu, 13 Jul 2017 17:03:03 +0000 (UTC)",
            "from smtp1.linuxfoundation.org (smtp1.linux-foundation.org\n\t[172.17.192.35])\n\tby mail.linuxfoundation.org (Postfix) with ESMTPS id 3D8F3BAD\n\tfor <dev@openvswitch.org>; Thu, 13 Jul 2017 17:03:02 +0000 (UTC)",
            "from mail-wm0-f43.google.com (mail-wm0-f43.google.com\n\t[74.125.82.43])\n\tby smtp1.linuxfoundation.org (Postfix) with ESMTPS id 00C34CD\n\tfor <dev@openvswitch.org>; Thu, 13 Jul 2017 17:03:00 +0000 (UTC)",
            "by mail-wm0-f43.google.com with SMTP id 70so5028521wmo.1\n\tfor <dev@openvswitch.org>; Thu, 13 Jul 2017 10:03:00 -0700 (PDT)",
            "from ctl.localdomain (111.148.134.37.dynamic.jazztel.es.\n\t[37.134.148.111]) by smtp.gmail.com with ESMTPSA id\n\t46sm7134176wrz.8.2017.07.13.10.02.56\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tThu, 13 Jul 2017 10:02:56 -0700 (PDT)"
        ],
        "X-Greylist": "whitelisted by SQLgrey-1.7.6",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=7chbBsBmexKincHzqmtIBoHwKuCa/t+LE83/euqEauw=;\n\tb=MkUDV/J3k4bdzkDmP2WAJBhl210Pz95z7GLJKNt8OIst7zFYClYrn9A2eVFM98wZ3M\n\tE1pwEKPEYwoSgjaoBGsvJiwmdoR5QWN8EGQU8vd7hHHudLHGCS6nJvtA0oWkLEsx2Ph6\n\tpOW9DZ0o7QIqNjIc4+OHZSUCQmFT422RHPOHZ6fh7tChqUb2SCgCU8XzuitBmjGyHabr\n\tSFReCaaBN/7iaL+ANjv7GStqMt9L/9F8UuHz0YmfU4MkizwMfOibmgab1Ky/Y4qN2Nat\n\tKedXvn/k4uLJmOwpr7n6MlzV1v+yQCrj+zG5+mE91Piny3C8lr1kDruJC5ExFOEY+n28\n\tFceg==",
        "X-Gm-Message-State": "AIVw111F6iRJjZyLgq/7BOaZoP2AdIA0gMHIpJKLAtcddYtlNSPc/6kp\n\trIT6cAmw8XILTKm3z38heA==",
        "X-Received": "by 10.28.139.204 with SMTP id n195mr2857960wmd.14.1499965379213; \n\tThu, 13 Jul 2017 10:02:59 -0700 (PDT)",
        "From": "Miguel Angel Ajo <majopela@redhat.com>",
        "To": "dev@openvswitch.org",
        "Date": "Thu, 13 Jul 2017 17:02:40 +0000",
        "Message-Id": "<1499965361-32021-7-git-send-email-majopela@redhat.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1499965361-32021-1-git-send-email-majopela@redhat.com>",
        "References": "<1496930708-15441-1-git-send-email-majopela@redhat.com>\n\t<1499965361-32021-1-git-send-email-majopela@redhat.com>",
        "X-Spam-Status": "No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE\n\tautolearn=ham version=3.3.1",
        "X-Spam-Checker-Version": "SpamAssassin 3.3.1 (2010-03-16) on\n\tsmtp1.linux-foundation.org",
        "Subject": "[ovs-dev] [PATCH v5 7/8] ovn: l3ha, gratuitous ARP for HA router",
        "X-BeenThere": "ovs-dev@openvswitch.org",
        "X-Mailman-Version": "2.1.12",
        "Precedence": "list",
        "List-Id": "<ovs-dev.openvswitch.org>",
        "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n\t<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\t<mailto:ovs-dev-request@openvswitch.org?subject=subscribe>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Sender": "ovs-dev-bounces@openvswitch.org",
        "Errors-To": "ovs-dev-bounces@openvswitch.org"
    },
    "content": "From: Venkata Anil Kommaddi <vkommadi@redhat.com>\n\nThis patch extends gratuitous ARP support for NAT addresses so that it\napplies to centralized NAT rules on a HA router.\nGratuitous ARP packets for centralized NAT rules on a HA router\nare only generated on the active gateway chassis.\n\nSigned-off-by: Anil Venkata <vkommadi@redhat.com>\n---\n ovn/controller/ovn-controller.c |   3 +-\n ovn/controller/pinctrl.c        |  45 ++++++++++++---\n ovn/controller/pinctrl.h        |   5 +-\n tests/ovn.at                    | 121 ++++++++++++++++++++++++++++++++++++++++\n 4 files changed, 165 insertions(+), 9 deletions(-)",
    "diff": "diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c\nindex 02e6ef5..da3e83a 100644\n--- a/ovn/controller/ovn-controller.c\n+++ b/ovn/controller/ovn-controller.c\n@@ -658,7 +658,8 @@ main(int argc, char *argv[])\n             enum mf_field_id mff_ovn_geneve = ofctrl_run(br_int,\n                                                          &pending_ct_zones);\n \n-            pinctrl_run(&ctx, &lports, br_int, chassis, &local_datapaths);\n+            pinctrl_run(&ctx, &lports, br_int, chassis, &chassis_index,\n+                        &local_datapaths, &active_tunnels);\n             update_ct_zones(&local_lports, &local_datapaths, &ct_zones,\n                             ct_zone_bitmap, &pending_ct_zones);\n             if (ctx.ovs_idl_txn) {\ndiff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c\nindex 660233a..b7bcee6 100644\n--- a/ovn/controller/pinctrl.c\n+++ b/ovn/controller/pinctrl.c\n@@ -23,6 +23,7 @@\n #include \"dirs.h\"\n #include \"dp-packet.h\"\n #include \"flow.h\"\n+#include \"gchassis.h\"\n #include \"lport.h\"\n #include \"nx-match.h\"\n #include \"ovn-controller.h\"\n@@ -72,7 +73,9 @@ static void send_garp_wait(void);\n static void send_garp_run(const struct ovsrec_bridge *,\n                           const struct sbrec_chassis *,\n                           const struct lport_index *lports,\n-                          struct hmap *local_datapaths);\n+                          const struct chassis_index *chassis_index,\n+                          struct hmap *local_datapaths,\n+                          struct sset *active_tunnels);\n static void pinctrl_handle_nd_na(const struct flow *ip_flow,\n                                  const struct match *md,\n                                  struct ofpbuf *userdata);\n@@ -1016,7 +1019,9 @@ void\n pinctrl_run(struct controller_ctx *ctx, const struct lport_index *lports,\n             const struct ovsrec_bridge *br_int,\n             const struct sbrec_chassis *chassis,\n-            struct hmap *local_datapaths)\n+            const struct chassis_index *chassis_index,\n+            struct hmap *local_datapaths,\n+            struct sset *active_tunnels)\n {\n     char *target = xasprintf(\"unix:%s/%s.mgmt\", ovs_rundir(), br_int->name);\n     if (strcmp(target, rconn_get_target(swconn))) {\n@@ -1051,7 +1056,8 @@ pinctrl_run(struct controller_ctx *ctx, const struct lport_index *lports,\n     }\n \n     run_put_mac_bindings(ctx, lports);\n-    send_garp_run(br_int, chassis, lports, local_datapaths);\n+    send_garp_run(br_int, chassis, lports, chassis_index, local_datapaths,\n+                  active_tunnels);\n }\n \n void\n@@ -1490,11 +1496,26 @@ get_localnet_vifs_l3gwports(const struct ovsrec_bridge *br_int,\n static bool\n pinctrl_is_chassis_resident(const struct lport_index *lports,\n                             const struct sbrec_chassis *chassis,\n+                            const struct chassis_index *chassis_index,\n+                            struct sset *active_tunnels,\n                             const char *port_name)\n {\n     const struct sbrec_port_binding *pb\n         = lport_lookup_by_name(lports, port_name);\n-    return pb && pb->chassis && pb->chassis == chassis;\n+    if (!pb || !pb->chassis) {\n+        return false;\n+    }\n+    if (strcmp(pb->type, \"chassisredirect\")) {\n+        return pb->chassis == chassis;\n+    } else {\n+        struct ovs_list *gateway_chassis =\n+            gateway_chassis_get_ordered(pb, chassis_index);\n+        bool active = gateway_chassis_is_active(gateway_chassis,\n+                                                chassis,\n+                                                active_tunnels);\n+        gateway_chassis_destroy(gateway_chassis);\n+        return active;\n+    }\n }\n \n /* Extracts the mac, IPv4 and IPv6 addresses, and logical port from\n@@ -1569,13 +1590,16 @@ consider_nat_address(const char *nat_address,\n                      struct sset *nat_address_keys,\n                      const struct lport_index *lports,\n                      const struct sbrec_chassis *chassis,\n+                     const struct chassis_index *chassis_index,\n+                     struct sset *active_tunnels,\n                      struct shash *nat_addresses)\n {\n     struct lport_addresses *laddrs = xmalloc(sizeof *laddrs);\n     char *lport = NULL;\n     if (!extract_addresses_with_port(nat_address, laddrs, &lport)\n         || (!lport && !strcmp(pb->type, \"patch\"))\n-        || (lport && !pinctrl_is_chassis_resident(lports, chassis, lport))) {\n+        || (lport && !pinctrl_is_chassis_resident(\n+            lports, chassis, chassis_index, active_tunnels, lport))) {\n         destroy_lport_addresses(laddrs);\n         free(laddrs);\n         free(lport);\n@@ -1598,6 +1622,8 @@ get_nat_addresses_and_keys(struct sset *nat_address_keys,\n                            struct sset *local_l3gw_ports,\n                            const struct lport_index *lports,\n                            const struct sbrec_chassis *chassis,\n+                           const struct chassis_index *chassis_index,\n+                           struct sset *active_tunnels,\n                            struct shash *nat_addresses)\n {\n     const char *gw_port;\n@@ -1612,6 +1638,7 @@ get_nat_addresses_and_keys(struct sset *nat_address_keys,\n             for (int i = 0; i < pb->n_nat_addresses; i++) {\n                 consider_nat_address(pb->nat_addresses[i], pb,\n                                      nat_address_keys, lports, chassis,\n+                                     chassis_index, active_tunnels,\n                                      nat_addresses);\n             }\n         } else {\n@@ -1622,6 +1649,7 @@ get_nat_addresses_and_keys(struct sset *nat_address_keys,\n             if (nat_addresses_options) {\n                 consider_nat_address(nat_addresses_options, pb,\n                                      nat_address_keys, lports, chassis,\n+                                     chassis_index, active_tunnels,\n                                      nat_addresses);\n             }\n         }\n@@ -1638,7 +1666,9 @@ static void\n send_garp_run(const struct ovsrec_bridge *br_int,\n               const struct sbrec_chassis *chassis,\n               const struct lport_index *lports,\n-              struct hmap *local_datapaths)\n+              const struct chassis_index *chassis_index,\n+              struct hmap *local_datapaths,\n+              struct sset *active_tunnels)\n {\n     struct sset localnet_vifs = SSET_INITIALIZER(&localnet_vifs);\n     struct sset local_l3gw_ports = SSET_INITIALIZER(&local_l3gw_ports);\n@@ -1652,7 +1682,8 @@ send_garp_run(const struct ovsrec_bridge *br_int,\n                       &localnet_vifs, &localnet_ofports, &local_l3gw_ports);\n \n     get_nat_addresses_and_keys(&nat_ip_keys, &local_l3gw_ports, lports,\n-                               chassis, &nat_addresses);\n+                               chassis, chassis_index, active_tunnels,\n+                               &nat_addresses);\n     /* For deleted ports and deleted nat ips, remove from send_garp_data. */\n     struct shash_node *iter, *next;\n     SHASH_FOR_EACH_SAFE (iter, next, &send_garp_data) {\ndiff --git a/ovn/controller/pinctrl.h b/ovn/controller/pinctrl.h\nindex 230580b..913c170 100644\n--- a/ovn/controller/pinctrl.h\n+++ b/ovn/controller/pinctrl.h\n@@ -19,8 +19,10 @@\n \n #include <stdint.h>\n \n+#include \"lib/sset.h\"\n #include \"openvswitch/meta-flow.h\"\n \n+struct chassis_index;\n struct controller_ctx;\n struct hmap;\n struct lport_index;\n@@ -30,7 +32,8 @@ struct sbrec_chassis;\n void pinctrl_init(void);\n void pinctrl_run(struct controller_ctx *, const struct lport_index *,\n                  const struct ovsrec_bridge *, const struct sbrec_chassis *,\n-                 struct hmap *local_datapaths);\n+                 const struct chassis_index *, struct hmap *local_datapaths,\n+                 struct sset *active_tunnels);\n void pinctrl_wait(struct controller_ctx *);\n void pinctrl_destroy(void);\n \ndiff --git a/tests/ovn.at b/tests/ovn.at\nindex 5f10d52..5a0b761 100644\n--- a/tests/ovn.at\n+++ b/tests/ovn.at\n@@ -7959,3 +7959,124 @@ AT_CHECK([ovn-sbctl --columns chassis --bare find Port_Binding logical_port=cr-o\n OVN_CLEANUP([gw1],[gw2],[hv1],[hv2])\n \n AT_CLEANUP\n+\n+AT_SETUP([ovn -- send gratuitous ARP for NAT rules on HA distributed router])\n+AT_SKIP_IF([test $HAVE_PYTHON = no])\n+ovn_start\n+ovn-nbctl ls-add ls0\n+ovn-nbctl ls-add ls1\n+ovn-nbctl create Logical_Router name=lr0\n+ovn-nbctl lrp-add lr0 lrp0 f0:00:00:00:00:01 192.168.0.100/24\n+\n+ovn-nbctl --id=@gc0 create Gateway_Chassis \\\n+                    name=outside_gw1 chassis_name=hv2 priority=10 -- \\\n+          --id=@gc1 create Gateway_Chassis \\\n+                    name=outside_gw2 chassis_name=hv3 priority=1 -- \\\n+          set Logical_Router_Port lrp0 'gateway_chassis=[@gc0,@gc1]'\n+\n+ovn-nbctl lsp-add ls0 lrp0-rp -- set Logical_Switch_Port lrp0-rp \\\n+    type=router options:router-port=lrp0 addresses=\"router\"\n+ovn-nbctl lrp-add lr0 lrp1 f0:00:00:00:00:02 10.0.0.1/24\n+ovn-nbctl lsp-add ls1 lrp1-rp -- set Logical_Switch_Port lrp1-rp \\\n+    type=router options:router-port=lrp1 addresses=\"router\"\n+\n+# Add NAT rules\n+AT_CHECK([ovn-nbctl lr-nat-add lr0 snat 192.168.0.100 10.0.0.0/24])\n+\n+net_add n1\n+sim_add hv1\n+as hv1\n+ovs-vsctl add-br br-phys\n+ovn_attach n1 br-phys 192.168.0.1\n+AT_CHECK([ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=physnet1:br-phys])\n+AT_CHECK([ovs-vsctl add-port br-phys snoopvif -- set Interface snoopvif options:tx_pcap=hv1/snoopvif-tx.pcap options:rxq_pcap=hv1/snoopvif-rx.pcap])\n+\n+sim_add hv2\n+as hv2\n+ovs-vsctl add-br br-phys\n+ovn_attach n1 br-phys 192.168.0.2\n+AT_CHECK([as hv2 ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=physnet1:br-phys])\n+\n+sim_add hv3\n+as hv3\n+ovs-vsctl add-br br-phys\n+ovn_attach n1 br-phys 192.168.0.3\n+AT_CHECK([as hv3 ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=physnet1:br-phys])\n+\n+# Create a localnet port.\n+AT_CHECK([ovn-nbctl lsp-add ls0 ln_port])\n+AT_CHECK([ovn-nbctl lsp-set-addresses ln_port unknown])\n+AT_CHECK([ovn-nbctl lsp-set-type ln_port localnet])\n+AT_CHECK([ovn-nbctl lsp-set-options ln_port network_name=physnet1])\n+\n+# wait for earlier changes to take effect\n+AT_CHECK([ovn-nbctl --timeout=3 --wait=sb sync], [0], [ignore])\n+\n+reset_pcap_file() {\n+    local iface=$1\n+    local pcap_file=$2\n+    ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \\\n+options:rxq_pcap=dummy-rx.pcap\n+    rm -f ${pcap_file}*.pcap\n+    ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \\\n+options:rxq_pcap=${pcap_file}-rx.pcap\n+}\n+\n+as hv1 reset_pcap_file snoopvif hv1/snoopvif\n+as hv2 reset_pcap_file br-phys_n1 hv2/br-phys_n1\n+as hv3 reset_pcap_file br-phys_n1 hv3/br-phys_n1\n+# add nat-addresses option\n+ovn-nbctl --wait=sb lsp-set-options lrp0-rp router-port=lrp0 nat-addresses=\"router\"\n+\n+# Wait for packets to be received through hv2.\n+OVS_WAIT_UNTIL([test `wc -c < \"hv1/snoopvif-tx.pcap\"` -ge 100])\n+trim_zeros() {\n+    sed 's/\\(00\\)\\{1,\\}$//'\n+}\n+\n+garp=\"fffffffffffff0000000000108060001080006040001f00000000001c0a80064000000000000c0a80064\"\n+echo $garp >> expout\n+echo $garp >> expout\n+$PYTHON \"$top_srcdir/utilities/ovs-pcap.in\" hv1/snoopvif-tx.pcap | trim_zeros > hv1_snoop_tx\n+echo \"packets on hv1-snoopvif:\"\n+cat hv1_snoop_tx\n+AT_CHECK([sort hv1_snoop_tx], [0], [expout])\n+$PYTHON \"$top_srcdir/utilities/ovs-pcap.in\" hv2/br-phys_n1-tx.pcap | trim_zeros > hv2_br_phys_tx\n+echo \"packets on hv2 br-phys tx\"\n+cat hv2_br_phys_tx\n+AT_CHECK([grep $garp hv2_br_phys_tx | sort], [0], [expout])\n+$PYTHON \"$top_srcdir/utilities/ovs-pcap.in\" hv3/br-phys_n1-tx.pcap | trim_zeros > hv3_br_phys_tx\n+echo \"packets on hv3 br-phys tx\"\n+cat hv3_br_phys_tx\n+AT_CHECK([grep $garp hv3_br_phys_tx | sort], [0], [])\n+\n+\n+# at this point, we invert the priority of the gw chassis between hv2 and hv3\n+\n+ovn-nbctl --wait=hv \\\n+          --id=@gc0 create Gateway_Chassis \\\n+                    name=outside_gw1 chassis_name=hv2 priority=1 -- \\\n+          --id=@gc1 create Gateway_Chassis \\\n+                    name=outside_gw2 chassis_name=hv3 priority=10 -- \\\n+          set Logical_Router_Port lrp0 'gateway_chassis=[@gc0,@gc1]'\n+\n+\n+as hv1 reset_pcap_file snoopvif hv1/snoopvif\n+as hv2 reset_pcap_file br-phys_n1 hv2/br-phys_n1\n+as hv3 reset_pcap_file br-phys_n1 hv3/br-phys_n1\n+\n+# Wait for packets to be received.\n+OVS_WAIT_UNTIL([test `wc -c < \"hv1/snoopvif-tx.pcap\"` -ge 100])\n+trim_zeros() {\n+    sed 's/\\(00\\)\\{1,\\}$//'\n+}\n+\n+$PYTHON \"$top_srcdir/utilities/ovs-pcap.in\" hv1/snoopvif-tx.pcap | trim_zeros >  hv1_snoopvif_tx\n+AT_CHECK([sort hv1_snoopvif_tx], [0], [expout])\n+$PYTHON \"$top_srcdir/utilities/ovs-pcap.in\" hv3/br-phys_n1-tx.pcap | trim_zeros > hv3_br_phys_tx\n+AT_CHECK([grep $garp hv3_br_phys_tx | sort], [0], [expout])\n+$PYTHON \"$top_srcdir/utilities/ovs-pcap.in\" hv2/br-phys_n1-tx.pcap | trim_zeros > hv2_br_phys_tx\n+AT_CHECK([grep $garp hv2_br_phys_tx | sort], [0], [])\n+OVN_CLEANUP([hv1],[hv2],[hv3])\n+\n+AT_CLEANUP\n",
    "prefixes": [
        "ovs-dev",
        "v5",
        "7/8"
    ]
}