The ct_lb action was deprecated for the 26.03 release, we can
safely remove it.

Assisted-by: Claude Opus 4.6, OpenCode
Signed-off-by: Ales Musil <[email protected]>
---
 NEWS                      |   1 +
 TODO.rst                  |   1 +
 br-controller/en-lflow.c  |   2 +-
 include/ovn/actions.h     |   4 +-
 lib/actions.c             |  36 ++--------
 lib/ovn-util.c            |   2 +-
 northd/northd.c           |   4 +-
 ovn-sb.xml                |  29 +++-----
 tests/ovn.at              | 145 ++++++++++++++++----------------------
 utilities/ovn-trace.8.xml |   6 +-
 utilities/ovn-trace.c     |  15 ++--
 11 files changed, 91 insertions(+), 154 deletions(-)

diff --git a/NEWS b/NEWS
index 8d88a9a9b..5782df27d 100644
--- a/NEWS
+++ b/NEWS
@@ -51,6 +51,7 @@ Post v26.03.0
      "ovn-ct-lb-related" feature flags. At the same time mark
      "mac-binding-timestamp", "fdb-timestamp" and "ls-dpg-column" feature
      flags as deprecated.
+   - Removed the deprecated "ct_lb" action.
 
 OVN v26.03.0 - xxx xx xxxx
 --------------------------
diff --git a/TODO.rst b/TODO.rst
index 75a99601d..beca38daf 100644
--- a/TODO.rst
+++ b/TODO.rst
@@ -207,6 +207,7 @@ when the feature/action will move from ``Deprecated`` to 
``Removed``.
   * ``OVN_FEATURE_PORT_UP_NOTIF`` feature.
   * ``OVN_FEATURE_CT_NO_MASKED_LABEL`` feature.
   * ``OVN_FEATURE_CT_LB_RELATED`` feature.
+  * ``ct_lb`` action.
 
 * 26.09 Deprecated
 
diff --git a/br-controller/en-lflow.c b/br-controller/en-lflow.c
index b73c36c4f..389137ecc 100644
--- a/br-controller/en-lflow.c
+++ b/br-controller/en-lflow.c
@@ -51,7 +51,7 @@ struct ed_type_lflow_output_data {
 
     /* Since we use the common action parsing code between ovn-controller
      * and br-controller, ovnacts_encode() expects to pass a
-     * group table and meter table for the actions - ct_lb, select, log and
+     * group table and meter table for the actions - ct_lb_*, select, log and
      * set_meter.  Until we have a separate action parsing definitions
      * for br-controller, we just maintain these tables and pass it in
      * the 'struct ovnact_encode_params' in the ovnact_encode() to make
diff --git a/include/ovn/actions.h b/include/ovn/actions.h
index 4473e3297..1d32998f7 100644
--- a/include/ovn/actions.h
+++ b/include/ovn/actions.h
@@ -73,7 +73,6 @@ struct collector_set_ids;
     OVNACT(CT_SNAT,           ovnact_ct_nat)          \
     OVNACT(CT_DNAT_IN_CZONE,  ovnact_ct_nat)          \
     OVNACT(CT_SNAT_IN_CZONE,  ovnact_ct_nat)          \
-    OVNACT(CT_LB,             ovnact_ct_lb)           \
     OVNACT(CT_LB_MARK,        ovnact_ct_lb)           \
     OVNACT(CT_LB_MARK_LOCAL,  ovnact_ct_lb)           \
     OVNACT(SELECT,            ovnact_select)          \
@@ -314,7 +313,6 @@ struct ovnact_ct_commit_to_zone {
 };
 
 enum ovnact_ct_lb_type {
-    OVNACT_CT_LB_TYPE_LABEL,
     OVNACT_CT_LB_TYPE_MARK,
     OVNACT_CT_LB_LOCAL_TYPE_MARK,
 };
@@ -335,7 +333,7 @@ struct ovnact_ct_lb_dst {
     char *port_name;
 };
 
-/* OVNACT_CT_LB/OVNACT_CT_LB_MARK. */
+/* OVNACT_CT_LB_MARK. */
 struct ovnact_ct_lb {
     struct ovnact ovnact;
     struct ovnact_ct_lb_dst *dsts;
diff --git a/lib/actions.c b/lib/actions.c
index e0291d535..256114e6e 100644
--- a/lib/actions.c
+++ b/lib/actions.c
@@ -1208,7 +1208,8 @@ parse_ct_lb_action(struct action_context *ctx,
                    enum ovnact_ct_lb_type type)
 {
     if (ctx->pp->cur_ltable >= ctx->pp->n_tables) {
-        lexer_error(ctx->lexer, "\"ct_lb\" action not allowed in last table.");
+        lexer_error(ctx->lexer, "\"ct_lb_*\" action not allowed "
+                    "in last table.");
         return;
     }
 
@@ -1329,9 +1330,6 @@ parse_ct_lb_action(struct action_context *ctx,
 
     struct ovnact_ct_lb *cl;
     switch (type) {
-        case OVNACT_CT_LB_TYPE_LABEL:
-            cl = ovnact_put_CT_LB(ctx->ovnacts);
-            break;
         case OVNACT_CT_LB_TYPE_MARK:
             cl = ovnact_put_CT_LB_MARK(ctx->ovnacts);
             break;
@@ -1354,7 +1352,6 @@ format_ct_lb(const struct ovnact_ct_lb *cl, struct ds *s,
              enum ovnact_ct_lb_type type)
 {
     static const char *const lb_action_strings[] = {
-        [OVNACT_CT_LB_TYPE_LABEL] = "ct_lb",
         [OVNACT_CT_LB_TYPE_MARK] = "ct_lb_mark",
         [OVNACT_CT_LB_LOCAL_TYPE_MARK] = "ct_lb_mark_local",
     };
@@ -1408,12 +1405,6 @@ format_ct_lb(const struct ovnact_ct_lb *cl, struct ds *s,
     ds_put_char(s, ';');
 }
 
-static void
-format_CT_LB(const struct ovnact_ct_lb *cl, struct ds *s)
-{
-    format_ct_lb(cl, s, OVNACT_CT_LB_TYPE_LABEL);
-}
-
 static void
 format_CT_LB_MARK(const struct ovnact_ct_lb *cl, struct ds *s)
 {
@@ -1434,7 +1425,7 @@ encode_ct_lb(const struct ovnact_ct_lb *cl,
 {
     uint8_t recirc_table = cl->ltable + first_ptable(ep, ep->pipeline);
     if (!cl->n_dsts) {
-        /* ct_lb without any destinations means that this is an established
+        /* ct_lb_* without any destinations means that this is an established
          * connection and we just need to do a NAT. */
         const size_t ct_offset = ofpacts->size;
 
@@ -1462,8 +1453,6 @@ encode_ct_lb(const struct ovnact_ct_lb *cl,
     struct ofpact_group *og;
     uint32_t zone_reg = ep->is_switch ? MFF_LOG_CT_ZONE - MFF_REG0
                             : MFF_LOG_DNAT_ZONE - MFF_REG0;
-    const char *flag_reg = (type == OVNACT_CT_LB_TYPE_LABEL)
-                            ? "ct_label" : "ct_mark";
 
     const char *ct_flag_value;
     switch (cl->ct_flag) {
@@ -1522,10 +1511,10 @@ encode_ct_lb(const struct ovnact_ct_lb *cl,
         ds_put_format(&ds, "),commit,table=%d,zone=NXM_NX_REG%d[0..15],"
                       "exec(set_field:"
                         OVN_CT_MASKED_STR(OVN_CT_NATTED)
-                      "->%s",
-                      recirc_table, zone_reg, flag_reg);
+                      "->ct_mark",
+                      recirc_table, zone_reg);
         if (ct_flag_value) {
-            ds_put_format(&ds, ",set_field:%s->%s", ct_flag_value, flag_reg);
+            ds_put_format(&ds, ",set_field:%s->ct_mark", ct_flag_value);
         }
 
         ds_put_cstr(&ds, "))");
@@ -1549,14 +1538,6 @@ encode_ct_lb(const struct ovnact_ct_lb *cl,
     og->group_id = table_id;
 }
 
-static void
-encode_CT_LB(const struct ovnact_ct_lb *cl,
-             const struct ovnact_encode_params *ep,
-             struct ofpbuf *ofpacts)
-{
-    encode_ct_lb(cl, ep, ofpacts, OVNACT_CT_LB_TYPE_LABEL);
-}
-
 static void
 encode_CT_LB_MARK(const struct ovnact_ct_lb *cl,
                   const struct ovnact_encode_params *ep,
@@ -6042,7 +6023,6 @@ parse_action(struct action_context *ctx)
         return false;
     }
 
-    static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
     enum lex_type lookahead = lexer_lookahead(ctx->lexer);
     if (lookahead == LEX_T_EQUALS || lookahead == LEX_T_EXCHANGE
         || lookahead == LEX_T_LSQUARE) {
@@ -6071,10 +6051,6 @@ parse_action(struct action_context *ctx)
         parse_CT_DNAT_IN_CZONE(ctx);
     } else if (lexer_match_id(ctx->lexer, "ct_snat_in_czone")) {
         parse_CT_SNAT_IN_CZONE(ctx);
-    } else if (lexer_match_id(ctx->lexer, "ct_lb")) {
-        VLOG_WARN_RL(&rl, "The \"ct_lb\" action is deprecated please "
-                          "consider using a different action.");
-        parse_ct_lb_action(ctx, OVNACT_CT_LB_TYPE_LABEL);
     } else if (lexer_match_id(ctx->lexer, "ct_lb_mark")) {
         parse_ct_lb_action(ctx, OVNACT_CT_LB_TYPE_MARK);
     } else if (lexer_match_id(ctx->lexer, "ct_lb_mark_local")) {
diff --git a/lib/ovn-util.c b/lib/ovn-util.c
index 3a26e7689..80346d5bb 100644
--- a/lib/ovn-util.c
+++ b/lib/ovn-util.c
@@ -1007,7 +1007,7 @@ ip_address_and_port_from_lb_key(const char *key, char 
**ip_address,
  *
  * NOTE: If OVN_NORTHD_PIPELINE_CSUM is updated make sure to double check
  * whether an update of OVN_INTERNAL_MINOR_VER is required. */
-#define OVN_NORTHD_PIPELINE_CSUM "826401206 11374"
+#define OVN_NORTHD_PIPELINE_CSUM "118971668 11318"
 #define OVN_INTERNAL_MINOR_VER 15
 
 /* Returns the OVN version. The caller must free the returned value. */
diff --git a/northd/northd.c b/northd/northd.c
index aa332c449..ee45de3db 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -13314,11 +13314,11 @@ build_lrouter_flows_for_lb_stateless(struct 
lrouter_nat_lb_flows_ctx *ctx,
      * IP action to perform stateless NAT pipeline completely when the
      * outgoing packet is redirected to a chassis that does not have an
      * active conntrack entry. Otherwise, it will not be SNATed by the
-     * ct_lb action because it does not refer to a valid created flow. The
+     * ct_lb_mark action because it does not refer to a valid created flow. The
      * use case for responding to a packet in different chassis is multipath
      * via ECMP. So, the LB lr_out_snat is created with a lower priority than
      * the other router pipeline entries, in this case, if the packet is not
-     * SNATed by ct_lb (conntrack lost), it will be SNATed by the LB
+     * SNATed by ct_lb_mark (conntrack lost), it will be SNATed by the LB
      * stateless NAT rule. Also, SNAT is performed only when the packet
      * matches the configured LB backend IPs, ports and protocols. Otherwise,
      * the packet will be forwarded without being SNATed.
diff --git a/ovn-sb.xml b/ovn-sb.xml
index 2bb375f89..0d3ec6c2c 100644
--- a/ovn-sb.xml
+++ b/ovn-sb.xml
@@ -1138,7 +1138,7 @@
           </ul>
           <p>
             The <code>ct_dnat</code>, <code>ct_snat</code>, and
-            <code>ct_lb</code> actions initialize the following subfields:
+            <code>ct_lb_mark</code> actions initialize the following subfields:
           </p>
           <ul>
             <li>
@@ -2128,11 +2128,11 @@
           <p><b>Example:</b> <code>set_queue(10);</code></p>
         </dd>
 
-        <dt><code>ct_lb;</code></dt>
-        <dt><code>ct_lb(backends=<var>ip</var>[:<var>port</var>][,...][; 
hash_fields=<var>field1</var>,<var>field2</var>,...][; ct_flag]);</code></dt>
+        <dt><code>ct_lb_mark;</code></dt>
+        <dt><code>ct_lb_mark(backends=<var>ip</var>[:<var>port</var>][,...][; 
hash_fields=<var>field1</var>,<var>field2</var>,...][; ct_flag]);</code></dt>
         <dd>
           <p>
-            With arguments, <code>ct_lb</code> commits the packet
+            With arguments, <code>ct_lb_mark</code> commits the packet
             to the connection tracking table and DNATs the packet's destination
             IP address (and port) to the IP address or addresses (and optional
             ports) specified in the <code>backends</code>.  If multiple
@@ -2144,15 +2144,16 @@
             listed are used as the hash fields. The <code>ct_flag</code>
             field represents one of supported flag: <code>skip_snat</code> or
             <code>force_snat</code>, this flag will be stored in
-            <code>ct_label</code> register.
+            <code>ct_mark</code> register.
           </p>
           <p>
-            Without arguments, <code>ct_lb</code> sends the packet to the
+            Without arguments, <code>ct_lb_mark</code> sends the packet to the
             connection tracking table to NAT the packets.  If the packet is
             part of an established connection that was previously committed to
-            the connection tracker via <code>ct_lb(</code>...<code>)</code>, it
-            will automatically get DNATed to the same IP address as the first
-            packet in that connection.
+            the connection tracker via
+            <code>ct_lb_mark(</code>...<code>)</code>, it will automatically
+            get DNATed to the same IP address as the first packet in that
+            connection.
           </p>
           <p>
             Processing automatically moves on to the next table,
@@ -2165,16 +2166,6 @@
           </p>
         </dd>
 
-        <dt><code>ct_lb_mark;</code></dt>
-        <dt><code>ct_lb_mark(backends=<var>ip</var>[:<var>port</var>][,...][; 
hash_fields=<var>field1</var>,<var>field2</var>,...][; ct_flag]);</code></dt>
-        <dd>
-          <p>
-              Same as <code>ct_lb</code>, except that it internally uses 
ct_mark
-              to store the NAT flag, while <code>ct_lb</code> uses ct_label for
-              the same purpose.
-          </p>
-        </dd>
-
         <dt><code>ct_lb_mark_local;</code></dt>
         
<dt><code>ct_lb_mark_local(backends=<var>lport_name</var>[<var>ip</var>[:<var>port</var>][,...][;
 hash_fields=<var>field1</var>,<var>field2</var>,...][; ct_flag]);</code></dt>
         <dd>
diff --git a/tests/ovn.at b/tests/ovn.at
index c6be58288..e414e4318 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -1011,104 +1011,79 @@ pkt.mark = "foo";
     Integer field pkt.mark is not compatible with string constant.
 
 # load balancing.
-ct_lb;
+ct_lb_mark;
     encodes as ct(table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],nat)
     has prereqs ip
-ct_lb();
-    formats as ct_lb;
+ct_lb_mark();
+    formats as ct_lb_mark;
     encodes as ct(table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],nat)
     has prereqs ip
-ct_clear; ct_lb; reg8[[7]] = 1;
+ct_clear; ct_lb_mark; reg8[[7]] = 1;
     encodes as 
ct_clear,ct(table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],nat),set_field:0x8000000000/0x8000000000->xreg4
     has prereqs ip
-ct_lb(192.168.1.2:80, 192.168.1.3:80);
+ct_lb_mark(192.168.1.2:80, 192.168.1.3:80);
     Syntax error at `192.168.1.2' expecting backends.
-ct_lb(backends=192.168.1.2:80,192.168.1.3:80);
+ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80);
     encodes as group:1
-    uses group: id(1), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)))
+    uses group: id(1), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
-ct_lb(backends=192.168.1.2:80,192.168.1.3:80; skip_snat);
+ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; skip_snat);
     encodes as group:2
-    uses group: id(2), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label,set_field:4/4->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label,set_field:4/4->ct_label)))
+    uses group: id(2), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:4/4->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:4/4->ct_mark)))
     has prereqs ip
-ct_lb(backends=192.168.1.2:80,192.168.1.3:80; force_snat);
+ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; force_snat);
     encodes as group:3
-    uses group: id(3), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label,set_field:8/8->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label,set_field:8/8->ct_label)))
+    uses group: id(3), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:8/8->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:8/8->ct_mark)))
     has prereqs ip
-ct_lb(backends=192.168.1.2, 192.168.1.3, );
-    formats as ct_lb(backends=192.168.1.2,192.168.1.3);
+ct_lb_mark(backends=192.168.1.2, 192.168.1.3, );
+    formats as ct_lb_mark(backends=192.168.1.2,192.168.1.3);
     encodes as group:4
-    uses group: id(4), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)))
+    uses group: id(4), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
-ct_lb(backends=fd0f::2, fd0f::3, );
-    formats as ct_lb(backends=fd0f::2,fd0f::3);
+ct_lb_mark(backends=fd0f::2, fd0f::3, );
+    formats as ct_lb_mark(backends=fd0f::2,fd0f::3);
     encodes as group:5
-    uses group: id(5), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)))
+    uses group: id(5), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
 
-ct_lb(backends=192.168.1.2:);
+ct_lb_mark(backends=192.168.1.2:);
     Syntax error at `)' expecting port number.
-ct_lb(backends=192.168.1.2:123456);
+ct_lb_mark(backends=192.168.1.2:123456);
     Syntax error at `123456' expecting port number.
-ct_lb(backends=foo);
+ct_lb_mark(backends=foo);
     Syntax error at `foo' expecting IP address.
-ct_lb(backends=[[192.168.1.2]]);
+ct_lb_mark(backends=[[192.168.1.2]]);
     Syntax error at `192.168.1.2' expecting IPv6 address.
 
-ct_lb(backends=192.168.1.2:80,192.168.1.3:80; 
hash_fields=eth_src,eth_dst,ip_src);
+ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; 
hash_fields=eth_src,eth_dst,ip_src);
     Syntax error at `eth_src' invalid hash_fields.
-ct_lb(backends=192.168.1.2:80,192.168.1.3:80; 
hash_fields="eth_src,eth_dst,ip_src");
+ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; 
hash_fields="eth_src,eth_dst,ip_src");
     encodes as group:6
-    uses group: id(6), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)))
+    uses group: id(6), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
-ct_lb(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,tp_src,tp_dst");
+ct_lb_mark(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,tp_src,tp_dst");
     encodes as group:7
-    uses group: id(7), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,tp_src,tp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)))
+    uses group: id(7), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,tp_src,tp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
-ct_lb(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,tcp_src,tcp_dst");
+ct_lb_mark(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,tcp_src,tcp_dst");
     encodes as group:8
-    uses group: id(8), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,tcp_src,tcp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)))
+    uses group: id(8), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,tcp_src,tcp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
-ct_lb(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,udp_src,udp_dst");
+ct_lb_mark(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,udp_src,udp_dst");
     encodes as group:9
-    uses group: id(9), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,udp_src,udp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)))
+    uses group: id(9), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,udp_src,udp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
-ct_lb(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst");
+ct_lb_mark(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst");
     encodes as group:10
-    uses group: id(10), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label)))
+    uses group: id(10), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
-ct_lb(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst"; skip_snat);
+ct_lb_mark(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst"; skip_snat);
     encodes as group:11
-    uses group: id(11), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label,set_field:4/4->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label,set_field:4/4->ct_label)))
+    uses group: id(11), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:4/4->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:4/4->ct_mark)))
     has prereqs ip
-ct_lb(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst"; force_snat);
+ct_lb_mark(backends=fd0f::2,fd0f::3; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst"; force_snat);
     encodes as group:12
-    uses group: id(12), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label,set_field:8/8->ct_label)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_label,set_field:8/8->ct_label)))
-    has prereqs ip
-
-ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80);
-    encodes as group:13
-    uses group: id(13), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
-    has prereqs ip
-ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; skip_snat);
-    encodes as group:14
-    uses group: id(14), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:4/4->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:4/4->ct_mark)))
-    has prereqs ip
-ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; force_snat);
-    encodes as group:15
-    uses group: id(15), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:8/8->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:8/8->ct_mark)))
-    has prereqs ip
-ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst");
-    encodes as group:16
-    uses group: id(16), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
-    has prereqs ip
-ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst"; skip_snat);
-    encodes as group:17
-    uses group: id(17), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:4/4->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:4/4->ct_mark)))
-    has prereqs ip
-ct_lb_mark(backends=192.168.1.2:80,192.168.1.3:80; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst"; force_snat);
-    encodes as group:18
-    uses group: id(18), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.1.2:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:8/8->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=192.168.1.3:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:8/8->ct_mark)))
+    uses group: id(12), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:8/8->ct_mark)),bucket=bucket_id=1,weight:100,actions=ct(nat(dst=fd0f::3),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark,set_field:8/8->ct_mark)))
     has prereqs ip
 
 # ct_next
@@ -1975,23 +1950,23 @@ handle_svc_check(reg0);
 # select
 reg9[[16..31]] = select(1=50, 2=100, 3, );
     formats as reg9[[16..31]] = select(1=50, 2=100, 3=100);
-    encodes as group:19
-    uses group: id(19), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:50,actions=load:1->xreg4[[16..31]],resubmit(,oflow_in_table),bucket=bucket_id=1,weight:100,actions=load:2->xreg4[[16..31]],resubmit(,oflow_in_table),bucket=bucket_id=2,weight:100,actions=load:3->xreg4[[16..31]],resubmit(,oflow_in_table))
+    encodes as group:13
+    uses group: id(13), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:50,actions=load:1->xreg4[[16..31]],resubmit(,oflow_in_table),bucket=bucket_id=1,weight:100,actions=load:2->xreg4[[16..31]],resubmit(,oflow_in_table),bucket=bucket_id=2,weight:100,actions=load:3->xreg4[[16..31]],resubmit(,oflow_in_table))
 
 reg0 = select(1, 2);
     formats as reg0 = select(1=100, 2=100);
-    encodes as group:20
-    uses group: id(20), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=load:1->xxreg0[[96..127]],resubmit(,oflow_in_table),bucket=bucket_id=1,weight:100,actions=load:2->xxreg0[[96..127]],resubmit(,oflow_in_table))
+    encodes as group:14
+    uses group: id(14), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=load:1->xxreg0[[96..127]],resubmit(,oflow_in_table),bucket=bucket_id=1,weight:100,actions=load:2->xxreg0[[96..127]],resubmit(,oflow_in_table))
 
 reg9[[16..31]] = select(values=(1=50, 2=100, 3); hash_fields="ip_src,ip_dst");
     formats as reg9[[16..31]] = select(values=(1=50, 2=100, 3=100); 
hash_fields="ip_src,ip_dst");
-    encodes as group:21
-    uses group: id(21), 
name(type=select,selection_method=hash,fields(ip_src,ip_dst),bucket=bucket_id=0,weight:50,actions=load:1->xreg4[[16..31]],resubmit(,oflow_in_table),bucket=bucket_id=1,weight:100,actions=load:2->xreg4[[16..31]],resubmit(,oflow_in_table),bucket=bucket_id=2,weight:100,actions=load:3->xreg4[[16..31]],resubmit(,oflow_in_table))
+    encodes as group:15
+    uses group: id(15), 
name(type=select,selection_method=hash,fields(ip_src,ip_dst),bucket=bucket_id=0,weight:50,actions=load:1->xreg4[[16..31]],resubmit(,oflow_in_table),bucket=bucket_id=1,weight:100,actions=load:2->xreg4[[16..31]],resubmit(,oflow_in_table),bucket=bucket_id=2,weight:100,actions=load:3->xreg4[[16..31]],resubmit(,oflow_in_table))
 
 reg0 = select(values=(1, 2); hash_fields="ip_dst,ip_src");
     formats as reg0 = select(values=(1=100, 2=100); 
hash_fields="ip_dst,ip_src");
-    encodes as group:22
-    uses group: id(22), 
name(type=select,selection_method=hash,fields(ip_dst,ip_src),bucket=bucket_id=0,weight:100,actions=load:1->xxreg0[[96..127]],resubmit(,oflow_in_table),bucket=bucket_id=1,weight:100,actions=load:2->xxreg0[[96..127]],resubmit(,oflow_in_table))
+    encodes as group:16
+    uses group: id(16), 
name(type=select,selection_method=hash,fields(ip_dst,ip_src),bucket=bucket_id=0,weight:100,actions=load:1->xxreg0[[96..127]],resubmit(,oflow_in_table),bucket=bucket_id=1,weight:100,actions=load:2->xxreg0[[96..127]],resubmit(,oflow_in_table))
 
 reg0 = select(1=, 2);
     Syntax error at `,' expecting weight.
@@ -2016,12 +1991,12 @@ reg0[[0..14]] = select(1, 2, 3);
 
 fwd_group(liveness=true, childports="eth0", "lsp1");
     formats as fwd_group(liveness="true", childports="eth0", "lsp1");
-    encodes as group:23
-    uses group: id(23), 
name(type=select,selection_method=dp_hash,bucket=watch_port:5,load=0x5->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT),bucket=watch_port:17,load=0x17->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT))
+    encodes as group:17
+    uses group: id(17), 
name(type=select,selection_method=dp_hash,bucket=watch_port:5,load=0x5->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT),bucket=watch_port:17,load=0x17->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT))
 
 fwd_group(childports="eth0", "lsp1");
-    encodes as group:24
-    uses group: id(24), 
name(type=select,selection_method=dp_hash,bucket=load=0x5->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT),bucket=load=0x17->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT))
+    encodes as group:18
+    uses group: id(18), 
name(type=select,selection_method=dp_hash,bucket=load=0x5->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT),bucket=load=0x17->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT))
 
 fwd_group(childports=eth0);
     Syntax error at `eth0' expecting logical switch port.
@@ -2030,8 +2005,8 @@ fwd_group();
     Syntax error at `)' expecting `;'.
 
 fwd_group(childports="eth0", "lsp1");
-    encodes as group:24
-    uses group: id(24), 
name(type=select,selection_method=dp_hash,bucket=load=0x5->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT),bucket=load=0x17->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT))
+    encodes as group:18
+    uses group: id(18), 
name(type=select,selection_method=dp_hash,bucket=load=0x5->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT),bucket=load=0x17->NXM_NX_REG15[[0..15]],resubmit(,OFTABLE_SAVE_INPORT))
 
 fwd_group(liveness=xyzzy, childports="eth0", "lsp1");
     Syntax error at `xyzzy' expecting true or false.
@@ -2416,18 +2391,18 @@ mirror(lsp1);
     Syntax error at `lsp1' expecting port name string.
 
 ct_lb_mark_local(backends="lsp1":192.168.0.101);
-    encodes as group:25
-    uses group: id(25), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.0.101),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
+    encodes as group:19
+    uses group: id(19), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.0.101),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
 
 ct_lb_mark_local(backends="lsp1":192.168.0.101:10880);
-    encodes as group:26
-    uses group: id(26), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.0.101:10880),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
+    encodes as group:20
+    uses group: id(20), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.0.101:10880),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
 
 ct_lb_mark_local(backends="lsp1":192.168.0.101:10880; 
hash_fields="eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst");
-    encodes as group:27
-    uses group: id(27), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.0.101:10880),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
+    encodes as group:21
+    uses group: id(21), 
name(type=select,selection_method=hash,fields(eth_src,eth_dst,ip_src,ip_dst,sctp_src,sctp_dst),bucket=bucket_id=0,weight:100,actions=ct(nat(dst=192.168.0.101:10880),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
 
 ct_lb_mark_local(backends=192.168.0.101:80);
@@ -2438,13 +2413,13 @@ ct_lb_mark_local(backends=lsp1:192.168.0.101:10880);
 
 # add hash fields parsing
 ct_lb_mark_local(backends="lsp1":fd0f::2);
-    encodes as group:28
-    uses group: id(28), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
+    encodes as group:22
+    uses group: id(22), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=fd0f::2),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
 
 ct_lb_mark_local(backends="lsp1":[[fd0f::2]]:80);
-    encodes as group:29
-    uses group: id(29), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=[[fd0f::2]]:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
+    encodes as group:23
+    uses group: id(23), 
name(type=select,selection_method=dp_hash,bucket=bucket_id=0,weight:100,actions=ct(nat(dst=[[fd0f::2]]:80),commit,table=oflow_in_table,zone=NXM_NX_REG13[[0..15]],exec(set_field:2/2->ct_mark)))
     has prereqs ip
 
 # Miscellaneous negative tests.
diff --git a/utilities/ovn-trace.8.xml b/utilities/ovn-trace.8.xml
index d017a943e..a608bb1f1 100644
--- a/utilities/ovn-trace.8.xml
+++ b/utilities/ovn-trace.8.xml
@@ -255,8 +255,8 @@
       <code>ct_snat</code>) action.
     </dd>
 
-    <dt><code>ct_lb;</code></dt>
-    
<dt><code>ct_lb(<var>ip</var></code>[<code>:<var>port</var></code>]...<code>);</code></dt>
+    <dt><code>ct_lb_mark;</code></dt>
+    
<dt><code>ct_lb_mark(<var>ip</var></code>[<code>:<var>port</var></code>]...<code>);</code></dt>
     <dd>
       Forks the pipeline. In one fork, sets <code>ip4.dst</code> (or
       <code>ip6.dst</code>) to one of the load-balancer addresses and the
@@ -265,7 +265,7 @@
       to the address specified on <code>--lb-dst</code>, if any; without
       arguments, uses the address and port specified on <code>--lb-dst</code>.
       In the other fork, the pipeline continues without change after the
-      <code>ct_lb</code> action.
+      <code>ct_lb_mark</code> action.
     </dd>
 
     <dt><code>ct_commit</code></dt>
diff --git a/utilities/ovn-trace.c b/utilities/ovn-trace.c
index c0e04262c..e928ccbc0 100644
--- a/utilities/ovn-trace.c
+++ b/utilities/ovn-trace.c
@@ -2656,7 +2656,7 @@ execute_ct_lb(const struct ovnact_ct_lb *ct_lb,
     if (family != AF_UNSPEC) {
         const struct ovnact_ct_lb_dst *dst = NULL;
         if (ct_lb->n_dsts) {
-            /* For ct_lb with addresses, choose one of the addresses. */
+            /* For ct_lb_* with addresses, choose one of the addresses. */
             int n = 0;
             for (int i = 0; i < ct_lb->n_dsts; i++) {
                 const struct ovnact_ct_lb_dst *d = &ct_lb->dsts[i];
@@ -2686,7 +2686,7 @@ execute_ct_lb(const struct ovnact_ct_lb *ct_lb,
                                      "(use --lb-dst)");
             }
         } else if (lb_dst.family == family) {
-            /* For ct_lb without addresses, use user-specified address. */
+            /* For ct_lb_* without addresses, use user-specified address. */
             dst = &lb_dst;
         }
 
@@ -2708,10 +2708,9 @@ execute_ct_lb(const struct ovnact_ct_lb *ct_lb,
     }
 
     const char *action_type =
-        ct_lb->ovnact.type == OVNACT_CT_LB_MARK ? "ct_lb_mark" :
-        ct_lb->ovnact.type == OVNACT_CT_LB_MARK_LOCAL ? "ct_lb_mark_local" :
-        "ct_lb";
-
+        ct_lb->ovnact.type == OVNACT_CT_LB_MARK
+                              ? "ct_lb_mark"
+                              : "ct_lb_mark_local";
     struct ovntrace_node *node = ovntrace_node_append(
         super, OVNTRACE_NODE_TRANSFORMATION, "%s%s", action_type,
         ds_cstr_ro(&comment));
@@ -3361,10 +3360,6 @@ trace_actions(const struct ovnact *ovnacts, size_t 
ovnacts_len,
                            pipeline, super);
             break;
 
-        case OVNACT_CT_LB:
-            execute_ct_lb(ovnact_get_CT_LB(a), dp, uflow, pipeline, super);
-            break;
-
         case OVNACT_CT_LB_MARK:
             execute_ct_lb(ovnact_get_CT_LB_MARK(a), dp, uflow, pipeline,
                           super);
-- 
2.54.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to