On Fri, Jul 26, 2024 at 11:16 AM Mark Michelson <[email protected]> wrote:
>
> Hi Numan,
>
> The only issue I have with this patch is that I think it should have a
> change in ovn-nb.xml to mention that the ecmp_symmetric_reply option
> also now applies for egress-originated traffic.
>
> Other than that,
>
> Acked-by: Mark Michelson <[email protected]>
Thanks for the reviews.
I applied this patch to the main with the below changes in ovn-nb.xml.
--------------------
diff --git a/ovn-nb.xml b/ovn-nb.xml
index 6a2b964ace..a4362a4ef1 100644
--- a/ovn-nb.xml
+++ b/ovn-nb.xml
@@ -3686,12 +3686,29 @@ or
</column>
<column name="options" key="ecmp_symmetric_reply">
- If true, then new traffic that arrives over this route will have
- its reply traffic bypass ECMP route selection and will be sent out
- this route instead. Note that this option overrides any rules set
- in the <ref table="Logical_Router_policy" /> table. This option
- only works on gateway routers (routers that have
- <ref column="options" key="chassis" table="Logical_Router" /> set).
+ <p>
+ If true, then
+ </p>
+ <ul>
+ <li>
+ New ingress-originated traffic that arrives over this route will
+ have its reply traffic bypass ECMP route selection and will be
+ sent out this route instead.
+ </li>
+
+ <li>
+ For the egress-originated traffic, the ingress reply traffic route
+ gets saved. And the subsequent traffic will bypass ECMP route
+ selection and instead be sent out the same route.
+ </li>
+ </ul>
+
+ <p>
+ Note that this option overrides any rules set in the
+ <ref table="Logical_Router_policy" /> table. This option only works
+ on gateway routers (routers that have
+ <ref column="options" key="chassis" table="Logical_Router" /> set).
+ </p>
</column>
<column name="options" key="origin">
----------------------------------------------------
Numan
>
> On 7/18/24 17:29, [email protected] wrote:
> > From: Numan Siddique <[email protected]>
> >
> > When there are ECMP symmetric static routes configured, OVN selects
> > one of the next hop for the traffic originated from within the
> > cluster. For the subsequent packets to the same destination,
> > OVN may select a different next hop (which is fine). But there can
> > be certain usecases, where the next hop entity can be stateful and
> > selecting the same next hop is desirable.
> >
> > This patch address this usecase in the following way
> >
> > 1. For the first packet originating from the OVN logical port
> > VIF, OVN selects a next hop 'A' and forwards the traffic to
> > it.
> >
> > 2. When the reply traffic is received (either from next hop 'A'
> > or any other next hop), it commits the connection in the
> > DNAT zone of the logical router and saves the state in
> > ct_label.ecmp_reply_eth and ct_label.ecmp_reply_port.
> > Note that we already support this for the traffic
> > originating from an ECMP route [1]. We are now extending
> > the same for the traffic originating from the cluster towards
> > the ECMP route.
> >
> > 3. For the subsequent packets from the cluster, we select the
> > next hop eth address and the port from the saved conntrack
> > state. This is straightforward as we anyway send the packet
> > to the DNAT zone of the logical router.
> >
> > Example: If a logical router lr0 is configured with the below
> > EMCP static routes
> >
> > ovn-nbctl lr-route-list lr0
> > IPv4 Routes
> > Route Table <main>:
> > 0.0.0.0/0 172.20.0.1 dst-ip ecmp
> > 0.0.0.0/0 172.20.0.2 dst-ip ecmp
> > ecmp-symmetric-reply
> >
> > Before this patch, we were adding the below logical flows in the router
> > pipeline for the ECMP route handling:
> >
> > -------------
> > table=10(lr_in_ecmp_stateful), priority=100 , match=(inport ==
> > "lr0-public" && ip4.src == 0.0.0.0/0 && !ct.rpl && (ct.new || ct.est)),
> > action=(ct_commit { ct_label.ecmp_reply_eth = eth.src;
> > ct_mark.ecmp_reply_port = 3;}; next;)
> > table=14(lr_in_ip_routing ), priority=10300, match=(ct.rpl &&
> > ct_mark.ecmp_reply_port == 3 && reg7 == 0 && ip4.dst == 0.0.0.0/0),
> > action=(ip.ttl--; flags.loopback = 1; eth.src = 00:11:22:00:ff:01; reg1 =
> > 172.20.0.100; outport = "lr0-public"; next;)
> > table=16(lr_in_policy ), priority=65535, match=(ct.rpl &&
> > ct_mark.ecmp_reply_port == 3), action=(next;)
> > table=20(lr_in_arp_resolve ), priority=200 , match=(ct.rpl &&
> > ct_mark.ecmp_reply_port == 3), action=(push(xxreg1); xxreg1 = ct_label;
> > eth.dst = xxreg1[32..79]; pop(xxreg1); next;)
> > -------------
> >
> > After this patch, we add the below logical flows:
> >
> > --------------
> > table=10(lr_in_ecmp_stateful), priority=100 , match=(inport ==
> > "lr0-public" && ip4.src == 0.0.0.0/0 && (ct.new || ct.est)),
> > action=(ct_commit { ct_label.ecmp_reply_eth = eth.src;
> > ct_mark.ecmp_reply_port = 3;}; next;)
> > table=14(lr_in_ip_routing ), priority=10300,
> > match=(ct_mark.ecmp_reply_port == 3 && reg7 == 0 && ip4.dst == 0.0.0.0/0),
> > action=(ip.ttl--; flags.loopback = 1; eth.src = 00:11:22:00:ff:01; reg1 =
> > 172.20.0.100; outport = "lr0-public"; next;)
> > table=16(lr_in_policy ), priority=65535,
> > match=(ct_mark.ecmp_reply_port == 3), action=(next;)
> > table=20(lr_in_arp_resolve ), priority=200 ,
> > match=(ct_mark.ecmp_reply_port == 3), action=(push(xxreg1); xxreg1 =
> > ct_label; eth.dst = xxreg1[32..79]; pop(xxreg1); next;)
> > --------------
> >
> > [1] - 4fdca656857d ("Add ECMP symmetric replies.")
> > Reported-at: https://issues.redhat.com/browse/FDP-628
> > Signed-off-by: Numan Siddique <[email protected]>
> > ---
> >
> > v1 -> v2
> > ------
> > - Addressed Ilya's comments - Fixed the failing system tests related
> > to ECMP symmetric replies
> > - And enhanced those tests to cover the scenario of packet originating
> > from the VIF.
> >
> > northd/northd.c | 4 ++--
> > tests/ovn-northd.at | 26 ++++++++++++++++++-----
> > tests/system-ovn.at | 50 +++++++++++++++++++++++++++++++++++----------
> > 3 files changed, 62 insertions(+), 18 deletions(-)
> >
> > diff --git a/northd/northd.c b/northd/northd.c
> > index 6898daa00d..3227c093cb 100644
> > --- a/northd/northd.c
> > +++ b/northd/northd.c
> > @@ -10706,7 +10706,7 @@ add_ecmp_symmetric_reply_flows(struct lflow_table
> > *lflows,
> > * NOTE: we purposely are not clearing match before this
> > * ds_put_cstr() call. The previous contents are needed.
> > */
> > - ds_put_cstr(&match, " && !ct.rpl && (ct.new || ct.est)");
> > + ds_put_cstr(&match, " && (ct.new || ct.est)");
> > ds_put_format(&actions,
> > "ct_commit { ct_label.ecmp_reply_eth = eth.src; "
> > " %s = %" PRId64 ";}; "
> > @@ -10721,7 +10721,7 @@ add_ecmp_symmetric_reply_flows(struct lflow_table
> > *lflows,
> > * for where to route the packet.
> > */
> > ds_put_format(&ecmp_reply,
> > - "ct.rpl && %s == %"PRId64,
> > + "%s == %"PRId64,
> > ct_ecmp_reply_port_match, out_port->sb->tunnel_key);
> > ds_clear(&match);
> > ds_put_format(&match, "%s && %s", ds_cstr(&ecmp_reply),
> > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> > index a389d19886..98a5006cb5 100644
> > --- a/tests/ovn-northd.at
> > +++ b/tests/ovn-northd.at
> > @@ -6722,8 +6722,14 @@ check ovn-nbctl --wait=sb --ecmp-symmetric-reply
> > lr-route-add lr0 1.0.0.1 192.16
> >
> > ovn-sbctl dump-flows lr0 > lr0flows
> >
> > -AT_CHECK([grep -e "lr_in_ip_routing.*select" lr0flows |sort], [0], [dnl
> > +AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], [0],
> > [dnl
> > + table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)
> > + table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra),
> > action=(drop;)
> > + table=??(lr_in_ip_routing ), priority=194 , match=(inport ==
> > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0;
> > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src =
> > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;)
> > + table=??(lr_in_ip_routing ), priority=74 , match=(ip4.dst ==
> > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1
> > = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public";
> > flags.loopback = 1; next;)
> > + table=??(lr_in_ip_routing ), priority=97 , match=(reg7 == 0 &&
> > ip4.dst == 1.0.0.1/32), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 =
> > 192.168.0.10; reg1 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport =
> > "lr0-public"; flags.loopback = 1; next;)
> > ])
> > +
> > 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=150 , match=(reg8[[0..15]]
> > == 0), action=(next;)
> > @@ -6732,7 +6738,12 @@ AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows |
> > ovn_strip_lflows], [0], [dn
> > check ovn-nbctl --wait=sb --ecmp-symmetric-reply lr-route-add lr0 1.0.0.1
> > 192.168.0.20
> >
> > ovn-sbctl dump-flows lr0 > lr0flows
> > -AT_CHECK([grep -e "lr_in_ip_routing.*select" lr0flows | ovn_strip_lflows],
> > [0], [dnl
> > +AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], [0],
> > [dnl
> > + table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)
> > + table=??(lr_in_ip_routing ), priority=10300,
> > match=(ct_label.ecmp_reply_port == 1 && reg7 == 0 && ip4.dst ==
> > 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; eth.src =
> > 00:00:20:20:12:13; reg1 = 192.168.0.1; outport = "lr0-public"; next;)
> > + table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra),
> > action=(drop;)
> > + table=??(lr_in_ip_routing ), priority=194 , match=(inport ==
> > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0;
> > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src =
> > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;)
> > + table=??(lr_in_ip_routing ), priority=74 , match=(ip4.dst ==
> > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1
> > = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public";
> > flags.loopback = 1; next;)
> > table=??(lr_in_ip_routing ), priority=97 , match=(reg7 == 0 &&
> > ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]]
> > = 1; reg8[[16..31]] = select(1, 2);)
> > ])
> > AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | sed
> > 's/192\.168\.0\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl
> > @@ -6751,7 +6762,7 @@ AT_CHECK([grep -e "lr_in_defrag" lr0flows |
> > ovn_strip_lflows], [0], [dnl
> > dnl The chassis was created with other_config:ct-no-masked-label=false,
> > the flows
> > dnl should be using ct_label.ecmp_reply_port.
> > AT_CHECK([grep -e "lr_in_arp_resolve.*ecmp" lr0flows | ovn_strip_lflows],
> > [0], [dnl
> > - table=??(lr_in_arp_resolve ), priority=200 , match=(ct.rpl &&
> > ct_label.ecmp_reply_port == 1), action=(push(xxreg1); xxreg1 = ct_label;
> > eth.dst = xxreg1[[32..79]]; pop(xxreg1); next;)
> > + table=??(lr_in_arp_resolve ), priority=200 ,
> > match=(ct_label.ecmp_reply_port == 1), action=(push(xxreg1); xxreg1 =
> > ct_label; eth.dst = xxreg1[[32..79]]; pop(xxreg1); next;)
> > ])
> >
> > dnl Simulate an ovn-controller upgrade to a version that supports
> > @@ -6761,14 +6772,19 @@ check ovn-sbctl set chassis ch1
> > other_config:ct-no-masked-label=true
> > check ovn-nbctl --wait=sb sync
> > ovn-sbctl dump-flows lr0 > lr0flows
> > AT_CHECK([grep -e "lr_in_arp_resolve.*ecmp" lr0flows | ovn_strip_lflows],
> > [0], [dnl
> > - table=??(lr_in_arp_resolve ), priority=200 , match=(ct.rpl &&
> > ct_mark.ecmp_reply_port == 1), action=(push(xxreg1); xxreg1 = ct_label;
> > eth.dst = xxreg1[[32..79]]; pop(xxreg1); next;)
> > + 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;)
> > ])
> >
> > # 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
> >
> > ovn-sbctl dump-flows lr0 > lr0flows
> > -AT_CHECK([grep -e "lr_in_ip_routing.*select" lr0flows | ovn_strip_lflows],
> > [0], [dnl
> > +AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], [0],
> > [dnl
> > + table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)
> > + table=??(lr_in_ip_routing ), priority=10300,
> > match=(ct_mark.ecmp_reply_port == 1 && reg7 == 0 && ip4.dst == 1.0.0.1/32),
> > action=(ip.ttl--; flags.loopback = 1; eth.src = 00:00:20:20:12:13; reg1 =
> > 192.168.0.1; outport = "lr0-public"; next;)
> > + table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra),
> > action=(drop;)
> > + table=??(lr_in_ip_routing ), priority=194 , match=(inport ==
> > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0;
> > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src =
> > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;)
> > + table=??(lr_in_ip_routing ), priority=74 , match=(ip4.dst ==
> > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1
> > = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public";
> > flags.loopback = 1; next;)
> > table=??(lr_in_ip_routing ), priority=97 , match=(reg7 == 0 &&
> > ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]]
> > = 1; reg8[[16..31]] = select(1, 2);)
> > ])
> > AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | sed
> > 's/192\.168\.0\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl
> > diff --git a/tests/system-ovn.at b/tests/system-ovn.at
> > index c24ede7c50..7fadd6a19b 100644
> > --- a/tests/system-ovn.at
> > +++ b/tests/system-ovn.at
> > @@ -6180,11 +6180,10 @@
> > tcp,orig=(src=172.16.0.1,dst=10.0.0.2,sport=<cleared>,dport=<cleared>),reply=(sr
> > # Ensure datapaths show conntrack states as expected
> > # Like with conntrack entries, we shouldn't try to predict
> > # port binding tunnel keys. So omit them from expected labels.
> > -ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est-rpl+trk).*ct(.*label=0x401020400000000/.*)'
> > -AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est-rpl+trk).*ct(.*label=0x401020400000000/.*)' -c], [0],
> > [dnl
> > +AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est+trk).*ct(.*label=0x401020400000000/.*)' -c], [0], [dnl
> > 2
> > ])
> > -AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(-new+est+rpl+trk).*ct_label(0x401020400000000)' -c], [0], [dnl
> > +AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(-new+est+trk).*ct_label(0x401020400000000)' -c], [0], [dnl
> > 2
> > ])
> >
> > @@ -6203,10 +6202,10 @@ NS_CHECK_EXEC([bob1], [ping -q -c 3 -i 0.3 -w 2
> > 10.0.0.2 | FORMAT_PING], \
> > [0], [dnl
> > 3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > ])
> > -AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est-rpl+trk).*ct(.*label=0x1001020400000000/.*)' -c], [0],
> > [dnl
> > +AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est+trk).*ct(.*label=0x1001020400000000/.*)' -c], [0], [dnl
> > 2
> > ])
> > -AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(-new+est+rpl+trk).*ct_label(0x1001020400000000)' -c], [0], [dnl
> > +AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(-new+est+trk).*ct_label(0x1001020400000000)' -c], [0], [dnl
> > 2
> > ])
> >
> > @@ -6224,7 +6223,23 @@ OVS_WAIT_UNTIL([
> > test $(ovs-ofctl dump-flows br-int | grep -c 'table=OFTABLE_ECMP_NH,
> > n_packets') -eq 0
> > ])
> >
> > -ovs-ofctl dump-flows br-int
> > +AT_CHECK([ovs-appctl dpctl/flush-conntrack])
> > +
> > +NS_CHECK_EXEC([bob1], [ip r d default via 172.16.0.2 dev bob1], [0])
> > +NS_CHECK_EXEC([bob1], [ip r a default via 172.16.0.3 dev bob1], [0])
> > +
> > +NETNS_DAEMONIZE([bob1], [nc -l -k 8080], [bob1.pid])
> > +NS_CHECK_EXEC([alice1], [nc -z 172.16.0.1 8080], [0])
> > +NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2 172.16.0.1 |
> > FORMAT_PING], \
> > +[0], [dnl
> > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > +])
> > +
> > +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>)
> > +])
> >
> > OVS_APP_EXIT_AND_WAIT([ovn-controller])
> >
> > @@ -6373,11 +6388,11 @@ NS_CHECK_EXEC([bob1], [ping -q -c 3 -i 0.3 -w 2
> > fd01::2 | FORMAT_PING], \
> > # Ensure datapaths show conntrack states as expected
> > # Like with conntrack entries, we shouldn't try to predict
> > # port binding tunnel keys. So omit them from expected labels.
> > -AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est-rpl+trk).*ct(.*label=0x401020400000000/.*)' -c], [0],
> > [dnl
> > +AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est+trk).*ct(.*label=0x401020400000000/.*)' -c], [0], [dnl
> > 2
> > ])
> >
> > -AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(-new+est+rpl+trk).*ct_label(0x401020400000000)' -c], [0], [dnl
> > +AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(-new+est+trk).*ct_label(0x401020400000000)' -c], [0], [dnl
> > 2
> > ])
> >
> > @@ -6405,10 +6420,10 @@ NS_CHECK_EXEC([bob1], [ping -q -c 3 -i 0.3 -w 2
> > fd01::2 | FORMAT_PING], \
> > 3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > ])
> >
> > -AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est-rpl+trk).*ct(.*label=0x1001020400000000/.*)' -c], [0],
> > [dnl
> > +AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(+new-est+trk).*ct(.*label=0x1001020400000000/.*)' -c], [0], [dnl
> > 2
> > ])
> > -AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(-new+est+rpl+trk).*ct_label(0x1001020400000000)' -c], [0], [dnl
> > +AT_CHECK([ovs-appctl dpctl/dump-flows | grep
> > 'ct_state(-new+est+trk).*ct_label(0x1001020400000000)' -c], [0], [dnl
> > 2
> > ])
> >
> > @@ -6427,7 +6442,20 @@ OVS_WAIT_UNTIL([
> > test $(ovs-ofctl dump-flows br-int | grep -c 'table=OFTABLE_ECMP_NH,
> > n_packets') -eq 0
> > ])
> >
> > -ovs-ofctl dump-flows br-int
> > +AT_CHECK([ovs-appctl dpctl/flush-conntrack])
> > +
> > +NETNS_DAEMONIZE([bob1], [nc -6 -l -k 8080], [bob1.pid])
> > +NS_CHECK_EXEC([alice1], [nc -6 -z fd07::1 8080], [0])
> > +NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2 fd07::1 | FORMAT_PING], \
> > +[0], [dnl
> > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > +])
> > +
> > +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>)
> > +])
> >
> > OVS_APP_EXIT_AND_WAIT([ovn-controller])
> >
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev