On Tue, Feb 10, 2026 at 12:24 PM Dumitru Ceara via dev <
[email protected]> wrote:
> Commit 9c3ae6f27475 ("northd: Add ECMP symmetric replies for egress.")
> tried to add ECMP-symmetric-reply semantics to traffic forwarded on
> sessions initiating from "behind" the static route, i.e., traffic
> hitting the route in the original direction.
>
> However, it decided to commit the session to conntrack only when we
> finally received reply traffic on the session.
>
> As shown in https://issues.redhat.com/browse/FDP-1983, if the hash
> function of the ECMP route changes in between the original SYN and the
> last ACK of the 3-way-handshake of a TCP session (e.g., if ECMP paths
> are added to the route) then traffic in the original direction might
> incorrectly migrate and be forwarded via a different next-hop than the
> original SYN.
>
> In order to fix this, we now commit the traffic on the first SYN instead
> of waiting for replies. That happens in a new logical router pipeline
> stage 'lr_in_ecmp_stateful_egr', just after 'lr_in_arp_request' where
> which we store the (resolved) next-hop MAC and packet out-port in
> conntrack for traffic forwarded by ECMP-symmetric-reply static routes
> (in the original direction).
>
> The system-ovn.at tests also had to be updated because, due to the fact
> that traffic was committed to conntrack only on the first
> non-session-setup reply, the tuples were "wrong". I.e., the conntrack
> session looked as if it had been created from "outside" the static
> route.
>
> Fixes: 9c3ae6f27475 ("northd: Add ECMP symmetric replies for egress.")
> Reported-at: https://issues.redhat.com/browse/FDP-1983
> Signed-off-by: Dumitru Ceara <[email protected]>
> ---
>
Hi Dumitru,
thank you for the patch, just one tiny nit below.
> lib/ovn-util.c | 4 +--
> northd/northd.c | 54 ++++++++++++++++++++++++++++++++++++-----
> northd/northd.h | 2 ++
> northd/ovn-northd.8.xml | 18 +++++++++++---
> tests/ovn-northd.at | 45 ++++++++++++++++++++++++++--------
> tests/system-ovn.at | 12 ++++++---
> 6 files changed, 110 insertions(+), 25 deletions(-)
>
> diff --git a/lib/ovn-util.c b/lib/ovn-util.c
> index 8a065e3c29..2df51dc7ef 100644
> --- a/lib/ovn-util.c
> +++ b/lib/ovn-util.c
> @@ -968,8 +968,8 @@ 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 "4239189964 11014"
> -#define OVN_INTERNAL_MINOR_VER 11
> +#define OVN_NORTHD_PIPELINE_CSUM "45472499 11094"
> +#define OVN_INTERNAL_MINOR_VER 12
>
> /* Returns the OVN version. The caller must free the returned value. */
> char *
> diff --git a/northd/northd.c b/northd/northd.c
> index 2df205ec23..9b74fd4667 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -201,6 +201,9 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
> #define REGBIT_DHCP_RELAY_REQ_CHK "reg9[7]"
> #define REGBIT_DHCP_RELAY_RESP_CHK "reg9[8]"
> #define REGBIT_NEXTHOP_IS_IPV4 "reg9[9]"
> +/* Register bit to store whether we need to commit this ECMP symmetric
> + * reply processed packet after resolving its next-hop MAC address. */
> +#define REGBIT_NEEDS_ECMP_STATEFUL_COMMIT "reg9[10]"
>
> /* Register to store the eth address associated to a router port for
> packets
> * received in S_ROUTER_IN_ADMISSION.
> @@ -12345,6 +12348,7 @@ add_ecmp_symmetric_reply_flows(struct lflow_table
> *lflows,
> * ds_put_cstr() call. The previous contents are needed.
> */
> ds_put_cstr(&match, " && (ct.new || ct.est)");
> +
>
nit: Unrelated change.
> ds_put_format(&actions,
> "ct_commit { ct_label.ecmp_reply_eth = eth.src; "
> "ct_mark.ecmp_reply_port = %" PRId64 ";}; "
> @@ -12499,13 +12503,16 @@ build_ecmp_route_flow(struct lflow_table *lflows,
> "%s = %s; "
> "eth.src = %s; "
> "outport = %s; "
> - REGBIT_NEXTHOP_IS_IPV4" = %d; "
> - "next;",
> + REGBIT_NEXTHOP_IS_IPV4" = %d; ",
> is_ipv4_nexthop ? REG_SRC_IPV4 : REG_SRC_IPV6,
> route->lrp_addr_s,
> route->out_port->lrp_networks.ea_s,
> route->out_port->json_key,
> is_ipv4_nexthop);
> + if (route->ecmp_symmetric_reply) {
> + ds_put_cstr(&actions, REGBIT_NEEDS_ECMP_STATEFUL_COMMIT " =
> 1; ");
> + }
> + ds_put_cstr(&actions, "next;");
> ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING_ECMP, 100,
> ds_cstr(&match), ds_cstr(&actions), lflow_ref,
> WITH_HINT(route->source_hint));
> @@ -15954,7 +15961,7 @@ build_arp_request_flows_for_lrouter(
> "ip6.dst = %s; "
> "nd.target = %s; "
> "output; "
> - "}; output;", ETH_ADDR_ARGS(eth_dst), sn_addr_s,
> + "}; next;", ETH_ADDR_ARGS(eth_dst), sn_addr_s,
> route->nexthop);
>
> ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_REQUEST, 200,
> @@ -15974,7 +15981,7 @@ build_arp_request_flows_for_lrouter(
> "arp.tpa = " REG_NEXT_HOP_IPV4 "; "
> "arp.op = 1; " /* ARP request */
> "output; "
> - "}; output;",
> + "}; next;",
> lflow_ref,
> WITH_CTRL_METER(copp_meter_get(COPP_ARP_RESOLVE,
> od->nbr->copp,
>
> meter_groups)));
> @@ -15984,11 +15991,40 @@ build_arp_request_flows_for_lrouter(
> "nd_ns { "
> "nd.target = " REG_NEXT_HOP_IPV6 "; "
> "output; "
> - "}; output;",
> + "}; next;",
> lflow_ref,
> WITH_CTRL_METER(copp_meter_get(COPP_ND_NS_RESOLVE,
> od->nbr->copp,
>
> meter_groups)));
> - ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_REQUEST, 0, "1", "output;",
> + ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_REQUEST, 0, "1", "next;",
> + lflow_ref);
> +}
> +
> +static void
> +build_ecmp_stateful_egr_flows_for_lrouter_port(
> + struct ovn_port *op, struct lflow_table *lflows,
> + struct ds *match, struct ds *actions,
> + struct lflow_ref *lflow_ref)
> +{
> + ds_clear(match);
> + ds_put_format(match, REGBIT_NEEDS_ECMP_STATEFUL_COMMIT " == 1 && ip
> && "
> + "outport == %s", op->json_key);
> +
> + ds_clear(actions);
> + ds_put_format(actions,
> + "ct_commit { ct_label.ecmp_reply_eth = eth.dst; "
> + "ct_mark.ecmp_reply_port = %" PRId64 ";}; "
> + "output;",
> + op->sb->tunnel_key);
> + ovn_lflow_add(lflows, op->od, S_ROUTER_IN_ECMP_STATEFUL_EGR, 100,
> + ds_cstr(match), ds_cstr(actions), lflow_ref);
> +}
> +
> +static void
> +build_ecmp_stateful_egr_flows_for_lrouter(
> + struct ovn_datapath *od, struct lflow_table *lflows,
> + struct lflow_ref *lflow_ref)
> +{
> + ovn_lflow_add(lflows, od, S_ROUTER_IN_ECMP_STATEFUL_EGR, 0, "1",
> "output;",
> lflow_ref);
> }
>
> @@ -19039,6 +19075,8 @@ build_lswitch_and_lrouter_iterate_by_lr(struct
> ovn_datapath *od,
> &lsi->actions,
> lsi->meter_groups,
> od->datapath_lflows);
> + build_ecmp_stateful_egr_flows_for_lrouter(od, lsi->lflows,
> + od->datapath_lflows);
> build_lrouter_network_id_flows(od, lsi->lflows, &lsi->match,
> &lsi->actions, od->datapath_lflows);
> build_misc_local_traffic_drop_flows_for_lrouter(od, lsi->lflows,
> @@ -19129,6 +19167,10 @@ build_lswitch_and_lrouter_iterate_by_lrp(struct
> ovn_port *op,
> build_lrouter_routing_protocol_redirect(op, lsi->lflows, &lsi->match,
> &lsi->actions, op->lflow_ref,
> lsi->ls_ports,
> lsi->bfd_ports);
> + build_ecmp_stateful_egr_flows_for_lrouter_port(op, lsi->lflows,
> + &lsi->match,
> + &lsi->actions,
> + op->lflow_ref);
> }
>
> static void *
> diff --git a/northd/northd.h b/northd/northd.h
> index f812656af2..9158f3d532 100644
> --- a/northd/northd.h
> +++ b/northd/northd.h
> @@ -602,6 +602,8 @@ ovn_datapath_is_stale(const struct ovn_datapath *od)
> PIPELINE_STAGE(ROUTER, IN, GW_REDIRECT, 25,
> "lr_in_gw_redirect") \
> PIPELINE_STAGE(ROUTER, IN, NETWORK_ID, 26, "lr_in_network_id")
> \
> PIPELINE_STAGE(ROUTER, IN, ARP_REQUEST, 27,
> "lr_in_arp_request") \
> + PIPELINE_STAGE(ROUTER, IN, ECMP_STATEFUL_EGR, 28,
> \
> + "lr_in_ecmp_stateful_egr")
> \
> \
> /* Logical router egress stages. */ \
> PIPELINE_STAGE(ROUTER, OUT, CHECK_DNAT_LOCAL, 0,
> \
> diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
> index 279d81f35d..ca37d4e398 100644
> --- a/northd/ovn-northd.8.xml
> +++ b/northd/ovn-northd.8.xml
> @@ -5507,8 +5507,9 @@ icmp6 {
>
> <p>
> In the common case where the Ethernet destination has been
> resolved, this
> - table outputs the packet. Otherwise, it composes and sends an ARP
> or
> - IPv6 Neighbor Solicitation request. It holds the following flows:
> + table advances the packet to the next table. Otherwise, it
> composes and
> + sends an ARP or IPv6 Neighbor Solicitation request. It holds the
> + following flows:
> </p>
>
> <ul>
> @@ -5577,10 +5578,21 @@ nd_ns {
>
> <li>
> Known MAC address. A priority-0 flow with match <code>1</code>
> has
> - actions <code>output;</code>.
> + actions <code>next;</code>.
> </li>
> </ul>
>
> + <h3>Ingress Table 27: ECMP symmetric reply processing for egress</h3>
> + <p>
> + This table contains logical flows that commit IP traffic forwarded
> by
> + ECMP symmetric reply static routes in the "route direction", that
> is,
> + for sessions initiated from behind such routes. These flows can be
> hit
> + only on gateway routers, the only type of routers that supports ECMP
> + symmetric reply routes. As the egress port of the traffic needs to
> be
> + stored in conntrack for these sessions, one logical flow is added
> for
> + each logical router port.
> + </p>
> +
> <h3>Egress Table 0: Check DNAT local </h3>
>
> <p>
> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> index f3454a3631..aeb07f1dde 100644
> --- a/tests/ovn-northd.at
> +++ b/tests/ovn-northd.at
> @@ -7139,10 +7139,15 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows |
> ovn_strip_lflows], [0], [dnl
>
> AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | ovn_strip_lflows],
> [0], [dnl
> table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1),
> action=(drop;)
> - table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 1), action=(reg0 = 192.168.0.10; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; next;)
> + table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 1), action=(reg0 = 192.168.0.10; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; reg9[[10]] = 1; next;)
> table=??(lr_in_ip_routing_ecmp), priority=150 , match=(reg8[[0..15]]
> == 0), action=(next;)
> ])
>
> +AT_CHECK([grep -e "lr_in_ecmp_stateful_egr" lr0flows | ovn_strip_lflows],
> [0], [dnl
> + table=??(lr_in_ecmp_stateful_egr), priority=0 , match=(1),
> action=(output;)
> + table=??(lr_in_ecmp_stateful_egr), priority=100 , match=(reg9[[10]] ==
> 1 && ip && outport == "lr0-public"), action=(ct_commit {
> ct_label.ecmp_reply_eth = eth.dst; ct_mark.ecmp_reply_port = 1;}; output;)
> +])
> +
> check ovn-nbctl --wait=sb --ecmp-symmetric-reply lr-route-add lr0 1.0.0.1
> 192.168.0.20
> check_row_count ECMP_Nexthop 2
> check_column 192.168.0.10 ECMP_Nexthop nexthop nexthop=192.168.0.10
> @@ -7159,8 +7164,8 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows |
> ovn_strip_lflows], [0], [dnl
> ])
> AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | sed
> 's/192\.168\.0\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl
> table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1),
> action=(drop;)
> - table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 1), action=(reg0 = 192.168.0.??; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; next;)
> - table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 2), action=(reg0 = 192.168.0.??; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; next;)
> + table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 1), action=(reg0 = 192.168.0.??; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; reg9[[10]] = 1; next;)
> + table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 2), action=(reg0 = 192.168.0.??; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; reg9[[10]] = 1; next;)
> table=??(lr_in_ip_routing_ecmp), priority=150 , match=(reg8[[0..15]]
> == 0), action=(next;)
> ])
>
> @@ -7174,6 +7179,16 @@ AT_CHECK([grep -e "lr_in_arp_resolve.*ecmp"
> lr0flows | ovn_strip_lflows], [0], [
> table=??(lr_in_arp_resolve ), priority=200 ,
> match=(ct_mark.ecmp_reply_port == 1), action=(push(xxreg1); xxreg1 =
> ct_label; eth.dst = xxreg1[[32..79]]; pop(xxreg1); next;)
> ])
>
> +AT_CHECK([grep -e "lr_in_ecmp_stateful_egr" lr0flows | ovn_strip_lflows],
> [0], [dnl
> + table=??(lr_in_ecmp_stateful_egr), priority=0 , match=(1),
> action=(output;)
> + table=??(lr_in_ecmp_stateful_egr), priority=100 , match=(reg9[[10]] ==
> 1 && ip && outport == "lr0-public"), action=(ct_commit {
> ct_label.ecmp_reply_eth = eth.dst; ct_mark.ecmp_reply_port = 1;}; output;)
> +])
> +
> +# Check that reroute policies reset ecmp-symmetric-reply behavior when
> hit.
> +check ovn-nbctl --wait=sb \
> + -- lr-policy-add lr0 20 "ip4.src == 10.0.0.4" reroute 192.168.0.10 \
> + -- lr-policy-add lr0 10 "ip4.src == 10.0.0.3" reroute
> 192.168.0.10,192.168.0.20
> +
> # add ecmp route with wrong nexthop
> check ovn-nbctl --wait=sb --ecmp-symmetric-reply lr-route-add lr0 1.0.0.1
> 192.168.1.20
> check_row_count ECMP_Nexthop 2
> @@ -7191,11 +7206,16 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows |
> ovn_strip_lflows], [0], [dnl
> ])
> AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | sed
> 's/192\.168\.0\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl
> table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1),
> action=(drop;)
> - table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 1), action=(reg0 = 192.168.0.??; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; next;)
> - table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 2), action=(reg0 = 192.168.0.??; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; next;)
> + table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 1), action=(reg0 = 192.168.0.??; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; reg9[[10]] = 1; next;)
> + table=??(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[[0..15]]
> == 1 && reg8[[16..31]] == 2), action=(reg0 = 192.168.0.??; reg5 =
> 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; reg9[[9]]
> = 1; reg9[[10]] = 1; next;)
> table=??(lr_in_ip_routing_ecmp), priority=150 , match=(reg8[[0..15]]
> == 0), action=(next;)
> ])
>
> +AT_CHECK([grep -e "lr_in_ecmp_stateful_egr" lr0flows | ovn_strip_lflows],
> [0], [dnl
> + table=??(lr_in_ecmp_stateful_egr), priority=0 , match=(1),
> action=(output;)
> + table=??(lr_in_ecmp_stateful_egr), priority=100 , match=(reg9[[10]] ==
> 1 && ip && outport == "lr0-public"), action=(ct_commit {
> ct_label.ecmp_reply_eth = eth.dst; ct_mark.ecmp_reply_port = 1;}; output;)
> +])
> +
> check ovn-nbctl lr-route-del lr0
> wait_row_count nb:Logical_Router_Static_Route 0
> check_row_count ECMP_Nexthop 0
> @@ -7241,6 +7261,11 @@ AT_CHECK([grep -e "(lr_in_ip_routing ).*3.3.0.0"
> lr0flows | sed 's/table=../ta
> table=??(lr_in_ip_routing ), priority=133 , match=(reg7 == 0 &&
> ip4.dst == 3.3.0.0/16 && udp), action=(ip.ttl--; flags.loopback = 1;
> reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2);
> hash_fields="ip_dst,ip_proto,ip_src,udp_dst,udp_src");)
> ])
>
> +AT_CHECK([grep -e "lr_in_ecmp_stateful_egr" lr0flows | ovn_strip_lflows],
> [0], [dnl
> + table=??(lr_in_ecmp_stateful_egr), priority=0 , match=(1),
> action=(output;)
> + table=??(lr_in_ecmp_stateful_egr), priority=100 , match=(reg9[[10]] ==
> 1 && ip && outport == "lr0-public"), action=(ct_commit {
> ct_label.ecmp_reply_eth = eth.dst; ct_mark.ecmp_reply_port = 1;}; output;)
> +])
> +
> OVN_CLEANUP_NORTHD
> AT_CLEANUP
> ])
> @@ -7289,11 +7314,11 @@ AT_CHECK([grep -e "lr_in_arp_resolve" lr0flows |
> ovn_strip_lflows], [0], [dnl
> ])
>
> AT_CHECK([grep -e "lr_in_arp_request" lr0flows | ovn_strip_lflows], [0],
> [dnl
> - table=??(lr_in_arp_request ), priority=0 , match=(1),
> action=(output;)
> - table=??(lr_in_arp_request ), priority=100 , match=(eth.dst ==
> 00:00:00:00:00:00 && reg9[[9]] == 0), action=(nd_ns { nd.target = xxreg0;
> output; }; output;)
> - table=??(lr_in_arp_request ), priority=100 , match=(eth.dst ==
> 00:00:00:00:00:00 && reg9[[9]] == 1), action=(arp { eth.dst =
> ff:ff:ff:ff:ff:ff; arp.spa = reg5; arp.tpa = reg0; arp.op = 1; output; };
> output;)
> - table=??(lr_in_arp_request ), priority=200 , match=(eth.dst ==
> 00:00:00:00:00:00 && reg9[[9]] == 0 && xxreg0 == 2001:db8::10),
> action=(nd_ns { eth.dst = 33:33:ff:00:00:10; ip6.dst = ff02::1:ff00:10;
> nd.target = 2001:db8::10; output; }; output;)
> - table=??(lr_in_arp_request ), priority=200 , match=(eth.dst ==
> 00:00:00:00:00:00 && reg9[[9]] == 0 && xxreg0 == 2001:db8::20),
> action=(nd_ns { eth.dst = 33:33:ff:00:00:20; ip6.dst = ff02::1:ff00:20;
> nd.target = 2001:db8::20; output; }; output;)
> + table=??(lr_in_arp_request ), priority=0 , match=(1), action=(next;)
> + table=??(lr_in_arp_request ), priority=100 , match=(eth.dst ==
> 00:00:00:00:00:00 && reg9[[9]] == 0), action=(nd_ns { nd.target = xxreg0;
> output; }; next;)
> + table=??(lr_in_arp_request ), priority=100 , match=(eth.dst ==
> 00:00:00:00:00:00 && reg9[[9]] == 1), action=(arp { eth.dst =
> ff:ff:ff:ff:ff:ff; arp.spa = reg5; arp.tpa = reg0; arp.op = 1; output; };
> next;)
> + table=??(lr_in_arp_request ), priority=200 , match=(eth.dst ==
> 00:00:00:00:00:00 && reg9[[9]] == 0 && xxreg0 == 2001:db8::10),
> action=(nd_ns { eth.dst = 33:33:ff:00:00:10; ip6.dst = ff02::1:ff00:10;
> nd.target = 2001:db8::10; output; }; next;)
> + table=??(lr_in_arp_request ), priority=200 , match=(eth.dst ==
> 00:00:00:00:00:00 && reg9[[9]] == 0 && xxreg0 == 2001:db8::20),
> action=(nd_ns { eth.dst = 33:33:ff:00:00:20; ip6.dst = ff02::1:ff00:20;
> nd.target = 2001:db8::20; output; }; next;)
> ])
>
> OVN_CLEANUP_NORTHD
> diff --git a/tests/system-ovn.at b/tests/system-ovn.at
> index 82b7e7db5b..c732af9b91 100644
> --- a/tests/system-ovn.at
> +++ b/tests/system-ovn.at
> @@ -6679,7 +6679,8 @@ NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2
> 172.16.0.1 | FORMAT_PING], \
> AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep 0x401020500000000 |
> FORMAT_CT(172.16.0.1) | \
> sed -e 's/zone=[[0-9]]*/zone=<cleared>/' |
> sed -e 's/mark=[[0-9]]*/mark=<cleared>/' | sort], [0], [dnl
>
> -tcp,orig=(src=172.16.0.1,dst=10.0.0.2,sport=<cleared>,dport=<cleared>),reply=(src=10.0.0.2,dst=172.16.0.1,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=<cleared>,labels=0x401020500000000,protoinfo=(state=<cleared>)
>
> +icmp,orig=(src=10.0.0.2,dst=172.16.0.1,id=<cleared>,type=8,code=0),reply=(src=172.16.0.1,dst=10.0.0.2,id=<cleared>,type=0,code=0),zone=<cleared>,mark=<cleared>,labels=0x401020500000000
>
> +tcp,orig=(src=10.0.0.2,dst=172.16.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.0.1,dst=10.0.0.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=<cleared>,labels=0x401020500000000,protoinfo=(state=<cleared>)
> ])
>
> # Now remove one ECMP route and check that traffic is still being
> conntracked.
> @@ -6695,7 +6696,8 @@ NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2
> 172.16.0.1 | FORMAT_PING], \
> AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep 0x401020500000000 |
> FORMAT_CT(172.16.0.1) | \
> sed -e 's/zone=[[0-9]]*/zone=<cleared>/' |
> sed -e 's/mark=[[0-9]]*/mark=<cleared>/' | sort], [0], [dnl
>
> -tcp,orig=(src=172.16.0.1,dst=10.0.0.2,sport=<cleared>,dport=<cleared>),reply=(src=10.0.0.2,dst=172.16.0.1,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=<cleared>,labels=0x401020500000000,protoinfo=(state=<cleared>)
>
> +icmp,orig=(src=10.0.0.2,dst=172.16.0.1,id=<cleared>,type=8,code=0),reply=(src=172.16.0.1,dst=10.0.0.2,id=<cleared>,type=0,code=0),zone=<cleared>,mark=<cleared>,labels=0x401020500000000
>
> +tcp,orig=(src=10.0.0.2,dst=172.16.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.0.1,dst=10.0.0.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=<cleared>,labels=0x401020500000000,protoinfo=(state=<cleared>)
> ])
>
> OVN_CLEANUP_CONTROLLER([hv1])
> @@ -6904,7 +6906,8 @@ NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2
> fd07::1 | FORMAT_PING], \
> AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep 0x1001020400000000 |
> FORMAT_CT(fd07::1) | \
> sed -e 's/zone=[[0-9]]*/zone=<cleared>/' |
> sed -e 's/mark=[[0-9]]*/mark=<cleared>/' | sort], [0], [dnl
>
> -tcp,orig=(src=fd07::1,dst=fd01::2,sport=<cleared>,dport=<cleared>),reply=(src=fd01::2,dst=fd07::1,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=<cleared>,labels=0x1001020400000000,protoinfo=(state=<cleared>)
>
> +icmpv6,orig=(src=fd01::2,dst=fd07::1,id=<cleared>,type=128,code=0),reply=(src=fd07::1,dst=fd01::2,id=<cleared>,type=129,code=0),zone=<cleared>,mark=<cleared>,labels=0x1001020400000000
>
> +tcp,orig=(src=fd01::2,dst=fd07::1,sport=<cleared>,dport=<cleared>),reply=(src=fd07::1,dst=fd01::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=<cleared>,labels=0x1001020400000000,protoinfo=(state=<cleared>)
> ])
>
> # Now remove one ECMP route and check that traffic is still being
> conntracked.
> @@ -6920,7 +6923,8 @@ NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2
> fd07::1 | FORMAT_PING], \
> AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep 0x1001020400000000 |
> FORMAT_CT(fd07::1) | \
> sed -e 's/zone=[[0-9]]*/zone=<cleared>/' |
> sed -e 's/mark=[[0-9]]*/mark=<cleared>/' | sort], [0], [dnl
>
> -tcp,orig=(src=fd07::1,dst=fd01::2,sport=<cleared>,dport=<cleared>),reply=(src=fd01::2,dst=fd07::1,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=<cleared>,labels=0x1001020400000000,protoinfo=(state=<cleared>)
>
> +icmpv6,orig=(src=fd01::2,dst=fd07::1,id=<cleared>,type=128,code=0),reply=(src=fd07::1,dst=fd01::2,id=<cleared>,type=129,code=0),zone=<cleared>,mark=<cleared>,labels=0x1001020400000000
>
> +tcp,orig=(src=fd01::2,dst=fd07::1,sport=<cleared>,dport=<cleared>),reply=(src=fd07::1,dst=fd01::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=<cleared>,labels=0x1001020400000000,protoinfo=(state=<cleared>)
> ])
>
> OVN_CLEANUP_CONTROLLER([hv1])
> --
> 2.52.0
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>
With that addressed:
Acked-by: Ales Musil <[email protected]>
Regards,
Ales
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev