On Thu, Aug 27, 2026 at 11:50 PM Mark Michelson via dev <
[email protected]> wrote:

> Commit 506f7d4bcfbc ("northd: rely on new actions for ecmp-symmetric
> routing") introduced northd usage of the chk_ecmp_nh, chk_ecmp_nh_mac,
> and commit_ecmp_nh actions. Commit 23fdc5fe43b3 ("northd: Always ct
> commit ECMP symmetric traffic in the original direction.") removed the
> usage of these actions by northd. In the latter commit, it is
> specifically noted that the actions' implementations were left alone,
> since there was a possibility of a newer ovn-controller being used with
> an older ovn-northd that still programmed those actions.
>
> That latter commit was made in September of 2023. Since then, we have
> released two LTS versions of OVN. This should safely allow for us to
> remove these actions from the code entirely. This commit removes the
> actions' implementations as well as the documentation for these actions.
>
> Signed-off-by: Mark Michelson <[email protected]>
> ---
> v3 -> v4:
>   Removed the gap in the constants defined in lflow.h. Also updated
>   ovn-macros.m4 to have correct table constants.
> ---
>

Hi Mark,

sorry I didn't notice that on v3, there are still
refrences to OFTABLE_ECMP_NH_MAC and
OFTABLE_ECMP_NH in system-ovn.at, the
test needs to be adjusted. Also the ovn-logical-flows.7.rst
has a reference to the removed actions.

It seems that you have missed my comment on v3
about dropping the note in the TODO.rst where
we have removed/deprecated section.

 NEWS                         |   2 +
>  controller/lflow.h           |  28 ++-
>  include/ovn/actions.h        |  10 --
>  include/ovn/logical-fields.h |   7 +-
>  lib/actions.c                | 331 -----------------------------------
>  lib/ovn-util.c               |   2 +-
>  ovn-sb.xml                   |  52 ------
>  tests/ovn-macros.at          |  28 ++-
>  tests/ovn.at                 |  20 ---
>  utilities/ovn-trace.c        |   6 -
>  10 files changed, 33 insertions(+), 453 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index c40fd2108..f93bf30e2 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -1,5 +1,7 @@
>  Post v26.09.0
>  --------------
> +   - Removed implementations of the commit_ecmp_nh, chk_ecmp_nh, and
> +     chk_ecmp_nh_mac actions from the code.
>     - Mark tunnel ports as transient (other_config:transient=true) when the
>       local chassis is a member of an HA chassis group.
>       Systems which invoke ovs-ctl --delete-transient-ports during OVS
> startup
> diff --git a/controller/lflow.h b/controller/lflow.h
> index 33b8deeba..ca84f3753 100644
> --- a/controller/lflow.h
> +++ b/controller/lflow.h
> @@ -91,21 +91,19 @@ struct uuid;
>  #define OFTABLE_CHK_IN_PORT_SEC            97
>  #define OFTABLE_CHK_IN_PORT_SEC_ND         98
>  #define OFTABLE_CHK_OUT_PORT_SEC           99
> -#define OFTABLE_ECMP_NH_MAC               100
> -#define OFTABLE_ECMP_NH                   101
> -#define OFTABLE_CHK_LB_AFFINITY           102
> -#define OFTABLE_MAC_CACHE_USE             103
> -#define OFTABLE_CT_ZONE_LOOKUP            104
> -#define OFTABLE_CT_ORIG_NW_DST_LOAD       105
> -#define OFTABLE_CT_ORIG_IP6_DST_LOAD      106
> -#define OFTABLE_CT_ORIG_TP_DST_LOAD       107
> -#define OFTABLE_FLOOD_REMOTE_CHASSIS      108
> -#define OFTABLE_CT_STATE_SAVE             109
> -#define OFTABLE_CT_ORIG_PROTO_LOAD        110
> -#define OFTABLE_GET_REMOTE_FDB            111
> -#define OFTABLE_LEARN_REMOTE_FDB          112
> -#define OFTABLE_EVPN_ARP_LOOKUP           113
> -#define OFTABLE_NF_ORIG_INPORT_LEARN      114
> +#define OFTABLE_CHK_LB_AFFINITY           100
> +#define OFTABLE_MAC_CACHE_USE             101
> +#define OFTABLE_CT_ZONE_LOOKUP            102
> +#define OFTABLE_CT_ORIG_NW_DST_LOAD       103
> +#define OFTABLE_CT_ORIG_IP6_DST_LOAD      104
> +#define OFTABLE_CT_ORIG_TP_DST_LOAD       105
> +#define OFTABLE_FLOOD_REMOTE_CHASSIS      106
> +#define OFTABLE_CT_STATE_SAVE             107
> +#define OFTABLE_CT_ORIG_PROTO_LOAD        108
> +#define OFTABLE_GET_REMOTE_FDB            109
> +#define OFTABLE_LEARN_REMOTE_FDB          110
> +#define OFTABLE_EVPN_ARP_LOOKUP           111
> +#define OFTABLE_NF_ORIG_INPORT_LEARN      112
>
>  /* Verify that table regions do not overlap. */
>  BUILD_ASSERT_DECL(OFTABLE_LOG_INGRESS_PIPELINE + LOG_PIPELINE_INGRESS_LEN
> diff --git a/include/ovn/actions.h b/include/ovn/actions.h
> index 7d0ed63bc..7def8917e 100644
> --- a/include/ovn/actions.h
> +++ b/include/ovn/actions.h
> @@ -125,9 +125,6 @@ struct collector_set_ids;
>      OVNACT(LOOKUP_FDB,        ovnact_lookup_fdb)      \
>      OVNACT(CHECK_IN_PORT_SEC,  ovnact_result)         \
>      OVNACT(CHECK_OUT_PORT_SEC, ovnact_result)         \
> -    OVNACT(COMMIT_ECMP_NH,    ovnact_commit_ecmp_nh)  \
> -    OVNACT(CHK_ECMP_NH_MAC,   ovnact_result)          \
> -    OVNACT(CHK_ECMP_NH,       ovnact_result)          \
>      OVNACT(COMMIT_LB_AFF,     ovnact_commit_lb_aff)   \
>      OVNACT(CHK_LB_AFF,        ovnact_result)          \
>      OVNACT(SAMPLE,            ovnact_sample)          \
> @@ -541,13 +538,6 @@ struct ovnact_sample {
>      bool use_cookie;                    /* use cookie as obs_point_id */
>  };
>
> -/* OVNACT_COMMIT_ECMP_NH. */
> -struct ovnact_commit_ecmp_nh {
> -    struct ovnact ovnact;
> -    bool ipv6;
> -    uint8_t proto;
> -};
> -
>  /* OVNACT_COMMIT_LB_AFF. */
>  struct ovnact_commit_lb_aff {
>      struct ovnact ovnact;
> diff --git a/include/ovn/logical-fields.h b/include/ovn/logical-fields.h
> index e95dee316..de81a7fe2 100644
> --- a/include/ovn/logical-fields.h
> +++ b/include/ovn/logical-fields.h
> @@ -127,7 +127,10 @@ enum mff_log_flags_bits {
>      MLF_LOCALPORT_BIT = 10,
>      MLF_USE_SNAT_ZONE = 11,
>      MLF_CHECK_PORT_SEC_BIT = 12,
> -    MLF_LOOKUP_COMMIT_ECMP_NH_BIT = 13,
> +    /* Gap at 13, formerly used for COMMIT_ECMP_NH_BIT.
> +     * This gap needs to be maintained for compatibility
> +     * purposes between older and new OVN versions.
> +     */
>      MLF_USE_LB_AFF_SESSION_BIT = 14,
>      MLF_LOCALNET_BIT = 15,
>      MLF_RX_FROM_TUNNEL_BIT = 16,
> @@ -187,8 +190,6 @@ enum mff_log_flags {
>      /* Indicate the packet has been received from a localport */
>      MLF_LOCALPORT = (1 << MLF_LOCALPORT_BIT),
>
> -    MLF_LOOKUP_COMMIT_ECMP_NH = (1 << MLF_LOOKUP_COMMIT_ECMP_NH_BIT),
> -
>      MLF_USE_LB_AFF_SESSION = (1 << MLF_USE_LB_AFF_SESSION_BIT),
>
>      /* Indicate that the port is localnet. */
> diff --git a/lib/actions.c b/lib/actions.c
> index 77b053361..0e95e2d70 100644
> --- a/lib/actions.c
> +++ b/lib/actions.c
> @@ -5078,327 +5078,6 @@ ovnact_sample_free(struct ovnact_sample *sample
> OVS_UNUSED)
>  {
>  }
>
> -static void
> -parse_commit_ecmp_nh(struct action_context *ctx,
> -                     struct ovnact_commit_ecmp_nh *ecmp_nh)
> -{
> -    uint8_t proto;
> -    bool ipv6;
> -
> -    lexer_force_match(ctx->lexer, LEX_T_LPAREN); /* Skip '('. */
> -    if (!lexer_match_id(ctx->lexer, "ipv6")) {
> -        lexer_syntax_error(ctx->lexer, "invalid parameter");
> -        return;
> -    }
> -    if (!lexer_force_match(ctx->lexer, LEX_T_EQUALS)) {
> -        lexer_syntax_error(ctx->lexer, "invalid parameter");
> -        return;
> -    }
> -    if (lexer_match_string(ctx->lexer, "true") ||
> -        lexer_match_id(ctx->lexer, "true")) {
> -        ipv6 = true;
> -    } else if (lexer_match_string(ctx->lexer, "false") ||
> -               lexer_match_id(ctx->lexer, "false")) {
> -        ipv6 = false;
> -    } else {
> -        lexer_syntax_error(ctx->lexer,
> -                           "expecting true or false");
> -        return;
> -    }
> -
> -    lexer_force_match(ctx->lexer, LEX_T_COMMA);
> -
> -    if (!lexer_match_id(ctx->lexer, "proto")) {
> -        lexer_syntax_error(ctx->lexer, "invalid parameter");
> -        return;
> -    }
> -    if (!lexer_force_match(ctx->lexer, LEX_T_EQUALS)) {
> -        lexer_syntax_error(ctx->lexer, "invalid parameter");
> -        return;
> -    }
> -    if (lexer_match_id(ctx->lexer, "tcp")) {
> -        proto = IPPROTO_TCP;
> -    } else if (lexer_match_id(ctx->lexer, "udp")) {
> -        proto = IPPROTO_UDP;
> -    } else if (lexer_match_id(ctx->lexer, "sctp")) {
> -        proto = IPPROTO_SCTP;
> -    } else {
> -        lexer_syntax_error(ctx->lexer, "invalid protocol");
> -        return;
> -    }
> -
> -    lexer_force_match(ctx->lexer, LEX_T_RPAREN); /* Skip ')'. */
> -
> -    ecmp_nh->proto = proto;
> -    ecmp_nh->ipv6 = ipv6;
> -}
> -
> -static void
> -format_COMMIT_ECMP_NH(const struct ovnact_commit_ecmp_nh *ecmp_nh,
> -                      struct ds *s)
> -{
> -    const char *proto;
> -
> -    switch (ecmp_nh->proto) {
> -    case IPPROTO_UDP:
> -        proto = "udp";
> -        break;
> -    case IPPROTO_SCTP:
> -        proto = "sctp";
> -        break;
> -    case IPPROTO_TCP:
> -    default:
> -        proto = "tcp";
> -        break;
> -    }
> -    ds_put_format(s, "commit_ecmp_nh(ipv6 = %s, proto = %s);",
> -                  ecmp_nh->ipv6 ? "true" : "false", proto);
> -}
> -
> -static void
> -ovnact_commit_ecmp_nh_free(struct ovnact_commit_ecmp_nh *ecmp_nh
> OVS_UNUSED)
> -{
> -}
> -
> -static void
> -commit_ecmp_learn_action(struct ofpbuf *ofpacts, bool nw_conn,
> -                         bool ipv6, uint8_t proto)
> -{
> -    struct ofpact_learn *ol = ofpact_put_LEARN(ofpacts);
> -    struct match match = MATCH_CATCHALL_INITIALIZER;
> -    struct ofpact_learn_spec *ol_spec;
> -    unsigned int imm_bytes;
> -    uint8_t *src_imm;
> -
> -    ol->flags = NX_LEARN_F_DELETE_LEARNED;
> -    ol->idle_timeout = 20; /* seconds. */
> -    ol->hard_timeout = 30; /* seconds. */
> -    ol->priority = OFP_DEFAULT_PRIORITY;
> -    ol->table_id = nw_conn ? OFTABLE_ECMP_NH_MAC : OFTABLE_ECMP_NH;
> -
> -    /* Match on metadata of the packet that created the new table. */
> -    ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -    ol_spec->dst.field = mf_from_id(MFF_METADATA);
> -    ol_spec->dst.ofs = 0;
> -    ol_spec->dst.n_bits = ol_spec->dst.field->n_bits;
> -    ol_spec->n_bits = ol_spec->dst.n_bits;
> -    ol_spec->dst_type = NX_LEARN_DST_MATCH;
> -    ol_spec->src_type = NX_LEARN_SRC_FIELD;
> -    ol_spec->src.field = mf_from_id(MFF_METADATA);
> -
> -    if (nw_conn) {
> -        ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -        ol_spec->dst.field = mf_from_id(MFF_ETH_SRC);
> -        ol_spec->src.field = mf_from_id(MFF_ETH_SRC);
> -        ol_spec->dst.ofs = 0;
> -        ol_spec->dst.n_bits = ol_spec->dst.field->n_bits;
> -        ol_spec->n_bits = ol_spec->dst.n_bits;
> -        ol_spec->dst_type = NX_LEARN_DST_MATCH;
> -        ol_spec->src_type = NX_LEARN_SRC_FIELD;
> -    }
> -
> -    /* Match on the same ETH type as the packet that created the new
> table. */
> -    ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -    ol_spec->dst.field = mf_from_id(MFF_ETH_TYPE);
> -    ol_spec->dst.ofs = 0;
> -    ol_spec->dst.n_bits = ol_spec->dst.field->n_bits;
> -    ol_spec->n_bits = ol_spec->dst.n_bits;
> -    ol_spec->dst_type = NX_LEARN_DST_MATCH;
> -    ol_spec->src_type = NX_LEARN_SRC_IMMEDIATE;
> -    union mf_value imm_eth_type = {
> -        .be16 = ipv6 ? htons(ETH_TYPE_IPV6) : htons(ETH_TYPE_IP)
> -    };
> -    mf_write_subfield_value(&ol_spec->dst, &imm_eth_type, &match);
> -    /* Push value last, as this may reallocate 'ol_spec'. */
> -    imm_bytes = DIV_ROUND_UP(ol_spec->dst.n_bits, 8);
> -    src_imm = ofpbuf_put_zeros(ofpacts, OFPACT_ALIGN(imm_bytes));
> -    memcpy(src_imm, &imm_eth_type, imm_bytes);
> -
> -    /* IP src. */
> -    ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -    ol_spec->dst.field =
> -        ipv6 ? mf_from_id(MFF_IPV6_SRC) : mf_from_id(MFF_IPV4_SRC);
> -    if (nw_conn) {
> -        ol_spec->src.field =
> -            ipv6 ? mf_from_id(MFF_IPV6_SRC) : mf_from_id(MFF_IPV4_SRC);
> -    } else {
> -        ol_spec->src.field =
> -            ipv6 ? mf_from_id(MFF_IPV6_DST) : mf_from_id(MFF_IPV4_DST);
> -    }
> -    ol_spec->dst.ofs = 0;
> -    ol_spec->dst.n_bits = ol_spec->dst.field->n_bits;
> -    ol_spec->n_bits = ol_spec->dst.n_bits;
> -    ol_spec->dst_type = NX_LEARN_DST_MATCH;
> -    ol_spec->src_type = NX_LEARN_SRC_FIELD;
> -
> -    /* IP dst. */
> -    ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -    ol_spec->dst.field =
> -        ipv6 ? mf_from_id(MFF_IPV6_DST) : mf_from_id(MFF_IPV4_DST);
> -    if (nw_conn) {
> -        ol_spec->src.field =
> -            ipv6 ? mf_from_id(MFF_IPV6_DST) : mf_from_id(MFF_IPV4_DST);
> -    } else {
> -        ol_spec->src.field =
> -            ipv6 ? mf_from_id(MFF_IPV6_SRC) : mf_from_id(MFF_IPV4_SRC);
> -    }
> -    ol_spec->dst.ofs = 0;
> -    ol_spec->dst.n_bits = ol_spec->dst.field->n_bits;
> -    ol_spec->n_bits = ol_spec->dst.n_bits;
> -    ol_spec->dst_type = NX_LEARN_DST_MATCH;
> -    ol_spec->src_type = NX_LEARN_SRC_FIELD;
> -
> -    /* IP proto. */
> -    union mf_value imm_proto = {
> -        .u8 = proto,
> -    };
> -    ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -    ol_spec->dst.field = mf_from_id(MFF_IP_PROTO);
> -    ol_spec->src.field = mf_from_id(MFF_IP_PROTO);
> -    ol_spec->dst.ofs = 0;
> -    ol_spec->dst.n_bits = ol_spec->dst.field->n_bits;
> -    ol_spec->n_bits = ol_spec->dst.n_bits;
> -    ol_spec->dst_type = NX_LEARN_DST_MATCH;
> -    ol_spec->src_type = NX_LEARN_SRC_IMMEDIATE;
> -    mf_write_subfield_value(&ol_spec->dst, &imm_proto, &match);
> -    /* Push value last, as this may reallocate 'ol_spec' */
> -    imm_bytes = DIV_ROUND_UP(ol_spec->dst.n_bits, 8);
> -    src_imm = ofpbuf_put_zeros(ofpacts, OFPACT_ALIGN(imm_bytes));
> -    memcpy(src_imm, &imm_proto, imm_bytes);
> -
> -    /* src port */
> -    ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -    switch (proto) {
> -    case IPPROTO_TCP:
> -        ol_spec->dst.field = mf_from_id(MFF_TCP_SRC);
> -        ol_spec->src.field =
> -            nw_conn ? mf_from_id(MFF_TCP_SRC) : mf_from_id(MFF_TCP_DST);
> -        break;
> -    case IPPROTO_UDP:
> -        ol_spec->dst.field = mf_from_id(MFF_UDP_SRC);
> -        ol_spec->src.field =
> -            nw_conn ? mf_from_id(MFF_UDP_SRC) : mf_from_id(MFF_UDP_DST);
> -        break;
> -    case IPPROTO_SCTP:
> -        ol_spec->dst.field = mf_from_id(MFF_SCTP_SRC);
> -        ol_spec->src.field =
> -            nw_conn ? mf_from_id(MFF_SCTP_SRC) : mf_from_id(MFF_SCTP_DST);
> -        break;
> -    default:
> -        OVS_NOT_REACHED();
> -        break;
> -    }
> -    ol_spec->dst.ofs = 0;
> -    ol_spec->dst.n_bits = ol_spec->dst.field->n_bits;
> -    ol_spec->n_bits = ol_spec->dst.n_bits;
> -    ol_spec->dst_type = NX_LEARN_DST_MATCH;
> -    ol_spec->src_type = NX_LEARN_SRC_FIELD;
> -
> -    /* dst port */
> -    ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -    switch (proto) {
> -    case IPPROTO_TCP:
> -        ol_spec->dst.field = mf_from_id(MFF_TCP_DST);
> -        ol_spec->src.field =
> -            nw_conn ? mf_from_id(MFF_TCP_DST) : mf_from_id(MFF_TCP_SRC);
> -        break;
> -    case IPPROTO_UDP:
> -        ol_spec->dst.field = mf_from_id(MFF_UDP_DST);
> -        ol_spec->src.field =
> -            nw_conn ? mf_from_id(MFF_UDP_DST) : mf_from_id(MFF_UDP_SRC);
> -        break;
> -    case IPPROTO_SCTP:
> -        ol_spec->dst.field = mf_from_id(MFF_SCTP_DST);
> -        ol_spec->src.field =
> -            nw_conn ? mf_from_id(MFF_SCTP_DST) : mf_from_id(MFF_SCTP_SRC);
> -        break;
> -    default:
> -        OVS_NOT_REACHED();
> -        break;
> -    }
> -    ol_spec->dst.ofs = 0;
> -    ol_spec->dst.n_bits = ol_spec->dst.field->n_bits;
> -    ol_spec->n_bits = ol_spec->dst.n_bits;
> -    ol_spec->dst_type = NX_LEARN_DST_MATCH;
> -    ol_spec->src_type = NX_LEARN_SRC_FIELD;
> -
> -    /* Set MLF_LOOKUP_COMMIT_ECMP_NH_BIT for ecmp replies. */
> -    ol_spec = ofpbuf_put_zeros(ofpacts, sizeof *ol_spec);
> -    ol_spec->dst.field = mf_from_id(MFF_LOG_FLAGS);
> -    ol_spec->dst.ofs = MLF_LOOKUP_COMMIT_ECMP_NH_BIT;
> -    ol_spec->dst.n_bits = 1;
> -    ol_spec->n_bits = ol_spec->dst.n_bits;
> -    ol_spec->dst_type = NX_LEARN_DST_LOAD;
> -    ol_spec->src_type = NX_LEARN_SRC_IMMEDIATE;
> -    union mf_value imm_reg_value = {
> -        .u8 = 1
> -    };
> -    mf_write_subfield_value(&ol_spec->dst, &imm_reg_value, &match);
> -
> -    /* Push value last, as this may reallocate 'ol_spec' */
> -    imm_bytes = DIV_ROUND_UP(ol_spec->dst.n_bits, 8);
> -    src_imm = ofpbuf_put_zeros(ofpacts, OFPACT_ALIGN(imm_bytes));
> -    ol = ofpacts->header;
> -    memcpy(src_imm, &imm_reg_value, imm_bytes);
> -
> -    ofpact_finish_LEARN(ofpacts, &ol);
> -}
> -
> -static void
> -encode_COMMIT_ECMP_NH(const struct ovnact_commit_ecmp_nh *ecmp_nh,
> -                      const struct ovnact_encode_params *ep OVS_UNUSED,
> -                      struct ofpbuf *ofpacts)
> -{
> -     commit_ecmp_learn_action(ofpacts, true, ecmp_nh->ipv6,
> ecmp_nh->proto);
> -     commit_ecmp_learn_action(ofpacts, false, ecmp_nh->ipv6,
> ecmp_nh->proto);
> -}
> -
> -static void
> -parse_chk_ecmp_nh_mac(struct action_context *ctx, const struct expr_field
> *dst,
> -                      struct ovnact_result *res)
> -{
> -    parse_ovnact_result(ctx, "chk_ecmp_nh_mac", NULL, dst, res);
> -}
> -
> -static void
> -format_CHK_ECMP_NH_MAC(const struct ovnact_result *res, struct ds *s)
> -{
> -    expr_field_format(&res->dst, s);
> -    ds_put_cstr(s, " = chk_ecmp_nh_mac();");
> -}
> -
> -static void
> -encode_CHK_ECMP_NH_MAC(const struct ovnact_result *res,
> -                       const struct ovnact_encode_params *ep OVS_UNUSED,
> -                       struct ofpbuf *ofpacts)
> -{
> -    encode_result_action__(res, OFTABLE_ECMP_NH_MAC,
> -                           MLF_LOOKUP_COMMIT_ECMP_NH_BIT, ofpacts);
> -}
> -
> -static void
> -parse_chk_ecmp_nh(struct action_context *ctx, const struct expr_field
> *dst,
> -                  struct ovnact_result *res)
> -{
> -    parse_ovnact_result(ctx, "chk_ecmp_nh", NULL, dst, res);
> -}
> -
> -static void
> -format_CHK_ECMP_NH(const struct ovnact_result *res, struct ds *s)
> -{
> -    expr_field_format(&res->dst, s);
> -    ds_put_cstr(s, " = chk_ecmp_nh();");
> -}
> -
> -static void
> -encode_CHK_ECMP_NH(const struct ovnact_result *res,
> -                   const struct ovnact_encode_params *ep OVS_UNUSED,
> -                   struct ofpbuf *ofpacts)
> -{
> -    encode_result_action__(res, OFTABLE_ECMP_NH,
> -                           MLF_LOOKUP_COMMIT_ECMP_NH_BIT, ofpacts);
> -}
> -
>  static void
>  parse_commit_lb_aff(struct action_context *ctx,
>                      struct ovnact_commit_lb_aff *lb_aff)
> @@ -6172,14 +5851,6 @@ parse_set_action(struct action_context *ctx)
>                     && lexer_lookahead(ctx->lexer) == LEX_T_LPAREN) {
>              parse_check_out_port_sec(
>                  ctx, &lhs, ovnact_put_CHECK_OUT_PORT_SEC(ctx->ovnacts));
> -        } else if (!strcmp(ctx->lexer->token.s, "chk_ecmp_nh_mac")
> -                   && lexer_lookahead(ctx->lexer) == LEX_T_LPAREN) {
> -            parse_chk_ecmp_nh_mac(ctx, &lhs,
> -                    ovnact_put_CHK_ECMP_NH_MAC(ctx->ovnacts));
> -        } else if (!strcmp(ctx->lexer->token.s, "chk_ecmp_nh")
> -                   && lexer_lookahead(ctx->lexer) == LEX_T_LPAREN) {
> -            parse_chk_ecmp_nh(ctx, &lhs,
> -                    ovnact_put_CHK_ECMP_NH(ctx->ovnacts));
>          } else if (!strcmp(ctx->lexer->token.s, "chk_lb_aff") &&
>                     lexer_lookahead(ctx->lexer) == LEX_T_LPAREN) {
>              parse_chk_lb_aff(ctx, &lhs,
> @@ -6323,8 +5994,6 @@ parse_action(struct action_context *ctx)
>          ovnact_put_CT_SNAT_TO_VIP(ctx->ovnacts);
>      } else if (lexer_match_id(ctx->lexer, "put_fdb")) {
>          parse_put_fdb(ctx, ovnact_put_PUT_FDB(ctx->ovnacts));
> -    } else if (lexer_match_id(ctx->lexer, "commit_ecmp_nh")) {
> -        parse_commit_ecmp_nh(ctx,
> ovnact_put_COMMIT_ECMP_NH(ctx->ovnacts));
>      } else if (lexer_match_id(ctx->lexer, "commit_lb_aff")) {
>          parse_commit_lb_aff(ctx, ovnact_put_COMMIT_LB_AFF(ctx->ovnacts));
>      } else if (lexer_match_id(ctx->lexer, "sample")) {
> diff --git a/lib/ovn-util.c b/lib/ovn-util.c
> index 9842afb3c..eb1fa8a06 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 "1167787232 11430"
> +#define OVN_NORTHD_PIPELINE_CSUM "3980195012 11262"
>  #define OVN_INTERNAL_MINOR_VER 16
>
>  /* Returns the OVN version. The caller must free the returned value. */
> diff --git a/ovn-sb.xml b/ovn-sb.xml
> index b41b79662..808694fe0 100644
> --- a/ovn-sb.xml
> +++ b/ovn-sb.xml
> @@ -2881,58 +2881,6 @@ tcp.flags = RST;
>            </p>
>          </dd>
>
> -        <dt><code>commit_ecmp_nh(<var>ipv6</var>);</code></dt>
> -        <dd>
> -          <p>
> -              <b>Parameters</b>: IPv4/IPv6 traffic.
> -          </p>
> -
> -          <p>
> -            This action translates to an openflow "learn" action that
> inserts
> -            two new flows in tables referenced by table 100 and 101.
> -          </p>
> -
> -          <ul>
> -            <li>
> -              Match on the 5-tuple and the expected next-hop mac address
> -              in table 100:
> -              <code>nw_src=ip0</code>, <code>nw_dst=ip1</code>,
> -              <code>ip_proto</code>,<code>tp_src=l4_port0</code>,
> -              <code>tp_dst=l4_port1</code>,<code>dl_src=ethaddr</code> and
> -              set <code>reg9[5]</code>.
> -            </li>
> -            <li>
> -              Match on the 5-tuple in table 101:
> -              <code>nw_src=ip1</code>, <code>nw_dst=ip0</code>,
> -              <code>ip_proto</code>, <code>tp_src=l4_port1</code>,
> -              <code>tp_dst=l4_port0</code> and set <code>reg9[5]</code>
> to 1
> -            </li>
> -          </ul>
> -
> -          <p>
> -            This action is applied if the packet arrives via ECMP route or
> -            if it is routed via an ECMP route
> -          </p>
> -        </dd>
> -
> -        <dt><code><var>R</var> = chk_ecmp_nh_mac();</code></dt>
> -        <dd>
> -          <p>
> -            This action checks if the packet under consideration matches
> any
> -            flow in table 100. If it is so, then the 1-bit destination
> -            register <var>R</var> is set to 1.
> -          </p>
> -        </dd>
> -
> -        <dt><code><var>R</var> = chk_ecmp_nh();</code></dt>
> -        <dd>
> -          <p>
> -            This action checks if the packet under consideration matches
> any
> -            flow in table 101. If it is so, then the 1-bit destination
> -            register <var>R</var> is set to 1.
> -          </p>
> -        </dd>
> -
>          <dt>
>            <code>
>              commit_lb_aff(<var>vip</var>, <var>backend</var>,
> diff --git a/tests/ovn-macros.at b/tests/ovn-macros.at
> index 7ae147dee..560f02fc1 100644
> --- a/tests/ovn-macros.at
> +++ b/tests/ovn-macros.at
> @@ -1677,20 +1677,18 @@ m4_define([OFTABLE_LOOKUP_FDB], [96])
>  m4_define([OFTABLE_CHK_IN_PORT_SEC], [97])
>  m4_define([OFTABLE_CHK_IN_PORT_SEC_ND], [98])
>  m4_define([OFTABLE_CHK_OUT_PORT_SEC], [99])
> -m4_define([OFTABLE_ECMP_NH_MAC], [100])
> -m4_define([OFTABLE_ECMP_NH], [101])
> -m4_define([OFTABLE_CHK_LB_AFFINITY], [102])
> -m4_define([OFTABLE_MAC_CACHE_USE], [103])
> -m4_define([OFTABLE_CT_ZONE_LOOKUP], [104])
> -m4_define([OFTABLE_CT_ORIG_NW_DST_LOAD], [105])
> -m4_define([OFTABLE_CT_ORIG_IP6_DST_LOAD], [106])
> -m4_define([OFTABLE_CT_ORIG_TP_DST_LOAD], [107])
> -m4_define([OFTABLE_FLOOD_REMOTE_CHASSIS], [108])
> -m4_define([OFTABLE_CT_STATE_SAVE], [109])
> -m4_define([OFTABLE_CT_ORIG_PROTO_LOAD], [110])
> -m4_define([OFTABLE_GET_REMOTE_FDB], [111])
> -m4_define([OFTABLE_LEARN_REMOTE_FDB], [112])
> -m4_define([OFTABLE_EVPN_ARP_LOOKUP], [113])
> -m4_define([OFTABLE_NF_ORIG_INPORT_LEARN], [114])
> +m4_define([OFTABLE_CHK_LB_AFFINITY], [100])
> +m4_define([OFTABLE_MAC_CACHE_USE], [101])
> +m4_define([OFTABLE_CT_ZONE_LOOKUP], [102])
> +m4_define([OFTABLE_CT_ORIG_NW_DST_LOAD], [103])
> +m4_define([OFTABLE_CT_ORIG_IP6_DST_LOAD], [104])
> +m4_define([OFTABLE_CT_ORIG_TP_DST_LOAD], [105])
> +m4_define([OFTABLE_FLOOD_REMOTE_CHASSIS], [106])
> +m4_define([OFTABLE_CT_STATE_SAVE], [107])
> +m4_define([OFTABLE_CT_ORIG_PROTO_LOAD], [108])
> +m4_define([OFTABLE_GET_REMOTE_FDB], [109])
> +m4_define([OFTABLE_LEARN_REMOTE_FDB], [110])
> +m4_define([OFTABLE_EVPN_ARP_LOOKUP], [111])
> +m4_define([OFTABLE_NF_ORIG_INPORT_LEARN], [112])
>
>  m4_define([OFTABLE_SAVE_INPORT_HEX], [m4_eval(OFTABLE_SAVE_INPORT, 16)])
> diff --git a/tests/ovn.at b/tests/ovn.at
> index a88a077c6..13c05528e 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -2180,26 +2180,6 @@ reg0[[0]] = check_out_port_sec(foo);
>  check_out_port_sec;
>      Syntax error at `check_out_port_sec' expecting action.
>
> -# commit_ecmp_nh
> -commit_ecmp_nh(ipv6 = "false", proto = tcp);
> -    formats as commit_ecmp_nh(ipv6 = false, proto = tcp);
> -    encodes as
> learn(table=OFTABLE_ECMP_NH_MAC,idle_timeout=20,hard_timeout=30,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_SRC[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],NXM_OF_IP_DST[[]],nw_proto=6,NXM_OF_TCP_SRC[[]],NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[13]]),learn(table=OFTABLE_ECMP_NH,idle_timeout=20,hard_timeout=30,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]]=NXM_OF_IP_DST[[0..-1]],NXM_OF_IP_DST[[]]=NXM_OF_IP_SRC[[0..-1]],nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[0..-1]],NXM_OF_TCP_DST[[]]=NXM_OF_TCP_SRC[[0..-1]],load:0x1->NXM_NX_REG10[[13]])
> -
> -commit_ecmp_nh(ipv6 = "true", proto = udp);
> -    formats as commit_ecmp_nh(ipv6 = true, proto = udp);
> -    encodes as
> learn(table=OFTABLE_ECMP_NH_MAC,idle_timeout=20,hard_timeout=30,delete_learned,OXM_OF_METADATA[[]],NXM_OF_ETH_SRC[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],NXM_NX_IPV6_DST[[]],nw_proto=17,NXM_OF_UDP_SRC[[]],NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[13]]),learn(table=OFTABLE_ECMP_NH,idle_timeout=20,hard_timeout=30,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]]=NXM_NX_IPV6_DST[[0..-1]],NXM_NX_IPV6_DST[[]]=NXM_NX_IPV6_SRC[[0..-1]],nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[0..-1]],NXM_OF_UDP_DST[[]]=NXM_OF_UDP_SRC[[0..-1]],load:0x1->NXM_NX_REG10[[13]])
> -
> -commit_ecmp_nh(proto = sctp);
> -    Syntax error at `proto' invalid parameter.
> -
> -# chk_ecmp_nh_mac
> -reg9[[5]] = chk_ecmp_nh_mac();
> -    encodes as
> set_field:0/0x2000->reg10,resubmit(,OFTABLE_ECMP_NH_MAC),move:NXM_NX_REG10[[13]]->OXM_OF_PKT_REG4[[5]]
> -
> -# chk_ecmp_nh
> -reg9[[5]] = chk_ecmp_nh();
> -    encodes as
> set_field:0/0x2000->reg10,resubmit(,OFTABLE_ECMP_NH),move:NXM_NX_REG10[[13]]->OXM_OF_PKT_REG4[[5]]
> -
>  # commit_lb_aff
>  commit_lb_aff(vip = "172.16.0.123:8080", backend = "10.0.0.3:8080",
> proto = tcp, timeout = 30);
>      encodes as
> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
> diff --git a/utilities/ovn-trace.c b/utilities/ovn-trace.c
> index 1fcebf584..8901354cb 100644
> --- a/utilities/ovn-trace.c
> +++ b/utilities/ovn-trace.c
> @@ -3617,12 +3617,6 @@ trace_actions(const struct ovnact *ovnacts, size_t
> ovnacts_len,
>              execute_mirror(ovnact_get_MIRROR(a), dp, uflow, super);
>              break;
>
> -        case OVNACT_COMMIT_ECMP_NH:
> -            break;
> -        case OVNACT_CHK_ECMP_NH_MAC:
> -            break;
> -        case OVNACT_CHK_ECMP_NH:
> -            break;
>          case OVNACT_COMMIT_LB_AFF:
>              break;
>          case OVNACT_CHK_LB_AFF:
> --
> 2.55.0
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>
Regards,
Ales
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to