Am Fri, Apr 24, 2026 at 01:15:16PM +0200 schrieb Lorenzo Bianconi via dev:
> From: Dumitru Ceara <[email protected]>
> 
> In the OVN logical switch pipeline, broadcast ARP requests (and ND_NS)
> generated by VIFs and by router ports are also flooded into the per switch
> MC_FLOOD_L2 multicast group which includes all non-router ports of the
> switch.
> In deployments with large logical broadcast domains (logical switches with
> a significantly large number of switch ports, e.g. 200+) this becomes a
> problem because the MC_FLOOD_L2 multicast group has a lot of ports so the
> chain of the OpenFlow tables that the packet needs to traverse for full
> processing becomes really long, going over OVS' 4K resubmit limit and
> causing the packet to be dropped.
> The main reason why the ARP packets are currently sent to all non-router
> ports is to allow the workloads to learn the mapping between arp.spa
> (source IP) and arp.sha (source MAC). However, that's just an optimization,
> which might avoid future ARP requests from other workloads; and it's not a
> requirement, nothing would really break if we didn't forward those packets
> to all other VIFs.
> It's probably acceptable to change the behavior and just forward these ARP
> requests to the ports that have LSP.addresses="unknown" as the workloads
> behind those ports (or the fabric for the localnet case) might actually own
> the arp.tpa target IP.
> 
> Reported-at: https://redhat.atlassian.net/browse/FDP-3439
> Co-authored-by: Lorenzo Bianconi <[email protected]>
> Signed-off-by: Lorenzo Bianconi <[email protected]>
> Signed-off-by: Dumitru Ceara <[email protected]>
> ---
>  northd/northd.c         |   6 +-
>  northd/ovn-northd.8.xml |   6 +-
>  ovs                     |   2 +-
>  tests/ovn-northd.at     | 142 ++++++++++++++++++++--------------------
>  tests/ovn.at            |   2 +
>  5 files changed, 80 insertions(+), 78 deletions(-)
> 
> diff --git a/northd/northd.c b/northd/northd.c
> index 0b52db6cf..a12cb8251 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -9609,7 +9609,7 @@ build_lswitch_rport_arp_req_flow(
>       */
>      if (vector_len(&od->router_ports) != od->nbs->n_ports) {
>          ds_put_format(&actions, "clone {outport = %s; output; }; "
> -                                "outport = \""MC_FLOOD_L2"\"; output;",
> +                                "outport = \""MC_UNKNOWN"\"; output;",
>                        patch_op->json_key);
>          ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, priority,
>                        ds_cstr(&match), ds_cstr(&actions), lflow_ref,
> @@ -9628,7 +9628,7 @@ build_lswitch_rport_arp_req_flow(
>          ds_clear(&actions);
>          if (vector_len(&od->router_ports) != od->nbs->n_ports) {
>              ds_put_format(&actions, "clone {outport = %s; output; }; "
> -                                    "outport = \""MC_FLOOD_L2"\"; output;",
> +                                    "outport = \""MC_UNKNOWN"\"; output;",
>                            patch_op->cr_port->json_key);
>              ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, priority,
>                            ds_cstr(&match), ds_cstr(&actions), lflow_ref,
> @@ -11061,7 +11061,7 @@ build_lswitch_destination_lookup_bmcast(struct 
> ovn_datapath *od,
>                         "broadcast-arps-to-all-routers", true)) {
>          ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 72,
>                        "eth.mcast && (arp.op == 1 || nd_ns)",
> -                      "outport = \""MC_FLOOD_L2"\"; output;",
> +                      "outport = \""MC_UNKNOWN"\"; output;",
>                        lflow_ref);
>      }
>  
> diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
> index 4d6370da6..8402f388b 100644
> --- a/northd/ovn-northd.8.xml
> +++ b/northd/ovn-northd.8.xml
> @@ -2402,8 +2402,8 @@ output;
>          router port connected to the switch. These flows match ARP requests
>          and ND packets for the specific IP addresses.  Matched packets are
>          forwarded only to the router that owns the IP address and to the
> -        <code>MC_FLOOD_L2</code> multicast group which contains all 
> non-router
> -        logical ports.
> +        <code>MC_UNKNOWN</code> multicast group which contains all enabled
> +        logical ports that accept unknown destination packets.
>        </li>
>  
>        <li>
> @@ -2426,7 +2426,7 @@ output;
>        <li>
>          A priority-72 flow that outputs all ARP requests and ND NS (Neighbor
>          Solicitation) packets with an Ethernet broadcast or multicast
> -        <code>eth.dst</code> to the <code>MC_FLOOD_L2</code> multicast group
> +        <code>eth.dst</code> to the <code>MC_UNKNOWN</code> multicast group
>          if <code>other_config:broadcast-arps-to-all-routers=false</code>.
>        </li>
>  
> diff --git a/ovs b/ovs
> index bdb95cc19..6aefe1db3 160000
> --- a/ovs
> +++ b/ovs
> @@ -1 +1 @@
> -Subproject commit bdb95cc1920d4ab66fe062a9470eeb33a51d33e2
> +Subproject commit 6aefe1db31e3df4e7b64c21f54a7287e4663e1e4
> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> index 1d7bd6c28..bf2b857f5 100644
> --- a/tests/ovn-northd.at
> +++ b/tests/ovn-northd.at
> @@ -5867,8 +5867,8 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:01:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_unknown"; output;)

Hi everyone,

i am a little concerned by this change.
The reason is that `arp.op == 1` is also commonly used for garps (see
e.g. [1]).

So if you have on one LS with a normal VIF (e.g. for a VM) as well as two
other VIFs for something with keepalived and keepalived does a failover
it would normaly send out a garp. Previously this garp has been
forwarded to the VIF of the VM which could then learn the new mac
address for the keepalived ip.
With this change it seems to me like this is prevented and the VM will
never learn that the mac has change. So it would keep sending packets to
the old mac until the arp cache expires.

But maybe i am also missing something and this is still handled
elsewhere.

Thanks a lot,
Felix

[1] 
https://github.com/acassen/keepalived/blob/master/keepalived/vrrp/vrrp_arp.c#L135C22-L135C35

>  ])
>  
>  ovn-sbctl lflow-list ls2 > ls2_lflows
> @@ -5883,8 +5883,8 @@ AT_CHECK([grep "ls_in_l2_lkup" ls2_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:02:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.2.1), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:201), action=(clone {outport = 
> "ls2-ro2"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.2.1), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:201), action=(clone {outport = 
> "ls2-ro2"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  AS_BOX([Adding some reachable NAT addresses])
> @@ -5907,10 +5907,10 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:01:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  ovn-sbctl lflow-list ls2 > ls2_lflows
> @@ -5925,10 +5925,10 @@ AT_CHECK([grep "ls_in_l2_lkup" ls2_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:02:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.2.1), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 20.0.0.100), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 20.0.0.200), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:201), action=(clone {outport = 
> "ls2-ro2"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.2.1), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 20.0.0.100), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 20.0.0.200), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:201), action=(clone {outport = 
> "ls2-ro2"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  AS_BOX([Adding some unreachable NAT addresses])
> @@ -5951,12 +5951,12 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:01:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  ovn-sbctl lflow-list ls2 > ls2_lflows
> @@ -5971,12 +5971,12 @@ AT_CHECK([grep "ls_in_l2_lkup" ls2_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:02:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.2.1), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 20.0.0.100), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 20.0.0.200), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 40.0.0.100), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 40.0.0.200), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:201), action=(clone {outport = 
> "ls2-ro2"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.2.1), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 20.0.0.100), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 20.0.0.200), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 40.0.0.100), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 40.0.0.200), action=(clone {outport = "ls2-ro2"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:201), action=(clone {outport = 
> "ls2-ro2"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  AS_BOX([Adding load balancer reachable VIPs to ro1])
> @@ -5996,13 +5996,13 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:01:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  AS_BOX([Adding load balancer unreachable VIPs to ro1])
> @@ -6020,13 +6020,13 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:01:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  # Make sure that there is no flow for VIP 192.168.4.100 as ro1-ls1 doesn't
> @@ -6051,13 +6051,13 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:01:01} && eth.dst == ff:ff:ff:ff:ff:ff && (arp.op == 1 || 
> rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 10.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.1), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 192.168.1.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.100), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 30.0.0.200), action=(clone {outport = "ls1-ro1"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:101), action=(clone {outport = 
> "ls1-ro1"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  
> @@ -8066,17 +8066,17 @@ check ovn-nbctl lsp-add S1 S1-VIF
>  check ovn-nbctl lsp-set-addresses S1-VIF "02:ac:10:01:00:02 unknown"
>  check ovn-nbctl --wait=sb sync
>  
> -AT_CHECK([ovn-sbctl lflow-list S1 | grep ls_in_l2_lkup | grep -q 
> 'match=(eth.mcast && (arp.op == 1 || nd_ns)), action=(outport = 
> "_MC_flood_l2"; output;)'], [1])
> +AT_CHECK([ovn-sbctl lflow-list S1 | grep ls_in_l2_lkup | grep -q 
> 'match=(eth.mcast && (arp.op == 1 || nd_ns)), action=(outport = 
> "_MC_unknown"; output;)'], [1])
>  
>  check ovn-nbctl --wait=sb set Logical_Switch S1 \
>      other_config:broadcast-arps-to-all-routers=false
>  
> -AT_CHECK([ovn-sbctl lflow-list S1 | grep ls_in_l2_lkup | grep -q 
> 'match=(eth.mcast && (arp.op == 1 || nd_ns)), action=(outport = 
> "_MC_flood_l2"; output;)'], [0], [], [ignore])
> +AT_CHECK([ovn-sbctl lflow-list S1 | grep ls_in_l2_lkup | grep -q 
> 'match=(eth.mcast && (arp.op == 1 || nd_ns)), action=(outport = 
> "_MC_unknown"; output;)'], [0], [], [ignore])
>  
>  check ovn-nbctl --wait=sb set Logical_Switch S1 \
>      other_config:broadcast-arps-to-all-routers=true
>  
> -AT_CHECK([ovn-sbctl lflow-list S1 | grep ls_in_l2_lkup | grep -q 
> 'match=(eth.mcast && (arp.op == 1 || nd_ns)), action=(outport = 
> "_MC_flood_l2"; output;)'], [1])
> +AT_CHECK([ovn-sbctl lflow-list S1 | grep ls_in_l2_lkup | grep -q 
> 'match=(eth.mcast && (arp.op == 1 || nd_ns)), action=(outport = 
> "_MC_unknown"; output;)'], [1])
>  
>  OVN_CLEANUP_NORTHD
>  AT_CLEANUP
> @@ -14356,11 +14356,11 @@ AT_CHECK([grep "ls_in_l2_lkup" publicflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:ff:02, 30:54:00:00:00:03} && eth.dst == ff:ff:ff:ff:ff:ff && 
> (arp.op == 1 || rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; 
> output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.10), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.100), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:ff02), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.10), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.100), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:ff02), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" -e "10.0.0.3" -e 
> "20.0.0.3" -e "30:54:00:00:00:03"  -e "sw0-port1" lr0flows | 
> ovn_strip_lflows], [0], [dnl
> @@ -14391,8 +14391,8 @@ AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" 
> -e "10.0.0.3" -e "20.0.0.3
>  AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" -e "10.0.0.3" -e 
> "20.0.0.3" -e "30:54:00:00:00:03"  -e "sw0-port1" publicflows | 
> ovn_strip_lflows | grep -v "reg0.*22"], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
> 30:54:00:00:00:03 && is_chassis_resident("sw0-port1")), action=(outport = 
> "public-lr0"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:ff:02, 30:54:00:00:00:03} && eth.dst == ff:ff:ff:ff:ff:ff && 
> (arp.op == 1 || rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; 
> output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  }
>  
> @@ -14536,16 +14536,16 @@ AT_CHECK([grep "ls_in_l2_lkup" publicflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=71   , match=(eth.mcast && ip), 
> action=(outport = "_MC_flood_l2"; output;)
>    table=??(ls_in_l2_lkup      ), priority=72   , match=(eth.mcast && (nd_na 
> || nd_rs || nd_ra)), action=(outport = "_MC_flood"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:ff:02, 30:54:00:00:00:03} && eth.dst == ff:ff:ff:ff:ff:ff && 
> (arp.op == 1 || rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; 
> output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.10 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.10 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.100 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.100 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:ff02 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:ff02 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.10 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.10 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.100 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.100 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:ff02 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> nd_ns && nd.target == fe80::200:ff:fe00:ff02 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" -e "10.0.0.3" -e 
> "20.0.0.3" -e "30:54:00:00:00:03"  -e "sw0-port1" lr0flows | 
> ovn_strip_lflows], [0], [dnl
> @@ -14570,10 +14570,10 @@ AT_CHECK([grep -Fe "172.168.0.110" -e 
> "172.168.0.120" -e "10.0.0.3" -e "20.0.0.3
>  AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" -e "10.0.0.3" -e 
> "20.0.0.3" -e "30:54:00:00:00:03"  -e "sw0-port1" publicflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
> 30:54:00:00:00:03 && is_chassis_resident("sw0-port1")), action=(outport = 
> "public-lr0"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:ff:02, 30:54:00:00:00:03} && eth.dst == ff:ff:ff:ff:ff:ff && 
> (arp.op == 1 || rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; 
> output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120 && 
> !is_chassis_resident("cr-public-lr0")), action=(clone {outport = 
> "cr-public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120 && 
> is_chassis_resident("cr-public-lr0")), action=(clone {outport = "public-lr0"; 
> output; }; outport = "_MC_unknown"; output;)
>  ])
>  }
>  
> @@ -14637,8 +14637,8 @@ AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" 
> -e "10.0.0.3" -e "20.0.0.3
>  AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" -e "10.0.0.3" -e 
> "20.0.0.3" -e "30:54:00:00:00:03"  -e "sw0-port1" publicflows | 
> ovn_strip_lflows], [0], [dnl
>    table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
> 30:54:00:00:00:03 && is_chassis_resident("sw0-port1")), action=(outport = 
> "public-lr0"; output;)
>    table=??(ls_in_l2_lkup      ), priority=75   , match=(eth.src == 
> {00:00:00:00:ff:02, 30:54:00:00:00:03} && eth.dst == ff:ff:ff:ff:ff:ff && 
> (arp.op == 1 || rarp.op == 3 || nd_ns)), action=(outport = "_MC_flood_l2"; 
> output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> -  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_flood_l2"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.110), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
> +  table=??(ls_in_l2_lkup      ), priority=80   , match=(flags[[1]] == 0 && 
> arp.op == 1 && arp.tpa == 172.168.0.120), action=(clone {outport = 
> "public-lr0"; output; }; outport = "_MC_unknown"; output;)
>  ])
>  
>  OVN_CLEANUP_NORTHD
> diff --git a/tests/ovn.at b/tests/ovn.at
> index c0ae611bc..41707120e 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -5025,6 +5025,7 @@ OVN_FOR_EACH_NORTHD_FLOW_TUNNEL([
>  AT_SETUP([3 HVs, 3 LS, 3 lports/LS, 1 LR])
>  AT_KEYWORDS([slowtest])
>  AT_SKIP_IF([test $HAVE_SCAPY = no])
> +AT_SKIP_IF([:])
>  ovn_start
>  
>  # Logical network:
> @@ -13310,6 +13311,7 @@ AT_CLEANUP
>  # instead of tunneling.
>  OVN_FOR_EACH_NORTHD([
>  AT_SETUP([vlan traffic for external network with distributed router gateway 
> port])
> +AT_SKIP_IF([:])
>  ovn_start
>  
>  # Logical network:
> -- 
> 2.53.0
> 
> _______________________________________________
> 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

Reply via email to