On Wed, Aug 26, 2026 at 10:36 AM Mark Michelson <[email protected]> wrote:
> On Wed, Aug 26, 2026 at 10:24 AM Jacob Tanenbaum <[email protected]> > wrote: > > > > > > > > On Tue, Aug 25, 2026 at 4:07 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]> > >> --- > >> v1 -> v2: > >> Removed much more in order to ensure proper compilation and test > >> success. > >> -- > >> NEWS | 2 + > >> include/ovn/actions.h | 3 - > >> include/ovn/logical-fields.h | 4 +- > >> lib/actions.c | 331 ----------------------------------- > >> lib/ovn-util.c | 2 +- > >> ovn-sb.xml | 51 ------ > >> tests/ovn.at | 20 --- > >> utilities/ovn-trace.c | 6 - > >> 8 files changed, 4 insertions(+), 415 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/include/ovn/actions.h b/include/ovn/actions.h > >> index 7d0ed63bc..23a712fe3 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) \ > > > > > > These actions are also documented in ovn-sb.xml, the documentation there > should also be removed. > > Hi Jacob. Have a look further down in the patch. The documentation in > ovn-sb.xml has been removed. > Whoops, I thought I checked the changed files and didn't see the ovn-sb.xml. Sorry. it does look like you left a struct definition for ovnact_commit_ecmp_nh in this file (include/ovn/actions.h). Also in controller/lflow.h there is the definitions of OFTABLE_ECMP_NH_MAC and OFTABLE_ECMP_NH Those should also be cleaned up. > > > >> > >> OVNACT(COMMIT_LB_AFF, ovnact_commit_lb_aff) \ > >> OVNACT(CHK_LB_AFF, ovnact_result) \ > >> OVNACT(SAMPLE, ovnact_sample) \ > >> diff --git a/include/ovn/logical-fields.h b/include/ovn/logical-fields.h > >> index e95dee316..aa5567e02 100644 > >> --- a/include/ovn/logical-fields.h > >> +++ b/include/ovn/logical-fields.h > >> @@ -127,7 +127,7 @@ 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 */ > >> MLF_USE_LB_AFF_SESSION_BIT = 14, > >> MLF_LOCALNET_BIT = 15, > >> MLF_RX_FROM_TUNNEL_BIT = 16, > >> @@ -187,8 +187,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 c72a20678..4ae24e483 100644 > >> --- a/ovn-sb.xml > >> +++ b/ovn-sb.xml > >> @@ -2811,57 +2811,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 76 and 77. > >> - </p> > >> - > >> - <ul> > >> - <li> > >> - Match on the the 5-tuple and the expected next-hop mac > address > >> - in table 76: <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 77: > <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> = check_ecmp_nh_mac();</code></dt> > >> - <dd> > >> - <p> > >> - This action checks if the packet under consideration > matches > >> - any flow in table 76. If it is so, then the 1-bit > destination > >> - register <var>R</var> is set to 1. > >> - </p> > >> - </dd> > >> - > >> - <dt><code><var>R</var> = check_ecmp_nh();</code></dt> > >> - <dd> > >> - <p> > >> - This action checks if the packet under consideration > matches > >> - the any flow in table 77. 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.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 > >> > > > > Jacob > > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
