The commit 1c9e46ab5 removed the outport match from the lflows, which
leads to a problem for gateway routers that have multiple ports
configured with different MTUs. For example, R0 has port P1, P2 and P3.
P2 and P3 both have gateway_mtu configured: P2 mtu = 1400, P3 mtu = 1500.
Below lflows are generated:
  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "P1" && ip4 
&& reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {... icmp4.frag_mtu = 
1400; next(pipeline=ingress, table=0); };)
  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "P1" && ip4 
&& reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {... icmp4.frag_mtu = 
1500; next(pipeline=ingress, table=0); };)

These two lflows have exact same match, but different actions (with
different MTUs). This will result in a random one gets installed by
ovn-controller and the icmp4_error message may contain incorrect mtu.
This patch fixes it by adding the outport back for these flows, so that
mtu that matches the outport setting is used in the generated icmp error
messages.

Another problem of the commit is that the ddlog part used Flow instead
of MeterFlow for the gateway router flows that generates icmp errors,
while the flows for Distributed Gateway Ports use MeterFlow. This patch
also fixes that by combining the DGP and gateway router code using
MeterFlow. The check for DGP and Gateway Router is removed to simplify
the code, because checking the gateway_mtu config should be sufficient,
which also makes it consistent with the flows in the ADMISSION and
IP_INPUT stages where we didn't check DGP and gateway router but only
the gateway_mtu settings.

Fixes: 1c9e46ab5 ("northd: add check_pkt_larger lflows for ingress traffic")
Signed-off-by: Han Zhou <[email protected]>
---
 northd/ovn-northd.8.xml |   7 +-
 northd/ovn-northd.c     |  49 +++++-----
 northd/ovn_northd.dl    | 195 +++++-----------------------------------
 tests/ovn-northd.at     |  48 +++++-----
 4 files changed, 74 insertions(+), 225 deletions(-)

diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
index 08d484760..de4fe90c7 100644
--- a/northd/ovn-northd.8.xml
+++ b/northd/ovn-northd.8.xml
@@ -3756,9 +3756,10 @@ REGBIT_PKT_LARGER = check_pkt_larger(<var>L</var>); next;
       configured with <code>options:gateway_mtu</code> to a valid integer
       value, this table adds the following priority-150 logical flow for each
       logical router port with the match <code>inport == <var>LRP</var>
-      &amp;&amp; REGBIT_PKT_LARGER &amp;&amp; !REGBIT_EGRESS_LOOPBACK</code>,
-      where <var>LRP</var> is the logical router port and applies the following
-      action for ipv4 and ipv6 respectively:
+      &amp;&amp; outport == <var>GW_PORT</var> &amp;&amp; REGBIT_PKT_LARGER
+      &amp;&amp; !REGBIT_EGRESS_LOOPBACK</code>, where <var>LRP</var> is the
+      logical router port and <var>GW_PORT</var> is the gateway port and
+      applies the following action for ipv4 and ipv6 respectively:
     </p>
 
     <pre>
diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
index a0eaa1247..605e33486 100644
--- a/northd/ovn-northd.c
+++ b/northd/ovn-northd.c
@@ -10894,13 +10894,19 @@ build_arp_resolve_flows_for_lrouter_port(
 static void
 build_icmperr_pkt_big_flows(struct ovn_port *op, int mtu, struct hmap *lflows,
                             struct shash *meter_groups, struct ds *match,
-                            struct ds *actions, enum ovn_stage stage)
+                            struct ds *actions, enum ovn_stage stage,
+                            struct ovn_port *outport)
 {
+    char *outport_match = NULL;
+    if (outport) {
+        outport_match = xasprintf("outport == %s && ", outport->json_key);
+    }
+
     if (op->lrp_networks.ipv4_addrs) {
         ds_clear(match);
-        ds_put_format(match,
-                      "inport == %s && ip4 && "REGBIT_PKT_LARGER
-                      " && "REGBIT_EGRESS_LOOPBACK" == 0", op->json_key);
+        ds_put_format(match, "inport == %s && %sip4 && "REGBIT_PKT_LARGER
+                      " && "REGBIT_EGRESS_LOOPBACK" == 0", op->json_key,
+                      outport ? outport_match : "");
 
         ds_clear(actions);
         /* Set icmp4.frag_mtu to gw_mtu */
@@ -10931,8 +10937,9 @@ build_icmperr_pkt_big_flows(struct ovn_port *op, int 
mtu, struct hmap *lflows,
 
     if (op->lrp_networks.ipv6_addrs) {
         ds_clear(match);
-        ds_put_format(match, "inport == %s && ip6 && "REGBIT_PKT_LARGER
-                      " && "REGBIT_EGRESS_LOOPBACK" == 0", op->json_key);
+        ds_put_format(match, "inport == %s && %sip6 && "REGBIT_PKT_LARGER
+                      " && "REGBIT_EGRESS_LOOPBACK" == 0", op->json_key,
+                      outport ? outport_match : "");
 
         ds_clear(actions);
         /* Set icmp6.frag_mtu to gw_mtu */
@@ -10960,6 +10967,9 @@ build_icmperr_pkt_big_flows(struct ovn_port *op, int 
mtu, struct hmap *lflows,
                                         meter_groups),
                                   &op->nbrp->header_);
     }
+    if (outport) {
+        free(outport_match);
+    }
 }
 
 static int
@@ -10999,7 +11009,8 @@ build_check_pkt_len_flows_for_lrp(struct ovn_port *op,
 
     /* ingress traffic */
     build_icmperr_pkt_big_flows(op, gw_mtu, lflows, meter_groups,
-                                match, actions, S_ROUTER_IN_IP_INPUT);
+                                match, actions, S_ROUTER_IN_IP_INPUT,
+                                NULL);
 
     for (size_t i = 0; i < op->od->nbr->n_ports; i++) {
         struct ovn_port *rp = ovn_port_find(ports,
@@ -11010,7 +11021,8 @@ build_check_pkt_len_flows_for_lrp(struct ovn_port *op,
 
         /* egress traffic */
         build_icmperr_pkt_big_flows(rp, gw_mtu, lflows, meter_groups,
-                                    match, actions, S_ROUTER_IN_LARGER_PKTS);
+                                    match, actions, S_ROUTER_IN_LARGER_PKTS,
+                                    op);
     }
 }
 
@@ -11044,21 +11056,14 @@ build_check_pkt_len_flows_for_lrouter(
     ovn_lflow_add(lflows, od, S_ROUTER_IN_LARGER_PKTS, 0, "1",
                   "next;");
 
-    if (od->l3dgw_port && od->l3redirect_port) {
-        /* gw router port */
-        build_check_pkt_len_flows_for_lrp(od->l3dgw_port, lflows,
-                                          ports, meter_groups, match, actions);
-    } else if (smap_get(&od->nbr->options, "chassis")) {
-        for (size_t i = 0; i < od->nbr->n_ports; i++) {
-            /* gw router */
-            struct ovn_port *rp = ovn_port_find(ports,
-                                                od->nbr->ports[i]->name);
-            if (!rp) {
-                continue;
-            }
-            build_check_pkt_len_flows_for_lrp(rp, lflows, ports, meter_groups,
-                                              match, actions);
+    for (size_t i = 0; i < od->nbr->n_ports; i++) {
+        struct ovn_port *rp = ovn_port_find(ports,
+                                            od->nbr->ports[i]->name);
+        if (!rp || !rp->nbrp) {
+            continue;
         }
+        build_check_pkt_len_flows_for_lrp(rp, lflows, ports, meter_groups,
+                                          match, actions);
     }
 }
 
diff --git a/northd/ovn_northd.dl b/northd/ovn_northd.dl
index 091fe10b3..d7141294e 100644
--- a/northd/ovn_northd.dl
+++ b/northd/ovn_northd.dl
@@ -7508,29 +7508,16 @@ for (&Router(._uuid = lr_uuid))
 
 /* Local router ingress table CHK_PKT_LEN: Check packet length.
  *
- * For distributed routers with gateway ports.
- * Any IPv4 or IPv6 packet with outport set to the distributed gateway
- * router port, check the packet length and store the result in the
- * 'REGBIT_PKT_LARGER' register bit.
+ * Any IPv4 or IPv6 packet with outport set to a router port that has
+ * gateway_mtu > 0 configured, check the packet length and store the result in
+ * the 'REGBIT_PKT_LARGER' register bit.
  *
  * Local router ingress table LARGER_PKTS: Handle larger packets.
  *
- * Any IPv4 or IPv6 packet with outport set to the distributed gateway
- * router port and the 'REGBIT_PKT_LARGER' register bit is set,
+ * Any IPv4 or IPv6 packet with outport set to a router port that has
+ * gatway_mtu > 0 configured and the 'REGBIT_PKT_LARGER' register bit is set,
  * generate an ICMPv4/ICMPv6 packet with type 3/2 (Destination
  * Unreachable/Packet Too Big) and code 4/0 (Fragmentation needed).
- *
- * For Gateway routers.
- * Any IPv4 or IPv6 packet with outport set to the router port which has
- * the option 'gateway_mtu' set, check the packet length and store
- * the result in the 'REGBIT_PKT_LARGER' register bit.
- *
- * Local router ingress table LARGER_PKTS: Handle larger packets.
- *
- * Any IPv4 or IPv6 packet with outport set to the router port which has
- * the option 'gateway_mtu' set and the 'REGBIT_PKT_LARGER' register bit
- * is set, generate ICMPv4/ICMPv6 packet with type 3/2 (Destination
- * Unreachable/Packet Too Big) and * code 4/0 (Fragmentation needed).
  */
 Flow(.logical_datapath = lr_uuid,
      .stage            = s_ROUTER_IN_CHK_PKT_LEN(),
@@ -7549,21 +7536,19 @@ Flow(.logical_datapath = lr_uuid,
 Flow(.logical_datapath = lr_uuid,
      .stage            = s_ROUTER_IN_CHK_PKT_LEN(),
      .priority         = 50,
-     .__match          = "outport == ${l3dgw_port_json_name}",
+     .__match          = "outport == ${gw_mtu_rp.json_name}",
      .actions          = "${rEGBIT_PKT_LARGER()} = check_pkt_larger(${mtu}); "
                          "next;",
-     .external_ids     = stage_hint(l3dgw_port._uuid)) :-
+     .external_ids     = stage_hint(gw_mtu_rp.lrp._uuid)) :-
     r in &Router(._uuid = lr_uuid),
-    Some{var l3dgw_port} = r.l3dgw_port,
-    var l3dgw_port_json_name = json_string_escape(l3dgw_port.name),
-    r.redirect_port_name != "",
-    var gw_mtu = l3dgw_port.options.get_int_def("gateway_mtu", 0),
+    gw_mtu_rp in &RouterPort(.router = r),
+    var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
     gw_mtu > 0,
     var mtu = gw_mtu + vLAN_ETH_HEADER_LEN().
 MeteredFlow(.logical_datapath = lr_uuid,
             .stage            = s_ROUTER_IN_LARGER_PKTS(),
             .priority         = 150,
-            .__match          = "inport == ${rp.json_name} && ip4 && "
+            .__match          = "inport == ${rp.json_name} && outport == 
${gw_mtu_rp.json_name} && ip4 && "
                                 "${rEGBIT_PKT_LARGER()} && 
${rEGBIT_EGRESS_LOOPBACK()} == 0",
             .actions          = "icmp4_error {"
                                 "${rEGBIT_EGRESS_LOOPBACK()} = 1; "
@@ -7582,13 +7567,12 @@ MeteredFlow(.logical_datapath = lr_uuid,
             .controller_meter = r.copp.get(cOPP_ICMP4_ERR()),
             .external_ids     = stage_hint(rp.lrp._uuid)) :-
     r in &Router(._uuid = lr_uuid),
-    Some{var l3dgw_port} = r.l3dgw_port,
-    var l3dgw_port_json_name = json_string_escape(l3dgw_port.name),
-    r.redirect_port_name != "",
-    var gw_mtu = l3dgw_port.options.get_int_def("gateway_mtu", 0),
+    gw_mtu_rp in &RouterPort(.router = r),
+    var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
     gw_mtu > 0,
+    var mtu = gw_mtu + vLAN_ETH_HEADER_LEN(),
     rp in &RouterPort(.router = r),
-    rp.lrp != l3dgw_port,
+    rp.lrp != gw_mtu_rp.lrp,
     Some{var first_ipv4} = rp.networks.ipv4_addrs.nth(0).
 
 MeteredFlow(.logical_datapath = lr_uuid,
@@ -7613,19 +7597,18 @@ MeteredFlow(.logical_datapath = lr_uuid,
             .controller_meter = r.copp.get(cOPP_ICMP4_ERR()),
             .external_ids     = stage_hint(rp.lrp._uuid)) :-
     r in &Router(._uuid = lr_uuid),
-    Some{var l3dgw_port} = r.l3dgw_port,
-    var l3dgw_port_json_name = json_string_escape(l3dgw_port.name),
-    r.redirect_port_name != "",
-    var gw_mtu = l3dgw_port.options.get_int_def("gateway_mtu", 0),
+    gw_mtu_rp in &RouterPort(.router = r),
+    var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
     gw_mtu > 0,
+    var mtu = gw_mtu + vLAN_ETH_HEADER_LEN(),
     rp in &RouterPort(.router = r),
-    rp.lrp == l3dgw_port,
+    rp.lrp == gw_mtu_rp.lrp,
     Some{var first_ipv4} = rp.networks.ipv4_addrs.nth(0).
 
 MeteredFlow(.logical_datapath = lr_uuid,
             .stage            = s_ROUTER_IN_LARGER_PKTS(),
             .priority         = 150,
-            .__match          = "inport == ${rp.json_name} && ip6 && "
+            .__match          = "inport == ${rp.json_name} && outport == 
${gw_mtu_rp.json_name} && ip6 && "
                                 "${rEGBIT_PKT_LARGER()} && 
${rEGBIT_EGRESS_LOOPBACK()} == 0",
             .actions          = "icmp6_error {"
                                 "${rEGBIT_EGRESS_LOOPBACK()} = 1; "
@@ -7644,13 +7627,12 @@ MeteredFlow(.logical_datapath = lr_uuid,
             .controller_meter = r.copp.get(cOPP_ICMP6_ERR()),
             .external_ids     = stage_hint(rp.lrp._uuid)) :-
     r in &Router(._uuid = lr_uuid),
-    Some{var l3dgw_port} = r.l3dgw_port,
-    var l3dgw_port_json_name = json_string_escape(l3dgw_port.name),
-    r.redirect_port_name != "",
-    var gw_mtu = l3dgw_port.options.get_int_def("gateway_mtu", 0),
+    gw_mtu_rp in &RouterPort(.router = r),
+    var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
     gw_mtu > 0,
+    var mtu = gw_mtu + vLAN_ETH_HEADER_LEN(),
     rp in &RouterPort(.router = r),
-    rp.lrp != l3dgw_port,
+    rp.lrp != gw_mtu_rp.lrp,
     Some{var first_ipv6} = rp.networks.ipv6_addrs.nth(0).
 
 MeteredFlow(.logical_datapath = lr_uuid,
@@ -7675,137 +7657,6 @@ MeteredFlow(.logical_datapath = lr_uuid,
             .controller_meter = r.copp.get(cOPP_ICMP6_ERR()),
             .external_ids     = stage_hint(rp.lrp._uuid)) :-
     r in &Router(._uuid = lr_uuid),
-    Some{var l3dgw_port} = r.l3dgw_port,
-    var l3dgw_port_json_name = json_string_escape(l3dgw_port.name),
-    r.redirect_port_name != "",
-    var gw_mtu = l3dgw_port.options.get_int_def("gateway_mtu", 0),
-    gw_mtu > 0,
-    rp in &RouterPort(.router = r),
-    rp.lrp == l3dgw_port,
-    Some{var first_ipv6} = rp.networks.ipv6_addrs.nth(0).
-
-/* Gateway routers. */
-Flow(.logical_datapath = lr_uuid,
-     .stage            = s_ROUTER_IN_CHK_PKT_LEN(),
-     .priority         = 50,
-     .__match          = "outport == ${gw_mtu_rp.json_name}",
-     .actions          = "${rEGBIT_PKT_LARGER()} = check_pkt_larger(${mtu}); "
-                         "next;",
-     .external_ids     = stage_hint(gw_mtu_rp.lrp._uuid)) :-
-    r in &Router(._uuid = lr_uuid),
-    r.is_gateway,
-    gw_mtu_rp in &RouterPort(.router = r),
-    var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
-    gw_mtu > 0,
-    var mtu = gw_mtu + vLAN_ETH_HEADER_LEN().
-Flow(.logical_datapath = lr_uuid,
-     .stage            = s_ROUTER_IN_LARGER_PKTS(),
-     .priority         = 150,
-     .__match          = "inport == ${rp.json_name} && ip4 && "
-                         "${rEGBIT_PKT_LARGER()} && 
${rEGBIT_EGRESS_LOOPBACK()} == 0",
-     .actions          = "icmp4_error {"
-                         "${rEGBIT_EGRESS_LOOPBACK()} = 1; "
-                         "${rEGBIT_PKT_LARGER()} = 0; "
-                         "eth.dst = ${rp.networks.ea}; "
-                         "ip4.dst = ip4.src; "
-                         "ip4.src = ${first_ipv4.addr}; "
-                         "ip.ttl = 255; "
-                         "icmp4.type = 3; /* Destination Unreachable. */ "
-                         "icmp4.code = 4; /* Frag Needed and DF was Set. */ "
-                         /* Set icmp4.frag_mtu to gw_mtu */
-                         "icmp4.frag_mtu = ${gw_mtu}; "
-                         "next(pipeline=ingress, table=0); "
-                         "};",
-     .external_ids     = stage_hint(rp.lrp._uuid)) :-
-    r in &Router(._uuid = lr_uuid),
-    r.is_gateway,
-    gw_mtu_rp in &RouterPort(.router = r),
-    var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
-    gw_mtu > 0,
-    var mtu = gw_mtu + vLAN_ETH_HEADER_LEN(),
-    rp in &RouterPort(.router = r),
-    rp.lrp != gw_mtu_rp.lrp,
-    Some{var first_ipv4} = rp.networks.ipv4_addrs.nth(0).
-
-Flow(.logical_datapath = lr_uuid,
-     .stage            = s_ROUTER_IN_IP_INPUT(),
-     .priority         = 150,
-     .__match          = "inport == ${rp.json_name} && ip4 && "
-                         "${rEGBIT_PKT_LARGER()} && 
${rEGBIT_EGRESS_LOOPBACK()} == 0",
-     .actions          = "icmp4_error {"
-                         "${rEGBIT_EGRESS_LOOPBACK()} = 1; "
-                         "${rEGBIT_PKT_LARGER()} = 0; "
-                         "eth.dst = ${rp.networks.ea}; "
-                         "ip4.dst = ip4.src; "
-                         "ip4.src = ${first_ipv4.addr}; "
-                         "ip.ttl = 255; "
-                         "icmp4.type = 3; /* Destination Unreachable. */ "
-                         "icmp4.code = 4; /* Frag Needed and DF was Set. */ "
-                         /* Set icmp4.frag_mtu to gw_mtu */
-                         "icmp4.frag_mtu = ${gw_mtu}; "
-                         "next(pipeline=ingress, table=0); "
-                         "};",
-     .external_ids     = stage_hint(rp.lrp._uuid)) :-
-    r in &Router(._uuid = lr_uuid),
-    r.is_gateway,
-    gw_mtu_rp in &RouterPort(.router = r),
-    var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
-    gw_mtu > 0,
-    var mtu = gw_mtu + vLAN_ETH_HEADER_LEN(),
-    rp in &RouterPort(.router = r),
-    rp.lrp == gw_mtu_rp.lrp,
-    Some{var first_ipv4} = rp.networks.ipv4_addrs.nth(0).
-
-Flow(.logical_datapath = lr_uuid,
-     .stage            = s_ROUTER_IN_LARGER_PKTS(),
-     .priority         = 150,
-     .__match          = "inport == ${rp.json_name} && ip6 && "
-                         "${rEGBIT_PKT_LARGER()} && 
${rEGBIT_EGRESS_LOOPBACK()} == 0",
-     .actions          = "icmp6_error {"
-                         "${rEGBIT_EGRESS_LOOPBACK()} = 1; "
-                         "${rEGBIT_PKT_LARGER()} = 0; "
-                         "eth.dst = ${rp.networks.ea}; "
-                         "ip6.dst = ip6.src; "
-                         "ip6.src = ${first_ipv6.addr}; "
-                         "ip.ttl = 255; "
-                         "icmp6.type = 2; /* Packet Too Big. */ "
-                         "icmp6.code = 0; "
-                         /* Set icmp6.frag_mtu to gw_mtu */
-                         "icmp6.frag_mtu = ${gw_mtu}; "
-                         "next(pipeline=ingress, table=0); "
-                         "};",
-     .external_ids     = stage_hint(rp.lrp._uuid)) :-
-    r in &Router(._uuid = lr_uuid),
-    r.is_gateway,
-    gw_mtu_rp in &RouterPort(.router = r),
-    var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
-    gw_mtu > 0,
-    var mtu = gw_mtu + vLAN_ETH_HEADER_LEN(),
-    rp in &RouterPort(.router = r),
-    rp.lrp != gw_mtu_rp.lrp,
-    Some{var first_ipv6} = rp.networks.ipv6_addrs.nth(0).
-
-Flow(.logical_datapath = lr_uuid,
-     .stage            = s_ROUTER_IN_IP_INPUT(),
-     .priority         = 150,
-     .__match          = "inport == ${rp.json_name} && ip6 && "
-                         "${rEGBIT_PKT_LARGER()} && 
${rEGBIT_EGRESS_LOOPBACK()} == 0",
-     .actions          = "icmp6_error {"
-                         "${rEGBIT_EGRESS_LOOPBACK()} = 1; "
-                         "${rEGBIT_PKT_LARGER()} = 0; "
-                         "eth.dst = ${rp.networks.ea}; "
-                         "ip6.dst = ip6.src; "
-                         "ip6.src = ${first_ipv6.addr}; "
-                         "ip.ttl = 255; "
-                         "icmp6.type = 2; /* Packet Too Big. */ "
-                         "icmp6.code = 0; "
-                         /* Set icmp6.frag_mtu to gw_mtu */
-                         "icmp6.frag_mtu = ${gw_mtu}; "
-                         "next(pipeline=ingress, table=0); "
-                         "};",
-     .external_ids     = stage_hint(rp.lrp._uuid)) :-
-    r in &Router(._uuid = lr_uuid),
-    r.is_gateway,
     gw_mtu_rp in &RouterPort(.router = r),
     var gw_mtu = gw_mtu_rp.lrp.options.get_int_def("gateway_mtu", 0),
     gw_mtu > 0,
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 474e88021..2098b1c19 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -4865,10 +4865,10 @@ AT_CHECK([grep -e "chk_pkt_len" -e "lr_in_larger_pkts" 
lr0flows | sort], [0], [d
   table=15(lr_in_chk_pkt_len  ), priority=0    , match=(1), action=(next;)
   table=15(lr_in_chk_pkt_len  ), priority=50   , match=(outport == 
"lr0-public"), action=(reg9[[1]] = check_pkt_larger(1518); next;)
   table=16(lr_in_larger_pkts  ), priority=0    , match=(1), action=(next;)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; ip4.dst = ip4.src; ip4.src = 
10.0.0.1; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; ip6.dst = ip6.src; ip6.src = 
fe80::200:ff:fe00:ff01; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip4.dst = ip4.src; ip4.src = 
20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip6.dst = ip6.src; ip6.src = 
fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; 
ip4.dst = ip4.src; ip4.src = 10.0.0.1; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff01; ip.ttl = 255; icmp6.type = 
2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip4.dst = ip4.src; ip4.src = 20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 
2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
 ])
 
 AT_CHECK([grep -E "lr_in_admission.*check_pkt_larger" lr0flows | sort], [0], 
[dnl
@@ -4886,14 +4886,6 @@ AT_CHECK([grep -E "lr_in_ip_input.*icmp6_error" lr0flows 
| sort], [0], [dnl
 # Clear the gateway-chassis for lr0-public
 check ovn-nbctl --wait=sb clear logical_router_port lr0-public gateway_chassis
 
-ovn-sbctl dump-flows lr0 > lr0flows
-AT_CAPTURE_FILE([sw0flows])
-
-AT_CHECK([grep -e "chk_pkt_len" -e "lr_in_larger_pkts" lr0flows | sort], [0], 
[dnl
-  table=15(lr_in_chk_pkt_len  ), priority=0    , match=(1), action=(next;)
-  table=16(lr_in_larger_pkts  ), priority=0    , match=(1), action=(next;)
-])
-
 # Make lr0 as a gateway router.
 check ovn-nbctl --wait=sb set logical_router lr0 options:chassis=ch1
 
@@ -4904,10 +4896,10 @@ AT_CHECK([grep -e "chk_pkt_len" -e "lr_in_larger_pkts" 
lr0flows | sort], [0], [d
   table=15(lr_in_chk_pkt_len  ), priority=0    , match=(1), action=(next;)
   table=15(lr_in_chk_pkt_len  ), priority=50   , match=(outport == 
"lr0-public"), action=(reg9[[1]] = check_pkt_larger(1518); next;)
   table=16(lr_in_larger_pkts  ), priority=0    , match=(1), action=(next;)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; ip4.dst = ip4.src; ip4.src = 
10.0.0.1; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; ip6.dst = ip6.src; ip6.src = 
fe80::200:ff:fe00:ff01; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip4.dst = ip4.src; ip4.src = 
20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip6.dst = ip6.src; ip6.src = 
fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; 
ip4.dst = ip4.src; ip4.src = 10.0.0.1; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff01; ip.ttl = 255; icmp6.type = 
2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip4.dst = ip4.src; ip4.src = 20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 
2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
 ])
 
 AT_CHECK([grep -E "lr_in_admission.*check_pkt_larger" lr0flows | sort], [0], 
[dnl
@@ -4933,14 +4925,14 @@ AT_CHECK([grep -e "chk_pkt_len" -e "lr_in_larger_pkts" 
lr0flows | sort], [0], [d
   table=15(lr_in_chk_pkt_len  ), priority=50   , match=(outport == 
"lr0-public"), action=(reg9[[1]] = check_pkt_larger(1518); next;)
   table=15(lr_in_chk_pkt_len  ), priority=50   , match=(outport == "lr0-sw0"), 
action=(reg9[[1]] = check_pkt_larger(1418); next;)
   table=16(lr_in_larger_pkts  ), priority=0    , match=(1), action=(next;)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-public" 
&& ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:20:20:12:13; ip4.dst = ip4.src; ip4.src = 
172.168.0.100; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1400; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-public" 
&& ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:20:20:12:13; ip6.dst = ip6.src; ip6.src = 
fe80::200:20ff:fe20:1213; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; ip4.dst = ip4.src; ip4.src = 
10.0.0.1; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; ip6.dst = ip6.src; ip6.src = 
fe80::200:ff:fe00:ff01; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip4.dst = ip4.src; ip4.src = 
20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1400; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip4.dst = ip4.src; ip4.src = 
20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip6.dst = ip6.src; ip6.src = 
fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip6.dst = ip6.src; ip6.src = 
fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-public" 
&& outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:20:20:12:13; 
ip4.dst = ip4.src; ip4.src = 172.168.0.100; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-public" 
&& outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:20:20:12:13; 
ip6.dst = ip6.src; ip6.src = fe80::200:20ff:fe20:1213; ip.ttl = 255; icmp6.type 
= 2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1400; 
next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; 
ip4.dst = ip4.src; ip4.src = 10.0.0.1; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw0" && 
outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:01; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff01; ip.ttl = 255; icmp6.type = 
2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip4.dst = ip4.src; ip4.src = 20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 
2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1500; 
next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip4.dst = ip4.src; ip4.src = 20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 
2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1400; 
next(pipeline=ingress, table=0); };)
 ])
 
 AT_CHECK([grep -E "lr_in_admission.*check_pkt_larger" lr0flows | sort], [0], 
[dnl
@@ -4968,10 +4960,10 @@ AT_CHECK([grep -e "chk_pkt_len" -e "lr_in_larger_pkts" 
lr0flows | sort], [0], [d
   table=15(lr_in_chk_pkt_len  ), priority=0    , match=(1), action=(next;)
   table=15(lr_in_chk_pkt_len  ), priority=50   , match=(outport == "lr0-sw0"), 
action=(reg9[[1]] = check_pkt_larger(1418); next;)
   table=16(lr_in_larger_pkts  ), priority=0    , match=(1), action=(next;)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-public" 
&& ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:20:20:12:13; ip4.dst = ip4.src; ip4.src = 
172.168.0.100; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1400; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-public" 
&& ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:20:20:12:13; ip6.dst = ip6.src; ip6.src = 
fe80::200:20ff:fe20:1213; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip4 && reg9[[1]] && reg9[[0]] == 0), action=(icmp4_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip4.dst = ip4.src; ip4.src = 
20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* Destination Unreachable. */ 
icmp4.code = 4; /* Frag Needed and DF was Set. */ icmp4.frag_mtu = 1400; 
next(pipeline=ingress, table=0); };)
-  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
ip6 && reg9[[1]] && reg9[[0]] == 0), action=(icmp6_error {reg9[[0]] = 1; 
reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; ip6.dst = ip6.src; ip6.src = 
fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ 
icmp6.code = 0; icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-public" 
&& outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:20:20:12:13; 
ip4.dst = ip4.src; ip4.src = 172.168.0.100; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-public" 
&& outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:20:20:12:13; 
ip6.dst = ip6.src; ip6.src = fe80::200:20ff:fe20:1213; ip.ttl = 255; icmp6.type 
= 2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1400; 
next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp4_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip4.dst = ip4.src; ip4.src = 20.0.0.1; ip.ttl = 255; icmp4.type = 3; /* 
Destination Unreachable. */ icmp4.code = 4; /* Frag Needed and DF was Set. */ 
icmp4.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
+  table=16(lr_in_larger_pkts  ), priority=150  , match=(inport == "lr0-sw1" && 
outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0), 
action=(icmp6_error {reg9[[0]] = 1; reg9[[1]] = 0; eth.dst = 00:00:00:00:ff:02; 
ip6.dst = ip6.src; ip6.src = fe80::200:ff:fe00:ff02; ip.ttl = 255; icmp6.type = 
2; /* Packet Too Big. */ icmp6.code = 0; icmp6.frag_mtu = 1400; 
next(pipeline=ingress, table=0); };)
 ])
 
 AT_CLEANUP
-- 
2.30.2


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

Reply via email to