{"id":2229775,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2229775/?format=json","web_url":"http://patchwork.ozlabs.org/project/ovn/patch/20260428174509.145440-2-mmichels@redhat.com/","project":{"id":68,"url":"http://patchwork.ozlabs.org/api/1.1/projects/68/?format=json","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":""},"msgid":"<20260428174509.145440-2-mmichels@redhat.com>","date":"2026-04-28T17:45:01","name":"[ovs-dev,1/5] ovn-nbctl: Fix documentation and usage output for all commands.","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"812c914b2a0b8e2d2cf4757e17b423d6918cf82c","submitter":{"id":71978,"url":"http://patchwork.ozlabs.org/api/1.1/people/71978/?format=json","name":"Mark Michelson","email":"mmichels@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/ovn/patch/20260428174509.145440-2-mmichels@redhat.com/mbox/","series":[{"id":501914,"url":"http://patchwork.ozlabs.org/api/1.1/series/501914/?format=json","web_url":"http://patchwork.ozlabs.org/project/ovn/list/?series=501914","date":"2026-04-28T17:45:02","name":"Fix up northd documentation.","version":1,"mbox":"http://patchwork.ozlabs.org/series/501914/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2229775/comments/","check":"fail","checks":"http://patchwork.ozlabs.org/api/patches/2229775/checks/","tags":{},"headers":{"Return-Path":"<ovs-dev-bounces@openvswitch.org>","X-Original-To":["incoming@patchwork.ozlabs.org","dev@openvswitch.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","ovs-dev@lists.linuxfoundation.org"],"Authentication-Results":["legolas.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=giHFgBsE;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp4.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key)\n header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=giHFgBsE","smtp2.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","smtp2.osuosl.org; dkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=giHFgBsE"],"Received":["from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g4ns34y35z1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 03:45:27 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp4.osuosl.org (Postfix) with ESMTP id 1DDBA41EAC;\n\tTue, 28 Apr 2026 17:45:26 +0000 (UTC)","from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id BTfgQ9vmNt0P; Tue, 28 Apr 2026 17:45:20 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp4.osuosl.org (Postfix) with ESMTPS id 19C494068F;\n\tTue, 28 Apr 2026 17:45:20 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id B911FC058F;\n\tTue, 28 Apr 2026 17:45:19 +0000 (UTC)","from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 9E4A5C04FA\n for <dev@openvswitch.org>; Tue, 28 Apr 2026 17:45:17 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp2.osuosl.org (Postfix) with ESMTP id 90602407AA\n for <dev@openvswitch.org>; Tue, 28 Apr 2026 17:45:17 +0000 (UTC)","from smtp2.osuosl.org ([127.0.0.1])\n by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id Yiq-k_Y3cZTI for <dev@openvswitch.org>;\n Tue, 28 Apr 2026 17:45:16 +0000 (UTC)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by smtp2.osuosl.org (Postfix) with ESMTPS id F240E40639\n for <dev@openvswitch.org>; Tue, 28 Apr 2026 17:45:15 +0000 (UTC)","from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-81-PSNqe6zmPHCLN_bDdCEmew-1; Tue,\n 28 Apr 2026 13:45:12 -0400","from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 0B6F818005AC\n for <dev@openvswitch.org>; Tue, 28 Apr 2026 17:45:12 +0000 (UTC)","from localhost.localdomain.com (unknown [10.22.88.208])\n by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 8A20619560AB\n for <dev@openvswitch.org>; Tue, 28 Apr 2026 17:45:11 +0000 (UTC)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections -\n client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp4.osuosl.org 19C494068F","OpenDKIM Filter v2.11.0 smtp2.osuosl.org F240E40639"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=mmichels@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp2.osuosl.org F240E40639","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777398314;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=yTWg3uRI2Zk6oSa7UAFnvQb1eu0TxTRVyxc8Qu3D1gw=;\n b=giHFgBsE7GSS0Vtbzx+5/fcNNe44k8vSRQtQOs172gkYp3jvG/KundMzFE0a9epL8f+hd6\n A7Xp/yK91Eb/4DkkHdGDre2hMxRj6h781QOx0nVCR5XOCOcawGsKuAwkx20Xo/mQpEsZCW\n D2KnDDGwIwqmRFjKdVdR6+SaFOU0zRc=","X-MC-Unique":"PSNqe6zmPHCLN_bDdCEmew-1","X-Mimecast-MFC-AGG-ID":"PSNqe6zmPHCLN_bDdCEmew_1777398312","To":"dev@openvswitch.org","Date":"Tue, 28 Apr 2026 13:45:01 -0400","Message-ID":"<20260428174509.145440-2-mmichels@redhat.com>","In-Reply-To":"<20260428174509.145440-1-mmichels@redhat.com>","References":"<20260428174509.145440-1-mmichels@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.0 on 10.30.177.12","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"EuPSaXYVIrocH8RyaRIVz5fO3cLqfS1UC2iLVQHCj0k_1777398312","X-Mimecast-Originator":"redhat.com","Subject":"[ovs-dev] [PATCH ovn 1/5] ovn-nbctl: Fix documentation and usage\n output for all commands.","X-BeenThere":"ovs-dev@openvswitch.org","X-Mailman-Version":"2.1.30","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>","From":"Mark Michelson via dev <ovs-dev@openvswitch.org>","Reply-To":"Mark Michelson <mmichels@redhat.com>","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":"Add missing commands to the manpage: mirror-rule-add, mirror-rule-del,\nlr-nat-update-ext-ip, ha-chassis-group-set-chassis-prio,\nlsp-add-router-port, and lsp-add-localnet-port.\n\nAdd missing options to the manpage: --add-route for lb-add, --fair and\n--may-exist for meter-add, --chain and --output-port for lr-policy-add,\n--chain for lr-policy-del, and ADDRESS_FAMILY argument for lb-add.\n\nFix errors in the manpage: remove erroneous --route-table from\nlr-policy-add, add optional argument to nfg-list, update lr-policy-add\naction list to include jump.\n\nUpdate nbctl_usage() to list all available options for every command,\nmatching the command table. Fix the mirror-rule-del signature, the\ndhcp-options-get-options typo, and various formatting issues.\n\nAssisted-by: Claude Code (Claude Opus 4.6)\nSigned-off-by: Mark Michelson <mmichels@redhat.com>\n---\n NEWS                      |   6 ++\n utilities/ovn-nbctl.8.xml | 174 ++++++++++++++++++++++++++++++----\n utilities/ovn-nbctl.c     | 191 ++++++++++++++++++++++----------------\n 3 files changed, 270 insertions(+), 101 deletions(-)","diff":"diff --git a/NEWS b/NEWS\nindex 8633ba8bb..04f24a5ca 100644\n--- a/NEWS\n+++ b/NEWS\n@@ -1,5 +1,11 @@\n Post v26.03.0\n -------------\n+   - Documented missing ovn-nbctl commands: \"mirror-rule-add\",\n+     \"mirror-rule-del\", \"lr-nat-update-ext-ip\",\n+     \"ha-chassis-group-set-chassis-prio\", \"lsp-add-router-port\",\n+     and \"lsp-add-localnet-port\".  Also documented missing options for\n+     \"lb-add\", \"meter-add\", \"lr-policy-add\", and \"lr-policy-del\", and\n+     fixed the \"nfg-list\" signature.\n    - Dynamic Routing:\n      * Add support for hub-and-spoke propagation via the \"hub-spoke\" option\n        in dynamic-routing-redistribute settings.\ndiff --git a/utilities/ovn-nbctl.8.xml b/utilities/ovn-nbctl.8.xml\nindex 4fbd0bb0e..aaff29ec0 100644\n--- a/utilities/ovn-nbctl.8.xml\n+++ b/utilities/ovn-nbctl.8.xml\n@@ -545,10 +545,12 @@\n       </p>\n       </dd>\n \n-      <dt><code>nfg-list</code></dt>\n+      <dt><code>nfg-list</code> [<var>nfg</var>]</dt>\n       <dd>\n         <p>\n-          Lists all network function groups.\n+          Lists all network function groups.  If a specific network\n+          function group <var>nfg</var> is given, only that group is\n+          listed.\n         </p>\n       </dd>\n \n@@ -634,7 +636,7 @@\n \n     <h2>Meter Commands</h2>\n     <dl>\n-        <dt><code>meter-add</code> <var>name</var> <var>action</var> <var>rate</var> <var>unit</var> [<var>burst</var>]</dt>\n+        <dt>[<code>--fair</code>] [<code>--may-exist</code>] <code>meter-add</code> <var>name</var> <var>action</var> <var>rate</var> <var>unit</var> [<var>burst</var>]</dt>\n       <dd>\n         <p>\n           Adds the specified meter.  <var>name</var> must be a unique\n@@ -666,6 +668,18 @@\n           internal use by OVN, so <code>ovn-nbctl</code> does not allow\n           adding them.\n         </p>\n+\n+        <p>\n+          If <code>--fair</code> is specified, the meter's\n+          <code>fair</code> column is set to <code>true</code>, enabling\n+          fair bandwidth sharing among rows that reference this meter.\n+        </p>\n+\n+        <p>\n+          If <code>--may-exist</code> is specified, adding a meter with\n+          a name that already exists will update the existing meter\n+          instead of reporting an error.\n+        </p>\n       </dd>\n \n       <dt><code>meter-del</code> [<var>name</var>]</dt>\n@@ -974,6 +988,40 @@\n       <dd>\n         Detaches the mirror <var>m</var> from the logical port <var>port</var>.\n       </dd>\n+\n+      <dt>[<code>--may-exist</code>] <code>lsp-add-router-port</code>\n+          <var>switch</var> <var>port</var> <var>lrp_peer</var></dt>\n+      <dd>\n+        <p>\n+          Creates a new logical switch port named <var>port</var> on\n+          <var>switch</var> with type <code>router</code>, sets the\n+          <code>router-port</code> option to <var>lrp_peer</var>, and\n+          sets addresses to <code>router</code>.\n+        </p>\n+\n+        <p>\n+          With <code>--may-exist</code>, it is not an error if the port\n+          already exists, as long as it is in the same switch, has the\n+          same type, and has the same <code>router-port</code> option.\n+        </p>\n+      </dd>\n+\n+      <dt>[<code>--may-exist</code>] <code>lsp-add-localnet-port</code>\n+          <var>switch</var> <var>port</var> <var>network</var></dt>\n+      <dd>\n+        <p>\n+          Creates a new logical switch port named <var>port</var> on\n+          <var>switch</var> with type <code>localnet</code>, sets the\n+          <code>network_name</code> option to <var>network</var>, and\n+          sets addresses to <code>unknown</code>.\n+        </p>\n+\n+        <p>\n+          With <code>--may-exist</code>, it is not an error if the port\n+          already exists, as long as it is in the same switch, has the\n+          same type, and has the same <code>network_name</code> option.\n+        </p>\n+      </dd>\n     </dl>\n \n     <h2>Forwarding Group Commands</h2>\n@@ -1254,7 +1302,8 @@\n \n     <dl>\n       <dt>[<code>--may-exist</code>] [<code>--bfd</code>]\n-          [<code>--route-table</code>=<var>ROUTE_TABLE</var>]\n+          [<code>--chain</code>=<var>CHAIN</var>]\n+          [<code>--output-port</code>=<var>OUTPUT_PORT</var>]\n           <code>lr-policy-add</code>\n           <var>router</var> <var>priority</var> <var>match</var>\n           <var>action</var> [<var>nexthop</var>[,<var>nexthop</var>,...]]\n@@ -1262,16 +1311,18 @@\n       <dd>\n         <p>\n           Add Policy to <var>router</var> which provides a way to configure\n-          permit/deny and reroute policies on the router. Permit/deny policies\n-          are similar to OVN ACLs, but exist on the logical-router. Reroute\n-          policies are needed for service-insertion and service-chaining.\n-          <var>nexthop</var> is an optional parameter. It needs to be provided\n-          only when <var>action</var> is <var>reroute</var>. Multiple\n-          <code>nexthops</code> can be specified for ECMP routing.\n-          A policy is uniquely identified by <var>priority</var> and\n-          <var>match</var>. Multiple policies can have the same\n-          <var>priority</var>. <var>options</var> sets the router policy\n-          options as key-value pair.\n+          allow, drop, jump, and reroute policies on the router.  Allow and\n+          drop policies are similar to OVN ACLs, but exist on the\n+          logical-router.  Reroute policies are needed for service-insertion\n+          and service-chaining.  The <var>action</var> must be one of\n+          <code>allow</code>, <code>drop</code>, <code>jump</code>, or\n+          <code>reroute</code>.  <var>nexthop</var> is an optional\n+          parameter.  It needs to be provided only when <var>action</var>\n+          is <code>reroute</code>.  Multiple <code>nexthops</code> can be\n+          specified for ECMP routing.  A policy is uniquely identified by\n+          <var>priority</var> and <var>match</var>.  Multiple policies can\n+          have the same <var>priority</var>.  <var>options</var> sets the\n+          router policy options as key-value pair.\n           The supported option is : <code>pkt_mark</code>.\n         </p>\n \n@@ -1283,9 +1334,14 @@\n         </p>\n \n         <p>\n-          The <code>--route-table</code> option can be used to list the\n-          routes assigned to route table <var>ROUTE_TABLE</var> instead of\n-          the default <code>&lt;main&gt;</code> table.\n+          The <code>--chain</code> option specifies the policy chain name.\n+          This is used when the <var>action</var> is <code>jump</code>.\n+        </p>\n+\n+        <p>\n+          The <code>--output-port</code> option specifies the output\n+          logical router port.  This is only valid when the\n+          <var>action</var> is <code>reroute</code>.\n         </p>\n \n         <p>\n@@ -1313,7 +1369,9 @@\n           </p>\n       </dd>\n \n-      <dt>[<code>--if-exists</code>] <code>lr-policy-del</code>\n+      <dt>[<code>--if-exists</code>]\n+          [<code>--chain</code>=<var>CHAIN</var>]\n+          <code>lr-policy-del</code>\n           <var>router</var> [<var>{priority | uuid} [match]</var>]</dt>\n       <dd>\n         <p>\n@@ -1330,6 +1388,11 @@\n           <var>uuid</var> does not exist, unless <code>--if-exists</code>\n           is specified.\n         </p>\n+\n+        <p>\n+          If <code>--chain</code> is specified, only policies in the\n+          specified chain are considered for deletion.\n+        </p>\n       </dd>\n \n       <dt><code>lr-policy-list</code> <var>router</var></dt>\n@@ -1474,11 +1537,36 @@\n       <dd>\n         Lists the NATs on <var>router</var>.\n       </dd>\n+\n+      <dt>[<code>--is-exempted</code>] <code>lr-nat-update-ext-ip</code>\n+          <var>router</var> <var>type</var> <var>ip</var>\n+          <var>address_set</var></dt>\n+      <dd>\n+        <p>\n+          Updates the external IP address set for an existing NAT rule on\n+          <var>router</var>.  <var>type</var> must be one of\n+          <code>dnat</code>, <code>snat</code>, or\n+          <code>dnat_and_snat</code>.  The command finds the matching\n+          NAT rule by <var>type</var> and <var>ip</var>, then sets the\n+          <code>allowed_ext_ips</code> column of the NAT rule to\n+          <var>address_set</var>.\n+        </p>\n+\n+        <p>\n+          If <code>--is-exempted</code> is specified, sets\n+          <code>exempted_ext_ips</code> instead of\n+          <code>allowed_ext_ips</code>.\n+        </p>\n+\n+        <p>\n+          It is an error if no matching NAT rule is found.\n+        </p>\n+      </dd>\n     </dl>\n \n     <h2>Load Balancer Commands</h2>\n     <dl>\n-        <dt>[<code>--may-exist</code> | <code>--add-duplicate</code> | <code>--reject</code> | <code>--event</code> | <code>--template</code>] <code>lb-add</code> <var>lb</var> <var>vip</var> <var>ips</var> [<var>protocol</var>]</dt>\n+        <dt>[<code>--may-exist</code> | <code>--add-duplicate</code> | <code>--reject</code> | <code>--event</code> | <code>--template</code> | <code>--add-route</code>] <code>lb-add</code> <var>lb</var> <var>vip</var> <var>ips</var> [<var>protocol</var>] [<var>address_family</var>]</dt>\n       <dd>\n         <p>\n          Creates a new load balancer named <var>lb</var> with the provided\n@@ -1537,6 +1625,17 @@\n          ^vip:^vport ^backend udp ipv4</code>.\n         </p>\n \n+        <p>\n+         If <code>--add-route</code> is specified, a route is automatically\n+         added for the load balancer's VIP subnet.\n+        </p>\n+\n+        <p>\n+         The optional <var>address_family</var> argument specifies the\n+         address family (<code>ipv4</code> or <code>ipv6</code>).  This\n+         is primarily used with template load balancers.\n+        </p>\n+\n         <p>\n          The following example adds a load balancer.\n         </p>\n@@ -1708,6 +1807,18 @@\n         group <code>group</code>. It is an error if <code>chassis</code> does\n         not exist.\n       </dd>\n+\n+      <dt><code>ha-chassis-group-set-chassis-prio</code> <var>group</var>\n+      <var>chassis</var> <var>priority</var></dt>\n+      <dd>\n+        <p>\n+          Sets the priority of an existing HA chassis <var>chassis</var>\n+          within the HA chassis group <var>group</var>.\n+          <var>priority</var> must be between <code>0</code> and\n+          <code>32767</code>, inclusive.  It is an error if\n+          <var>chassis</var> does not exist in <var>group</var>.\n+        </p>\n+      </dd>\n     </dl>\n \n     <h2> Control Plane Protection Policy commands</h2>\n@@ -1821,6 +1932,31 @@\n       <dd>\n         Lists the mirrors.\n       </dd>\n+\n+      <dt><code>mirror-rule-add</code> <var>mirror_name</var>\n+      <var>priority</var> <var>match</var> <var>action</var></dt>\n+      <dd>\n+        <p>\n+          Adds a mirror rule to the mirror named <var>mirror_name</var>.\n+          <var>priority</var> is an integer between <code>0</code> and\n+          <code>32767</code>, inclusive.  <var>match</var> is a match\n+          expression for selecting traffic.  <var>action</var> must be\n+          <code>mirror</code> or <code>skip</code>.  It is an error if\n+          a duplicate rule already exists on the mirror.\n+        </p>\n+      </dd>\n+\n+      <dt><code>mirror-rule-del</code> <var>mirror_name</var>\n+      [<var>priority</var> <var>match</var>]</dt>\n+      <dd>\n+        <p>\n+          Deletes mirror rules from the mirror named\n+          <var>mirror_name</var>.  If only <var>mirror_name</var> is\n+          given, all mirror rules are deleted from that mirror.  If\n+          <var>priority</var> and <var>match</var> are also given, only\n+          the rule matching both is deleted.\n+        </p>\n+      </dd>\n     </dl>\n \n     <h2>Health Check commands</h2>\ndiff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c\nindex 0ef207272..9f6bb374b 100644\n--- a/utilities/ovn-nbctl.c\n+++ b/utilities/ovn-nbctl.c\n@@ -289,64 +289,62 @@ General commands:\\n\\\n   show ROUTER               print overview of database contents for ROUTER\\n\\\n \\n\\\n Logical switch commands:\\n\\\n+  [--may-exist | --add-duplicate]\\n\\\n   ls-add [SWITCH]           create a logical switch named SWITCH\\n\\\n+  [--if-exists]\\n\\\n   ls-del SWITCH             delete SWITCH and all its ports\\n\\\n   ls-list                   print the names of all logical switches\\n\\\n \\n\\\n ACL commands:\\n\\\n-  [--type={switch | port-group}] [--log] [--severity=SEVERITY] [--name=NAME] [--may-exist]\\n\\\n-  acl-add {SWITCH | PORTGROUP} DIRECTION PRIORITY MATCH ACTION [NETWORK-FUNCTION-GROUP]\\n\\\n+  [--type={switch | port-group}] [--log] [--severity=SEVERITY]\\n\\\n+  [--name=NAME] [--meter=METER] [--label=LABEL] [--may-exist]\\n\\\n+  [--apply-after-lb] [--tier=TIER]\\n\\\n+  [--sample-new=COLLECTOR_SET_ID] [--sample-est=COLLECTOR_SET_ID]\\n\\\n+  acl-add {SWITCH | PORTGROUP} DIRECTION PRIORITY MATCH ACTION\\n\\\n+          [NETWORK-FUNCTION-GROUP]\\n\\\n                             add an ACL to SWITCH/PORTGROUP\\n\\\n-  [--type={switch | port-group}]\\n\\\n+  [--type={switch | port-group}] [--tier=TIER]\\n\\\n   acl-del {SWITCH | PORTGROUP} [DIRECTION [PRIORITY MATCH]]\\n\\\n                             remove ACLs from SWITCH/PORTGROUP\\n\\\n-  [--type={switch | port-group}]\\n\\\n+  [--type={switch | port-group}] [--all]\\n\\\n   acl-list {SWITCH | PORTGROUP}\\n\\\n-                            print ACLs for SWITCH\\n\\\n+                            print ACLs for SWITCH/PORTGROUP\\n\\\n \\n\\\n QoS commands:\\n\\\n-  qos-add SWITCH DIRECTION PRIORITY MATCH [rate=RATE [burst=BURST]] [dscp=DSCP] [mark=MARK]\\n\\\n-                            add an QoS rule to SWITCH\\n\\\n+  [--may-exist]\\n\\\n+  qos-add SWITCH DIRECTION PRIORITY MATCH [rate=RATE [burst=BURST]]\\n\\\n+          [dscp=DSCP] [mark=MARK]\\n\\\n+                            add a QoS rule to SWITCH\\n\\\n   qos-del SWITCH [{DIRECTION | UUID} [PRIORITY MATCH]]\\n\\\n                             remove QoS rules from SWITCH\\n\\\n   qos-list SWITCH           print QoS rules for SWITCH\\n\\\n \\n\\\n Mirror commands:\\n\\\n-  mirror-add NAME TYPE [INDEX] FILTER {IP | MIRROR-ID| TARGET-PORT} \\n\\\n+  [--may-exist]\\n\\\n+  mirror-add NAME TYPE [INDEX] FILTER DEST\\n\\\n                             add a mirror with given name\\n\\\n-                            specify TYPE 'gre', 'erspan', 'local'\\n\\\n-                                or 'lport'.\\n\\\n-                            specify the tunnel INDEX value\\n\\\n-                                (indicates key if GRE\\n\\\n-                                 erpsan_idx if ERSPAN)\\n\\\n-                            specify FILTER for mirroring selection\\n\\\n-                                'to-lport' / 'from-lport' / 'both'\\n\\\n-                            specify Sink / Destination i.e. Remote IP, or a\\n\\\n-                                local interface with external-ids:mirror-id\\n\\\n-                                matching MIRROR-ID\\n\\\n-                                In case of lport type specify logical switch\\n\\\n-                                port, which is a mirror target.\\n\\\n   mirror-del [NAME]         remove mirrors\\n\\\n   mirror-list               print mirrors\\n\\\n-  mirror-rule-add MIRROR-NAME PRIORITY MATCH ACTION \\n\\\n-                            add a mirror rule selection to given lport\\n\\\n-                            mirror.\\n\\\n-                            specify MATCH for selecting mirrored traffic.\\n\\\n-                            specify ACTION 'mirror' or 'skip'.\\n\\\n-  mirror-rule-del MIRROR-NAME [PRIORITY | MATCH] remove mirrors\\n\\\n+  mirror-rule-add MIRROR-NAME PRIORITY MATCH ACTION\\n\\\n+                            add a mirror rule to given mirror\\n\\\n+                            ACTION must be 'mirror' or 'skip'\\n\\\n+  mirror-rule-del MIRROR-NAME [PRIORITY MATCH]\\n\\\n+                            remove mirror rules from a mirror\\n\\\n \\n\\\n Meter commands:\\n\\\n-  [--fair]\\n\\\n+  [--fair] [--may-exist]\\n\\\n   meter-add NAME ACTION RATE UNIT [BURST]\\n\\\n                             add a meter\\n\\\n   meter-del [NAME]          remove meters\\n\\\n   meter-list                print meters\\n\\\n \\n\\\n Logical switch port commands:\\n\\\n+  [--may-exist]\\n\\\n   lsp-add SWITCH PORT       add logical port PORT on SWITCH\\n\\\n   lsp-add SWITCH PORT PARENT TAG\\n\\\n                             add logical port PORT on SWITCH with PARENT\\n\\\n                             on TAG\\n\\\n+  [--if-exists]\\n\\\n   lsp-del PORT              delete PORT from its attached switch\\n\\\n   lsp-list SWITCH           print the names of all logical ports on SWITCH\\n\\\n   lsp-get-parent PORT       get the parent of PORT if set\\n\\\n@@ -363,7 +361,8 @@ Logical switch port commands:\\n\\\n                             ('enabled' or 'disabled')\\n\\\n   lsp-get-enabled PORT      get administrative state PORT\\n\\\n                             ('enabled' or 'disabled')\\n\\\n-  lsp-set-type PORT TYPE    set the type for PORT\\n\\\n+  lsp-set-type PORT TYPE [peer=PEER]\\n\\\n+                            set the type for PORT\\n\\\n   lsp-get-type PORT         get the type for PORT\\n\\\n   lsp-set-options PORT KEY=VALUE [KEY=VALUE]...\\n\\\n                             set options related to the type of PORT\\n\\\n@@ -375,50 +374,65 @@ Logical switch port commands:\\n\\\n                             set dhcpv6 options for PORT\\n\\\n   lsp-get-dhcpv6-options PORT  get the dhcpv6 options for PORT\\n\\\n   lsp-get-ls PORT           get the logical switch which the port belongs to\\n\\\n+  [--may-exist]\\n\\\n   lsp-attach-mirror PORT MIRROR   attach source PORT to MIRROR\\n\\\n   lsp-detach-mirror PORT MIRROR   detach source PORT from MIRROR\\n\\\n-  lsp-add-router-port LS PORT LRP_PEER\\n\\\n-                                    Create LSP of type router with\\n\\\n-                                    router-port set to LRP_PEER\\n\\\n-  lsp-add-localnet-port LS PORT NETWORK\\n\\\n-                                    Create LSP of type localnet with\\n\\\n-                                    network_name set to NETWORK\\n\\\n+  [--may-exist]\\n\\\n+  lsp-add-router-port SWITCH PORT LRP_PEER\\n\\\n+                            create LSP of type router with\\n\\\n+                            router-port set to LRP_PEER\\n\\\n+  [--may-exist]\\n\\\n+  lsp-add-localnet-port SWITCH PORT NETWORK\\n\\\n+                            create LSP of type localnet with\\n\\\n+                            network_name set to NETWORK\\n\\\n \\n\\\n Forwarding group commands:\\n\\\n   [--liveness]\\n\\\n   fwd-group-add GROUP SWITCH VIP VMAC PORTS...\\n\\\n                             add a forwarding group on SWITCH\\n\\\n+  [--if-exists]\\n\\\n   fwd-group-del GROUP       delete a forwarding group\\n\\\n-  fwd-group-list [SWITCH]   print forwarding groups\\n\\\n+  fwd-group-list [GROUP]    print forwarding groups\\n\\\n \\n\\\n Network function group commands:\\n\\\n+  [--may-exist]\\n\\\n   nfg-add NETWORK-FUNCTION-GROUP ID MODE [NETWORK-FUNCTION]...\\n\\\n                             create a network-function-group\\n\\\n+  [--if-exists]\\n\\\n   nfg-del NETWORK-FUNCTION-GROUP\\n\\\n                             delete a network-function-group\\n\\\n-  nfg-list print all network-function-groups\\n\\\n+  nfg-list [NETWORK-FUNCTION-GROUP]\\n\\\n+                            print network-function-groups\\n\\\n+  [--may-exist]\\n\\\n   nfg-add-nf NETWORK-FUNCTION-GROUP NETWORK-FUNCTION\\n\\\n                             add a network-function to a\\n\\\n                             network-function-group\\n\\\n+  [--if-exists]\\n\\\n   nfg-del-nf NETWORK-FUNCTION-GROUP NETWORK-FUNCTION\\n\\\n                             delete a network-function from a\\n\\\n                             network-function-group\\n\\\n \\n\\\n Network function commands:\\n\\\n+  [--may-exist]\\n\\\n   nf-add NETWORK-FUNCTION ID PORT-IN PORT-OUT\\n\\\n                            create a network-function\\n\\\n+  [--if-exists]\\n\\\n   nf-del NETWORK-FUNCTION  delete a network-function\\n\\\n   nf-list                  print all network-functions\\n\\\n \\n\\n\",program_name, program_name);\n     printf(\"\\\n Logical router commands:\\n\\\n+  [--may-exist | --add-duplicate]\\n\\\n   lr-add [ROUTER]           create a logical router named ROUTER\\n\\\n+  [--if-exists]\\n\\\n   lr-del ROUTER             delete ROUTER and all its ports\\n\\\n   lr-list                   print the names of all logical routers\\n\\\n \\n\\\n Logical router port commands:\\n\\\n-  lrp-add ROUTER PORT MAC [NETWORK]... [peer=PEER]\\n\\\n+  [--may-exist]\\n\\\n+  lrp-add ROUTER PORT MAC [NETWORK]... [COLUMN[:KEY]=VALUE]...\\n\\\n                             add logical port PORT on ROUTER\\n\\\n+  [--may-exist]\\n\\\n   lrp-set-gateway-chassis PORT CHASSIS [PRIORITY]\\n\\\n                             set gateway chassis for port PORT\\n\\\n   lrp-set-options PORT KEY=VALUE [KEY=VALUE]...\\n\\\n@@ -428,6 +442,7 @@ Logical router port commands:\\n\\\n   lrp-get-gateway-chassis PORT\\n\\\n                             print the names of all gateway chassis on PORT\\n\\\n                             with PRIORITY\\n\\\n+  [--if-exists]\\n\\\n   lrp-del PORT              delete PORT from its attached router\\n\\\n   lrp-list ROUTER           print the names of all ports on ROUTER\\n\\\n   lrp-set-enabled PORT STATE\\n\\\n@@ -445,53 +460,59 @@ Logical router port commands:\\n\\\n                             ('overlay' or 'bridged')\\n\\\n \\n\\\n Route commands:\\n\\\n-  [--policy=POLICY]\\n\\\n-  [--ecmp]\\n\\\n-  [--ecmp-symmetric-reply]\\n\\\n-  [--route-table=ROUTE_TABLE]\\n\\\n-  [--bfd]\\n\\\n+  [--may-exist] [--policy=POLICY] [--ecmp] [--ecmp-symmetric-reply]\\n\\\n+  [--route-table=ROUTE_TABLE] [--bfd]\\n\\\n   lr-route-add ROUTER PREFIX NEXTHOP [PORT]\\n\\\n                             add a route to ROUTER\\n\\\n-  [--policy=POLICY]\\n\\\n-  [--route-table=ROUTE_TABLE]\\n\\\n+  [--if-exists] [--policy=POLICY] [--route-table=ROUTE_TABLE]\\n\\\n   lr-route-del ROUTER [PREFIX [NEXTHOP [PORT]]]\\n\\\n                             remove routes from ROUTER\\n\\\n   [--route-table=ROUTE_TABLE]\\n\\\n   lr-route-list ROUTER      print routes for ROUTER\\n\\\n \\n\\\n Policy commands:\\n\\\n-  [--bfd]\\n\\\n-  lr-policy-add ROUTER PRIORITY MATCH ACTION [NEXTHOP,[NEXTHOP,...]] \\\n-[OPTIONS KEY=VALUE ...] \\n\\\n-                            add a policy to router\\n\\\n+  [--may-exist] [--bfd] [--chain=CHAIN] [--output-port=OUTPUT_PORT]\\n\\\n+  lr-policy-add ROUTER PRIORITY MATCH ACTION [NEXTHOP,[NEXTHOP,...]]\\n\\\n+                [OPTIONS KEY=VALUE ...]\\n\\\n+                            add a policy to ROUTER\\n\\\n+  [--if-exists] [--chain=CHAIN]\\n\\\n   lr-policy-del ROUTER [{PRIORITY | UUID} [MATCH]]\\n\\\n                             remove policies from ROUTER\\n\\\n   lr-policy-list ROUTER     print policies for ROUTER\\n\\\n \\n\\n\");\n     printf(\"\\\n NAT commands:\\n\\\n-  [--stateless]\\n\\\n-  [--portrange]\\n\\\n-  [--add-route]\\n\\\n-  [--gateway-port=GATEWAY_PORT]\\n\\\n-  lr-nat-add ROUTER TYPE EXTERNAL_IP LOGICAL_IP [LOGICAL_PORT EXTERNAL_MAC]\\n\\\n-                            [EXTERNAL_PORT_RANGE]\\n\\\n+  [--may-exist] [--stateless] [--portrange] [--add-route]\\n\\\n+  [--gateway-port=GATEWAY_PORT] [--priority=PRIORITY] [--match=MATCH]\\n\\\n+  lr-nat-add ROUTER TYPE EXTERNAL_IP LOGICAL_IP\\n\\\n+             [LOGICAL_PORT EXTERNAL_MAC] [EXTERNAL_PORT_RANGE]\\n\\\n                             add a NAT to ROUTER\\n\\\n+  [--if-exists] [--match=MATCH]\\n\\\n   lr-nat-del ROUTER [TYPE [IP] [GATEWAY_PORT]]\\n\\\n                             remove NATs from ROUTER\\n\\\n   lr-nat-list ROUTER        print NATs for ROUTER\\n\\\n+  [--is-exempted]\\n\\\n+  lr-nat-update-ext-ip ROUTER TYPE IP ADDRESS_SET\\n\\\n+                            update external IP address set for a NAT rule\\n\\\n \\n\\\n LB commands:\\n\\\n-  lb-add LB VIP[:PORT] IP[:PORT]... [PROTOCOL]\\n\\\n+  [--may-exist | --add-duplicate] [--reject] [--event] [--template]\\n\\\n+  [--add-route]\\n\\\n+  lb-add LB VIP[:PORT] IP[:PORT]... [PROTOCOL] [ADDRESS_FAMILY]\\n\\\n                             create a load-balancer or add a VIP to an\\n\\\n                             existing load balancer\\n\\\n+  [--if-exists]\\n\\\n   lb-del LB [VIP]           remove a load-balancer or just the VIP from\\n\\\n                             the load balancer\\n\\\n   lb-list [LB]              print load-balancers\\n\\\n+  [--may-exist]\\n\\\n   lr-lb-add ROUTER LB       add a load-balancer to ROUTER\\n\\\n+  [--if-exists]\\n\\\n   lr-lb-del ROUTER [LB]     remove load-balancers from ROUTER\\n\\\n   lr-lb-list ROUTER         print load-balancers\\n\\\n+  [--may-exist]\\n\\\n   ls-lb-add SWITCH LB       add a load-balancer to SWITCH\\n\\\n+  [--if-exists]\\n\\\n   ls-lb-del SWITCH [LB]     remove load-balancers from SWITCH\\n\\\n   ls-lb-list SWITCH         print load-balancers\\n\\\n \\n\\\n@@ -500,11 +521,10 @@ DHCP Options commands:\\n\\\n                            create a DHCP options row with CIDR\\n\\\n   dhcp-options-del DHCP_OPTIONS_UUID\\n\\\n                            delete DHCP_OPTIONS_UUID\\n\\\n-  dhcp-options-list        \\n\\\n-                           lists the DHCP_Options rows\\n\\\n-  dhcp-options-set-options DHCP_OPTIONS_UUID  KEY=VALUE [KEY=VALUE]...\\n\\\n+  dhcp-options-list        lists the DHCP_Options rows\\n\\\n+  dhcp-options-set-options DHCP_OPTIONS_UUID KEY=VALUE [KEY=VALUE]...\\n\\\n                            set DHCP options for DHCP_OPTIONS_UUID\\n\\\n-  dhcp-options-get-options DHCO_OPTIONS_UUID \\n\\\n+  dhcp-options-get-options DHCP_OPTIONS_UUID\\n\\\n                            displays the DHCP options for DHCP_OPTIONS_UUID\\n\\\n \\n\\\n Connection commands:\\n\\\n@@ -516,50 +536,57 @@ Connection commands:\\n\\\n SSL/TLS commands:\\n\\\n   get-ssl                     print the SSL/TLS configuration\\n\\\n   del-ssl                     delete the SSL/TLS configuration\\n\\\n-  set-ssl PRIV-KEY CERT CA-CERT [SSL-PROTOS [SSL-CIPHERS [SSL-CIPHERSUITES]]] \\\n-set the SSL/TLS configuration\\n\\\n+  [--bootstrap]\\n\\\n+  set-ssl PRIV-KEY CERT CA-CERT [SSL-PROTOS [SSL-CIPHERS [SSL-CIPHERSUITES]]]\\n\\\n+                              set the SSL/TLS configuration\\n\\\n+\\n\\\n Port group commands:\\n\\\n-  pg-add PG [PORTS]           Create port group PG with optional PORTS\\n\\\n-  pg-set-ports PG PORTS       Set PORTS on port group PG\\n\\\n-  pg-del PG                   Delete port group PG\\n\\\n-  pg-get-ports PG             Get PORTS on port group PG\\n\\\n+  pg-add PG [PORTS]           create port group PG with optional PORTS\\n\\\n+  pg-set-ports PG PORTS       set PORTS on port group PG\\n\\\n+  pg-del PG                   delete port group PG\\n\\\n+  pg-get-ports PG             get PORTS on port group PG\\n\\\n+\\n\\\n HA chassis group commands:\\n\\\n-  ha-chassis-group-add GRP    Create an HA chassis group GRP\\n\\\n-  ha-chassis-group-del GRP    Delete the HA chassis group GRP\\n\\\n-  ha-chassis-group-list [GRP] Print the supplied HA chassis group or all\\n\\\n+  ha-chassis-group-add GRP    create an HA chassis group GRP\\n\\\n+  ha-chassis-group-del GRP    delete the HA chassis group GRP\\n\\\n+  ha-chassis-group-list [GRP] print the supplied HA chassis group or all\\n\\\n                               if none supplied\\n\\\n-  ha-chassis-group-add-chassis GRP CHASSIS PRIORITY Adds an HA\\\n-chassis with mandatory PRIORITY to the HA chassis group GRP\\n\\\n-  ha-chassis-group-remove-chassis GRP CHASSIS Removes the HA chassis\\\n-CHASSIS from the HA chassis group GRP\\n\\\n+  ha-chassis-group-add-chassis GRP CHASSIS PRIORITY\\n\\\n+                              add an HA chassis with PRIORITY to GRP\\n\\\n+  ha-chassis-group-remove-chassis GRP CHASSIS\\n\\\n+                              remove the HA chassis CHASSIS from GRP\\n\\\n+  ha-chassis-group-set-chassis-prio GRP CHASSIS PRIORITY\\n\\\n+                              set PRIORITY of CHASSIS in GRP\\n\\\n \\n\\\n Control Plane Protection Policy commands:\\n\\\n   copp-add NAME PROTO METER\\n\\\n-                            Add a copp policy for PROTO packets on NAME\\n\\\n+                            add a copp policy for PROTO packets on NAME\\n\\\n                             CoPP policy based on an existing METER.\\n\\\n   copp-del NAME [PROTO]\\n\\\n-                            Delete the copp policy for PROTO packets for\\n\\\n+                            delete the copp policy for PROTO packets for\\n\\\n                             NAME copp. If PROTO is not specified, delete all\\n\\\n                             copp policies defined for NAME.\\n\\\n   copp-list NAME\\n\\\n-                            List all copp policies defined for control\\n\\\n+                            list all copp policies defined for control\\n\\\n                             protocols NAME.\\n\\\n   ls-copp-add NAME SWITCH\\n\\\n-                            Add a NAME copp policy on SWITCH logical switch.\\n\\\n+                            add a NAME copp policy on SWITCH logical switch.\\n\\\n   lr-copp-add NAME ROUTER\\n\\\n-                            Add a NAME copp policy on ROUTER logical router.\\n\\\n+                            add a NAME copp policy on ROUTER logical router.\\n\\\n \\n\\\n MAC_Binding commands:\\n\\\n+  [--may-exist]\\n\\\n   static-mac-binding-add LOGICAL_PORT IP MAC\\n\\\n-                                    Add a Static_MAC_Binding entry\\n\\\n+                                    add a Static_MAC_Binding entry\\n\\\n+  [--if-exists]\\n\\\n   static-mac-binding-del LOGICAL_PORT IP\\n\\\n-                                    Delete Static_MAC_Binding entry\\n\\\n-  static-mac-binding-list           List all Static_MAC_Binding entries\\n\\\n+                                    delete Static_MAC_Binding entry\\n\\\n+  static-mac-binding-list           list all Static_MAC_Binding entries\\n\\\n \\n\\\n Logical Switch Port Health Check:\\n\\\n-  lsp-hc-add PORT PROTOCOL SOURCE_IP DST_PORT ADDRESS...\\n\\\n+  lsp-hc-add PORT PROTOCOL SOURCE_IP [DST_PORT] ADDRESS\\n\\\n                             add health check monitoring for PORT\\n\\\n-  lsp-hc-del PORT HC_UUID   delete health check monitoring for PORT\\n\\\n+  lsp-hc-del PORT [HC_UUID] delete health check monitoring for PORT\\n\\\n   lsp-hc-list PORT          list health checks for PORT\\n\\\n \\n\\\n %s\\\n","prefixes":["ovs-dev","1/5"]}