Optimize logical flow generation for NAT with distributed gateway ports by 
removing duplicate
priority 90/91 flows and consolidating ARP/ND flow creation in 
build_lrouter_nat_arp_nd_flow().
Add chassis residency filtering for l3dgw ports so ARP/ND responses are 
generated only on the
correct gateway chassis, reducing flow count while preserving behavior.

Signed-off-by: Lucas Vargas Dias <[email protected]>
---
 northd/northd.c     | 36 +++++++++++++----------
 tests/ovn-northd.at | 70 +++++++--------------------------------------
 2 files changed, 31 insertions(+), 75 deletions(-)

diff --git a/northd/northd.c b/northd/northd.c
index 0b52db6cf..20546af6c 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -14026,6 +14026,7 @@ build_lrouter_nd_flow(const struct ovn_datapath *od, 
struct ovn_port *op,
 
 static void
 build_lrouter_nat_arp_nd_flow(const struct ovn_datapath *od,
+                              struct ovn_port *op,
                               struct ovn_nat *nat_entry,
                               struct lflow_table *lflows,
                               const struct shash *meter_groups,
@@ -14033,16 +14034,20 @@ build_lrouter_nat_arp_nd_flow(const struct 
ovn_datapath *od,
 {
     struct lport_addresses *ext_addrs = &nat_entry->ext_addrs;
     const struct nbrec_nat *nat = nat_entry->nb;
+    if (op && lrp_is_l3dgw(op) && (!op->peer || !op->peer->cr_port)) {
+        return;
+    }
 
+    op = NULL;
     if (nat_entry_is_v6(nat_entry)) {
-        build_lrouter_nd_flow(od, NULL, "nd_na",
+        build_lrouter_nd_flow(od, op, "nd_na",
                               ext_addrs->ipv6_addrs[0].addr_s,
                               ext_addrs->ipv6_addrs[0].sn_addr_s,
                               REG_INPORT_ETH_ADDR, NULL, false, 90,
                               &nat->header_, lflows, meter_groups,
                               lflow_ref);
     } else {
-        build_lrouter_arp_flow(od, NULL,
+        build_lrouter_arp_flow(od, op,
                                ext_addrs->ipv4_addrs[0].addr_s,
                                REG_INPORT_ETH_ADDR, NULL, false, 90,
                                &nat->header_, lflows,
@@ -14113,23 +14118,12 @@ build_lrouter_port_nat_arp_nd_flow(struct ovn_port 
*op,
                               mac_s, &match, false, 92,
                               &nat->header_, lflows, meter_groups,
                               lflow_ref);
-        build_lrouter_nd_flow(op->od, op, "nd_na",
-                              ext_addrs->ipv6_addrs[0].addr_s,
-                              ext_addrs->ipv6_addrs[0].sn_addr_s,
-                              mac_s, NULL, true, 91,
-                              &nat->header_, lflows, meter_groups,
-                              lflow_ref);
     } else {
         build_lrouter_arp_flow(op->od, op,
                                ext_addrs->ipv4_addrs[0].addr_s,
                                mac_s, &match, false, 92,
                                &nat->header_, lflows,
                                lflow_ref);
-        build_lrouter_arp_flow(op->od, op,
-                               ext_addrs->ipv4_addrs[0].addr_s,
-                               mac_s, NULL, true, 91,
-                               &nat->header_, lflows,
-                               lflow_ref);
     }
 
     ds_destroy(&match);
@@ -16846,6 +16840,8 @@ build_lrouter_ipv4_default_ttl_expired_flows(
         ds_clear(&ip_ds);
         if (lrp_is_l3dgw(op)) {
             ds_put_cstr(&ip_ds, "ip4.dst <-> ip4.src");
+            ds_put_format(match, "is_chassis_resident(%s) && ",
+                                              op->cr_port->json_key);
         } else {
             ds_put_format(&ip_ds, "ip4.dst = ip4.src; ip4.src = %s",
                           op->lrp_networks.ipv4_addrs[i].addr_s);
@@ -16922,6 +16918,8 @@ build_lrouter_ipv6_default_ttl_expired_flows(
         ds_clear(&ip_ds);
         if (lrp_is_l3dgw(op)) {
             ds_put_cstr(&ip_ds, "ip6.dst <-> ip6.src");
+            ds_put_format(match, "is_chassis_resident(%s) && ",
+                                  op->cr_port->json_key);
         } else {
             ds_put_format(&ip_ds, "ip6.dst = ip6.src; ip6.src = %s",
                           op->lrp_networks.ipv6_addrs[i].addr_s);
@@ -17141,7 +17139,11 @@ build_lrouter_arp_nd_for_datapath(const struct 
ovn_datapath *od,
         if (nat_entry->type == SNAT) {
             continue;
         }
-        build_lrouter_nat_arp_nd_flow(od, nat_entry, lflows, meter_groups,
+        struct ovn_port *op = NULL;
+        if (nat_entry->l3dgw_port) {
+            op = nat_entry->l3dgw_port;
+        }
+        build_lrouter_nat_arp_nd_flow(od, op, nat_entry, lflows, meter_groups,
                                       lflow_ref);
     }
 
@@ -17157,7 +17159,11 @@ build_lrouter_arp_nd_for_datapath(const struct 
ovn_datapath *od,
         struct ovn_nat *nat_entry =
             CONTAINER_OF(ovs_list_front(&snat_ip->snat_entries),
                          struct ovn_nat, ext_addr_list_node);
-        build_lrouter_nat_arp_nd_flow(od, nat_entry, lflows, meter_groups,
+        struct ovn_port *op = NULL;
+        if (nat_entry->l3dgw_port) {
+            op = nat_entry->l3dgw_port;
+        }
+        build_lrouter_nat_arp_nd_flow(od, op, nat_entry, lflows, meter_groups,
                                       lflow_ref);
     }
 }
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 1d7bd6c28..f065dda35 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -2185,18 +2185,6 @@ action=(xreg0[[0..47]] = 00:00:00:00:01:00; next;)
 # Priority 90 flows (per router).
 AT_CHECK_UNQUOTED([ovn-sbctl lflow-list | grep -E 
"lr_in_ip_input.*priority=90" | grep "arp\|nd" | ovn_strip_lflows], [0], [dnl
   table=??(lr_in_ip_input     ), priority=90   , dnl
-match=(arp.op == 1 && arp.tpa == 43.43.43.150), dnl
-action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , dnl
-match=(arp.op == 1 && arp.tpa == 43.43.43.2), dnl
-action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , dnl
-match=(arp.op == 1 && arp.tpa == 43.43.43.3), dnl
-action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , dnl
-match=(arp.op == 1 && arp.tpa == 43.43.43.4), dnl
-action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , dnl
 match=(inport == "lrp" && arp.op == 1 && arp.tpa == \$${lb_as_v4}), dnl
 action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
   table=??(lr_in_ip_input     ), priority=90   , dnl
@@ -2225,19 +2213,10 @@ match=(inport == "lrp-public" && nd_ns && nd.target == 
\$${lb_as_v6} && is_chass
 action=(nd_na { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = 
xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)
 ])
 
-# Priority 91 drop flows (per distributed gw port), if port is not resident.
-AT_CHECK([ovn-sbctl lflow-list | grep -E "lr_in_ip_input.*priority=91" | grep 
"arp\|nd" | ovn_strip_lflows], [0], [dnl
-  table=??(lr_in_ip_input     ), priority=91   , dnl
-match=(inport == "lrp-public" && arp.op == 1 && arp.tpa == 43.43.43.150), 
action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , dnl
-match=(inport == "lrp-public" && arp.op == 1 && arp.tpa == 43.43.43.2), dnl
-action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , dnl
-match=(inport == "lrp-public" && arp.op == 1 && arp.tpa == 43.43.43.3), dnl
-action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , dnl
-match=(inport == "lrp-public" && arp.op == 1 && arp.tpa == 43.43.43.4), dnl
-action=(drop;)
+# Priority 85 drop using the default drop from table lr_in_ip_input.
+AT_CHECK([ovn-sbctl lflow-list | grep -E "lr_in_ip_input.*priority=85" | grep 
"arp\|nd" | ovn_strip_lflows], [0], [dnl
+  table=??(lr_in_ip_input     ), priority=85   , dnl
+match=(arp || nd), action=(drop;)
 ])
 
 # Priority 92 ARP/NS responders (per distributed gw port), if port is resident.
@@ -8762,13 +8741,8 @@ check ovn-nbctl --wait=sb sync
 ovn-sbctl dump-flows DR > lrflows
 AT_CAPTURE_FILE([lrflows])
 
-AT_CHECK([grep lr_in_ip_input lrflows | grep arp | grep -e 172.16.1.10 -e 
10.0.0.10 -e 192.168.0.10 | ovn_strip_lflows], [0], [dnl
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 10.0.0.10), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; 
/* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.16.1.10), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 
2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 192.168.0.10), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 
2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S1" && 
arp.op == 1 && arp.tpa == 172.16.1.10), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S2" && 
arp.op == 1 && arp.tpa == 10.0.0.10), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S3" && 
arp.op == 1 && arp.tpa == 192.168.0.10), action=(drop;)
+AT_CHECK([grep lr_in_ip_input lrflows | grep arp | grep -e 172.16.1.10 -e 
10.0.0.10 -e 192.168.0.10 -e drop| ovn_strip_lflows], [0], [dnl
+  table=??(lr_in_ip_input     ), priority=85   , match=(arp || nd), 
action=(drop;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S1" && 
arp.op == 1 && arp.tpa == 172.16.1.10 && is_chassis_resident("cr-DR-S1")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S2" && 
arp.op == 1 && arp.tpa == 10.0.0.10 && is_chassis_resident("cr-DR-S2")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S3" && 
arp.op == 1 && arp.tpa == 192.168.0.10 && is_chassis_resident("cr-DR-S3")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
@@ -8810,12 +8784,8 @@ check ovn-nbctl --wait=sb sync
 ovn-sbctl dump-flows DR > lrflows
 AT_CAPTURE_FILE([lrflows])
 
-AT_CHECK([grep lr_in_ip_input lrflows | grep arp | grep -e 172.16.1.10 -e 
10.0.0.10 | ovn_strip_lflows], [0], [dnl
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 10.0.0.10), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; 
/* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.16.1.10), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 
2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S1" && 
arp.op == 1 && arp.tpa == 172.16.1.10), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S2" && 
arp.op == 1 && arp.tpa == 10.0.0.10), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S3" && 
arp.op == 1 && arp.tpa == 172.16.1.10), action=(drop;)
+AT_CHECK([grep lr_in_ip_input lrflows | grep arp | grep -e 172.16.1.10 -e 
10.0.0.10 -e drop| ovn_strip_lflows], [0], [dnl
+  table=??(lr_in_ip_input     ), priority=85   , match=(arp || nd), 
action=(drop;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S1" && 
arp.op == 1 && arp.tpa == 172.16.1.10 && is_chassis_resident("cr-DR-S1")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S2" && 
arp.op == 1 && arp.tpa == 10.0.0.10 && is_chassis_resident("cr-DR-S2")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S3" && 
arp.op == 1 && arp.tpa == 172.16.1.10 && is_chassis_resident("cr-DR-S3")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
@@ -8849,12 +8819,6 @@ ovn-sbctl dump-flows DR > lrflows
 AT_CAPTURE_FILE([lrflows])
 
 AT_CHECK([grep lr_in_ip_input lrflows | grep arp | grep -e 172.16.1.10 -e 
10.0.0.10 -e 192.168.0.10 | ovn_strip_lflows], [0], [dnl
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 10.0.0.10), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; 
/* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.16.1.10), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 
2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 192.168.0.10), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 
2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S1" && 
arp.op == 1 && arp.tpa == 172.16.1.10), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S2" && 
arp.op == 1 && arp.tpa == 10.0.0.10), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "DR-S3" && 
arp.op == 1 && arp.tpa == 192.168.0.10), action=(drop;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S1" && 
arp.op == 1 && arp.tpa == 172.16.1.10 && is_chassis_resident("cr-DR-S1")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S2" && 
arp.op == 1 && arp.tpa == 10.0.0.10 && is_chassis_resident("cr-DR-S2")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "DR-S3" && 
arp.op == 1 && arp.tpa == 192.168.0.10 && is_chassis_resident("cr-DR-S3")), 
action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply 
*/ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = 
inport; flags.loopback = 1; output;)
@@ -14245,9 +14209,9 @@ AT_CHECK([grep "lr_in_ip_input" lr0flows | 
ovn_strip_lflows], [0], [dnl
   table=??(lr_in_ip_input     ), priority=30   , match=(inport == "lr0-sw0" && 
ip6 && ip.ttl == {0, 1} && !ip.later_frag), action=(icmp6 {eth.dst <-> eth.src; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff01; ip.ttl = 254; icmp6.type = 
3; /* Time exceeded */ icmp6.code = 0; /* TTL exceeded in transit */ outport = 
"lr0-sw0"; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=30   , match=(inport == "lr0-sw1" && 
ip4 && ip.ttl == {0, 1} && !ip.later_frag), action=(icmp4 {eth.dst <-> eth.src; 
icmp4.type = 11; /* Time exceeded */ icmp4.code = 0; /* TTL exceeded in transit 
*/ ip4.dst = ip4.src; ip4.src = 20.0.0.1; ip.ttl = 254; outport = "lr0-sw1"; 
flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=30   , match=(inport == "lr0-sw1" && 
ip6 && ip.ttl == {0, 1} && !ip.later_frag), action=(icmp6 {eth.dst <-> eth.src; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff03; ip.ttl = 254; icmp6.type = 
3; /* Time exceeded */ icmp6.code = 0; /* TTL exceeded in transit */ outport = 
"lr0-sw1"; flags.loopback = 1; output; };)
-  table=??(lr_in_ip_input     ), priority=31   , match=(inport == "lr0-public" 
&& ip4 && ip4.src == 172.168.0.0/24 && ip.ttl == {0, 1} && !ip.later_frag), 
action=(icmp4 {eth.dst <-> eth.src; icmp4.type = 11; /* Time exceeded */ 
icmp4.code = 0; /* TTL exceeded in transit */ ip4.dst <-> ip4.src ; ip.ttl = 
254; outport = "lr0-public"; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=31   , match=(inport == "lr0-sw0" && 
ip4 && ip4.src == 10.0.0.0/24 && ip.ttl == {0, 1} && !ip.later_frag), 
action=(icmp4 {eth.dst <-> eth.src; icmp4.type = 11; /* Time exceeded */ 
icmp4.code = 0; /* TTL exceeded in transit */ ip4.dst = ip4.src; ip4.src = 
10.0.0.1 ; ip.ttl = 254; outport = "lr0-sw0"; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=31   , match=(inport == "lr0-sw1" && 
ip4 && ip4.src == 20.0.0.0/24 && ip.ttl == {0, 1} && !ip.later_frag), 
action=(icmp4 {eth.dst <-> eth.src; icmp4.type = 11; /* Time exceeded */ 
icmp4.code = 0; /* TTL exceeded in transit */ ip4.dst = ip4.src; ip4.src = 
20.0.0.1 ; ip.ttl = 254; outport = "lr0-sw1"; flags.loopback = 1; output; };)
+  table=??(lr_in_ip_input     ), priority=31   , 
match=(is_chassis_resident("cr-lr0-public") && inport == "lr0-public" && ip4 && 
ip4.src == 172.168.0.0/24 && ip.ttl == {0, 1} && !ip.later_frag), action=(icmp4 
{eth.dst <-> eth.src; icmp4.type = 11; /* Time exceeded */ icmp4.code = 0; /* 
TTL exceeded in transit */ ip4.dst <-> ip4.src ; ip.ttl = 254; outport = 
"lr0-public"; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=32   , match=(ip.ttl == {0, 1} && 
!ip.later_frag && (ip4.mcast || ip6.mcast)), action=(drop;)
   table=??(lr_in_ip_input     ), priority=50   , match=(eth.bcast), 
action=(drop;)
   table=??(lr_in_ip_input     ), priority=60   , match=(ip4.dst == 
{10.0.0.1}), action=(drop;)
@@ -14260,9 +14224,6 @@ AT_CHECK([grep "lr_in_ip_input" lr0flows | 
ovn_strip_lflows], [0], [dnl
   table=??(lr_in_ip_input     ), priority=83   , match=(ip6.mcast_rsvd), 
action=(drop;)
   table=??(lr_in_ip_input     ), priority=84   , match=(nd_rs || nd_ra), 
action=(next;)
   table=??(lr_in_ip_input     ), priority=85   , match=(arp || nd), 
action=(drop;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.168.0.100), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op 
= 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.168.0.110), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op 
= 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.168.0.120), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op 
= 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
   table=??(lr_in_ip_input     ), priority=90   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.10 && arp.spa == 172.168.0.0/24 && 
is_chassis_resident("cr-lr0-public")), action=(eth.dst = eth.src; eth.src = 
xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; 
output;)
   table=??(lr_in_ip_input     ), priority=90   , match=(inport == "lr0-public" 
&& ip6.dst == {fe80::200:ff:fe00:ff02, ff02::1:ff00:ff02} && nd_ns && nd.target 
== fe80::200:ff:fe00:ff02 && is_chassis_resident("cr-lr0-public")), 
action=(nd_na_router { eth.src = xreg0[[0..47]]; ip6.src = nd.target; nd.tll = 
xreg0[[0..47]]; outport = inport; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=90   , match=(inport == "lr0-sw0" && 
arp.op == 1 && arp.tpa == 10.0.0.1 && arp.spa == 10.0.0.0/24), action=(eth.dst 
= eth.src; eth.src = xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = 
arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; 
flags.loopback = 1; output;)
@@ -14275,9 +14236,6 @@ AT_CHECK([grep "lr_in_ip_input" lr0flows | 
ovn_strip_lflows], [0], [dnl
   table=??(lr_in_ip_input     ), priority=90   , match=(ip6.dst == 
fe80::200:ff:fe00:ff01 && icmp6.type == 128 && icmp6.code == 0), 
action=(ip6.dst <-> ip6.src; ip.ttl = 255; icmp6.type = 129; flags.loopback = 
1; next; )
   table=??(lr_in_ip_input     ), priority=90   , match=(ip6.dst == 
fe80::200:ff:fe00:ff02 && icmp6.type == 128 && icmp6.code == 0), 
action=(ip6.dst <-> ip6.src; ip.ttl = 255; icmp6.type = 129; flags.loopback = 
1; next; )
   table=??(lr_in_ip_input     ), priority=90   , match=(ip6.dst == 
fe80::200:ff:fe00:ff03 && icmp6.type == 128 && icmp6.code == 0), 
action=(ip6.dst <-> ip6.src; ip.ttl = 255; icmp6.type = 129; flags.loopback = 
1; next; )
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.100), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.110), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.120), action=(drop;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.100 && 
is_chassis_resident("cr-lr0-public")), action=(eth.dst = eth.src; eth.src = 
xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; 
output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.110 && 
is_chassis_resident("sw0-port1")), action=(eth.dst = eth.src; eth.src = 
30:54:00:00:00:03; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
30:54:00:00:00:03; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; 
output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.120 && 
is_chassis_resident("cr-lr0-public")), action=(eth.dst = eth.src; eth.src = 
xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; 
output;)
@@ -14372,10 +14330,6 @@ AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" 
-e "10.0.0.3" -e "20.0.0.3
   table=??(lr_in_dnat         ), priority=100  , match=(ip && ip4.dst == 
172.168.0.110 && inport == "lr0-public"), action=(ct_dnat(10.0.0.3);)
   table=??(lr_in_dnat         ), priority=100  , match=(ip && ip4.dst == 
172.168.0.120 && inport == "lr0-public" && 
is_chassis_resident("cr-lr0-public")), action=(ct_dnat(20.0.0.3);)
   table=??(lr_in_gw_redirect  ), priority=100  , match=(ip4.src == 10.0.0.3 && 
outport == "lr0-public" && is_chassis_resident("sw0-port1")), action=(eth.src = 
30:54:00:00:00:03; reg5 = 172.168.0.110; next;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.168.0.110), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op 
= 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.168.0.120), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op 
= 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.110), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.120), action=(drop;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.110 && 
is_chassis_resident("sw0-port1")), action=(eth.dst = eth.src; eth.src = 
30:54:00:00:00:03; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
30:54:00:00:00:03; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; 
output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.120 && 
is_chassis_resident("cr-lr0-public")), action=(eth.dst = eth.src; eth.src = 
xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; 
output;)
   table=??(lr_in_unsnat       ), priority=100  , match=(ip && ip4.dst == 
172.168.0.110 && inport == "lr0-public"), action=(ct_snat;)
@@ -14431,9 +14385,9 @@ AT_CHECK([grep "lr_in_ip_input" lr0flows | 
ovn_strip_lflows], [0], [dnl
   table=??(lr_in_ip_input     ), priority=30   , match=(inport == "lr0-sw0" && 
ip6 && ip.ttl == {0, 1} && !ip.later_frag), action=(icmp6 {eth.dst <-> eth.src; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff01; ip.ttl = 254; icmp6.type = 
3; /* Time exceeded */ icmp6.code = 0; /* TTL exceeded in transit */ outport = 
"lr0-sw0"; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=30   , match=(inport == "lr0-sw1" && 
ip4 && ip.ttl == {0, 1} && !ip.later_frag), action=(icmp4 {eth.dst <-> eth.src; 
icmp4.type = 11; /* Time exceeded */ icmp4.code = 0; /* TTL exceeded in transit 
*/ ip4.dst = ip4.src; ip4.src = 20.0.0.1; ip.ttl = 254; outport = "lr0-sw1"; 
flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=30   , match=(inport == "lr0-sw1" && 
ip6 && ip.ttl == {0, 1} && !ip.later_frag), action=(icmp6 {eth.dst <-> eth.src; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff03; ip.ttl = 254; icmp6.type = 
3; /* Time exceeded */ icmp6.code = 0; /* TTL exceeded in transit */ outport = 
"lr0-sw1"; flags.loopback = 1; output; };)
-  table=??(lr_in_ip_input     ), priority=31   , match=(inport == "lr0-public" 
&& ip4 && ip4.src == 172.168.0.0/24 && ip.ttl == {0, 1} && !ip.later_frag), 
action=(icmp4 {eth.dst <-> eth.src; icmp4.type = 11; /* Time exceeded */ 
icmp4.code = 0; /* TTL exceeded in transit */ ip4.dst <-> ip4.src ; ip.ttl = 
254; outport = "lr0-public"; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=31   , match=(inport == "lr0-sw0" && 
ip4 && ip4.src == 10.0.0.0/24 && ip.ttl == {0, 1} && !ip.later_frag), 
action=(icmp4 {eth.dst <-> eth.src; icmp4.type = 11; /* Time exceeded */ 
icmp4.code = 0; /* TTL exceeded in transit */ ip4.dst = ip4.src; ip4.src = 
10.0.0.1 ; ip.ttl = 254; outport = "lr0-sw0"; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=31   , match=(inport == "lr0-sw1" && 
ip4 && ip4.src == 20.0.0.0/24 && ip.ttl == {0, 1} && !ip.later_frag), 
action=(icmp4 {eth.dst <-> eth.src; icmp4.type = 11; /* Time exceeded */ 
icmp4.code = 0; /* TTL exceeded in transit */ ip4.dst = ip4.src; ip4.src = 
20.0.0.1 ; ip.ttl = 254; outport = "lr0-sw1"; flags.loopback = 1; output; };)
+  table=??(lr_in_ip_input     ), priority=31   , 
match=(is_chassis_resident("cr-lr0-public") && inport == "lr0-public" && ip4 && 
ip4.src == 172.168.0.0/24 && ip.ttl == {0, 1} && !ip.later_frag), action=(icmp4 
{eth.dst <-> eth.src; icmp4.type = 11; /* Time exceeded */ icmp4.code = 0; /* 
TTL exceeded in transit */ ip4.dst <-> ip4.src ; ip.ttl = 254; outport = 
"lr0-public"; flags.loopback = 1; output; };)
   table=??(lr_in_ip_input     ), priority=32   , match=(ip.ttl == {0, 1} && 
!ip.later_frag && (ip4.mcast || ip6.mcast)), action=(drop;)
   table=??(lr_in_ip_input     ), priority=50   , match=(eth.bcast), 
action=(drop;)
   table=??(lr_in_ip_input     ), priority=60   , match=(ip4.dst == 
{10.0.0.1}), action=(drop;)
@@ -14618,10 +14572,6 @@ AT_CHECK([grep -Fe "172.168.0.110" -e "172.168.0.120" 
-e "10.0.0.3" -e "20.0.0.3
   table=??(lr_in_dnat         ), priority=100  , match=(ip && ip4.dst == 
172.168.0.110 && inport == "lr0-public"), action=(ct_dnat(10.0.0.3);)
   table=??(lr_in_dnat         ), priority=100  , match=(ip && ip4.dst == 
172.168.0.120 && inport == "lr0-public" && 
is_chassis_resident("cr-lr0-public")), action=(ct_dnat(20.0.0.3);)
   table=??(lr_in_gw_redirect  ), priority=100  , match=(ip4.src == 10.0.0.3 && 
outport == "lr0-public" && is_chassis_resident("sw0-port1")), action=(eth.src = 
30:54:00:00:00:03; reg5 = 172.168.0.110; next;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.168.0.110), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op 
= 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=90   , match=(arp.op == 1 && arp.tpa 
== 172.168.0.120), action=(eth.dst = eth.src; eth.src = xreg0[[0..47]]; arp.op 
= 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = xreg0[[0..47]]; arp.tpa <-> 
arp.spa; outport = inport; flags.loopback = 1; output;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.110), action=(drop;)
-  table=??(lr_in_ip_input     ), priority=91   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.120), action=(drop;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.110 && 
is_chassis_resident("sw0-port1")), action=(eth.dst = eth.src; eth.src = 
30:54:00:00:00:03; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
30:54:00:00:00:03; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; 
output;)
   table=??(lr_in_ip_input     ), priority=92   , match=(inport == "lr0-public" 
&& arp.op == 1 && arp.tpa == 172.168.0.120 && 
is_chassis_resident("cr-lr0-public")), action=(eth.dst = eth.src; eth.src = 
xreg0[[0..47]]; arp.op = 2; /* ARP reply */ arp.tha = arp.sha; arp.sha = 
xreg0[[0..47]]; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; 
output;)
   table=??(lr_in_unsnat       ), priority=100  , match=(ip && ip4.dst == 
172.168.0.110 && inport == "lr0-public"), action=(ct_snat;)
-- 
2.43.0


-- 




_'Esta mensagem é direcionada apenas para os endereços constantes no 
cabeçalho inicial. Se você não está listado nos endereços constantes no 
cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa 
mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas estão 
imediatamente anuladas e proibidas'._


* **'Apesar do Magazine Luiza tomar 
todas as precauções razoáveis para assegurar que nenhum vírus esteja 
presente nesse e-mail, a empresa não poderá aceitar a responsabilidade por 
quaisquer perdas ou danos causados por esse e-mail ou por seus anexos'.*



_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to