[ovs-dev] [PATCH ovn v2 1/2] ovn-northd: Match outport for lflows in ROUTER_IN_LARGER_PKTS.

Lorenzo Bianconi lorenzo.bianconi at redhat.com
Thu Aug 5 17:09:51 UTC 2021


> 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 <hzhou at ovn.org>

Hi Han,

I have not run any test yet, but the code seems fine to me.

Regards,
Lorenzo

> ---
>  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>
> -      && REGBIT_PKT_LARGER && !REGBIT_EGRESS_LOOPBACK</code>,
> -      where <var>LRP</var> is the logical router port and applies the following
> -      action for ipv4 and ipv6 respectively:
> +      && outport == <var>GW_PORT</var> && REGBIT_PKT_LARGER
> +      && !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
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> 


More information about the dev mailing list