On 1/29/24 07:20, Ales Musil wrote:
> Considering following topology:
> client - sw0 - lrp0 - lr - lrp1 - sw1 - server
> sw0 in subnet 192.168.0.0/24
> sw1 in subnet 172.168.0.0/24
> SNAT configured for client
> gateway_mtu=1400 configured for lrp0
>
> If we send UDP traffic from client to server
> and server responds with packet bigger than 1400
> the following sequence will happen:
>
> 1) Packet is coming into lr via lrp1
> 2) unSNAT
> 3) Routing, the outport will be set to lrp0
> 4) Check for packet larger will fail
> 5) We will generate ICMP need frag
>
> However, the last step is wrong from the server
> perspective. The ICMP message will have IP source
> address = lrp1 IP address. Which means that SNAT won't
> happen because the source is not within the sw0 subnet,
> but the inner packet has sw0 subnet address, because it
> was unSNATted. This results in server ignoring the ICMP
> message because server never sent any packet to the
> sw0 subnet.
>
> In order to prevent this issue perform SNAT for the
> ICMP packet. Because the packet is related to already
> existing connection we just need to perform
> ct_commit_nat(snat) action.
>
> This is achieved with addition of the following flow for
> "lr_in_larger_pkts" stage (the flow for IPv6 is the in
> regard to the addition):
>
> match=(inport == "INPORT" && outport == "OUTPORT" && ip4 && REGBIT_PKT_LARGER
> && REGBIT_EGRESS_LOOPBACK == 0 && ct.trk && ct.rpl && ct.dnat),
> action=(icmp4_error {flags.icmp_snat = 1; REGBIT_EGRESS_LOOPBACK = 1;
> REGBIT_PKT_LARGER = 0; eth.dst = ETH_DST; ip4.dst = ip4.src; ip4.src =
> IP_SRC; 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); };)
>
> Also, add flow to "lr_out_post_snat" stage:
>
> match=(icmp && flags.icmp_snat == 1), action=(ct_commit_nat(snat);)
>
> Partially revert 0e49f49c73d6 ("northd: Allow need frag to be SNATed")
> which attempted to fix the same issue in a wrong way.
>
> Also add feature flag for the updated ct_commit_nat action.
> In case there is an update of northd to newer version before all
> controllers are updated.
>
> Fixes: 0e49f49c73d6 ("northd: Allow need frag to be SNATed")
> Reported-at: https://issues.redhat.com/browse/FDP-134
> Reported-at: https://issues.redhat.com/browse/FDP-159
> Signed-off-by: Ales Musil <[email protected]>
> Acked-by: Dumitru Ceara <[email protected]>
> ---
> v3: Rebase on top of current main.
> v2: Rebase on top of current main.
> Squash the 2/3 and 3/3 from previous version to single commit.
> Add ack from Dumitru.
> ---
Hi Ales,
Before accepting this patch I'd like to try to clarify one thing that
was flagged as a potential issue by Numan (ct.dnat), please see below.
> controller/chassis.c | 8 ++
> include/ovn/features.h | 1 +
> include/ovn/logical-fields.h | 3 +
> lib/logical-fields.c | 4 +
> northd/northd.c | 192 ++++++++++++++++++++---------------
> northd/northd.h | 1 +
> tests/ovn-northd.at | 118 ++++++++++++++-------
> tests/ovn.at | 6 +-
> tests/system-ovn-kmod.at | 3 +-
> 9 files changed, 214 insertions(+), 122 deletions(-)
>
> diff --git a/controller/chassis.c b/controller/chassis.c
> index a6f13ccc4..ba2e57238 100644
> --- a/controller/chassis.c
> +++ b/controller/chassis.c
> @@ -370,6 +370,7 @@ chassis_build_other_config(const struct ovs_chassis_cfg
> *ovs_cfg,
> smap_replace(config, OVN_FEATURE_CT_LB_RELATED, "true");
> smap_replace(config, OVN_FEATURE_FDB_TIMESTAMP, "true");
> smap_replace(config, OVN_FEATURE_LS_DPG_COLUMN, "true");
> + smap_replace(config, OVN_FEATURE_CT_COMMIT_NAT_V2, "true");
> }
>
> /*
> @@ -509,6 +510,12 @@ chassis_other_config_changed(const struct
> ovs_chassis_cfg *ovs_cfg,
> return true;
> }
>
> + if (!smap_get_bool(&chassis_rec->other_config,
> + OVN_FEATURE_CT_COMMIT_NAT_V2,
> + false)) {
> + return true;
> + }
> +
> return false;
> }
>
> @@ -640,6 +647,7 @@ update_supported_sset(struct sset *supported)
> sset_add(supported, OVN_FEATURE_CT_LB_RELATED);
> sset_add(supported, OVN_FEATURE_FDB_TIMESTAMP);
> sset_add(supported, OVN_FEATURE_LS_DPG_COLUMN);
> + sset_add(supported, OVN_FEATURE_CT_COMMIT_NAT_V2);
> }
>
> static void
> diff --git a/include/ovn/features.h b/include/ovn/features.h
> index 2c47ab766..08f1d8288 100644
> --- a/include/ovn/features.h
> +++ b/include/ovn/features.h
> @@ -27,6 +27,7 @@
> #define OVN_FEATURE_CT_LB_RELATED "ovn-ct-lb-related"
> #define OVN_FEATURE_FDB_TIMESTAMP "fdb-timestamp"
> #define OVN_FEATURE_LS_DPG_COLUMN "ls-dpg-column"
> +#define OVN_FEATURE_CT_COMMIT_NAT_V2 "ct-commit-nat-v2"
>
> /* OVS datapath supported features. Based on availability OVN might generate
> * different types of openflows.
> diff --git a/include/ovn/logical-fields.h b/include/ovn/logical-fields.h
> index e8e0e6d33..f07c4c42e 100644
> --- a/include/ovn/logical-fields.h
> +++ b/include/ovn/logical-fields.h
> @@ -79,6 +79,7 @@ enum mff_log_flags_bits {
> MLF_USE_LB_AFF_SESSION_BIT = 14,
> MLF_LOCALNET_BIT = 15,
> MLF_RX_FROM_TUNNEL_BIT = 16,
> + MLF_ICMP_SNAT_BIT = 17,
> };
>
> /* MFF_LOG_FLAGS_REG flag assignments */
> @@ -132,6 +133,8 @@ enum mff_log_flags {
>
> /* Indicate the packet has been received from the tunnel. */
> MLF_RX_FROM_TUNNEL = (1 << MLF_RX_FROM_TUNNEL_BIT),
> +
> + MLF_ICMP_SNAT = (1 << MLF_ICMP_SNAT_BIT),
> };
>
> /* OVN logical fields
> diff --git a/lib/logical-fields.c b/lib/logical-fields.c
> index 662c1ef0e..20219a67a 100644
> --- a/lib/logical-fields.c
> +++ b/lib/logical-fields.c
> @@ -132,6 +132,10 @@ ovn_init_symtab(struct shash *symtab)
> snprintf(flags_str, sizeof flags_str, "flags[%d]",
> MLF_LOCALNET_BIT);
> expr_symtab_add_subfield(symtab, "flags.localnet", NULL,
> + flags_str);
> + snprintf(flags_str, sizeof flags_str, "flags[%d]",
> + MLF_ICMP_SNAT_BIT);
> + expr_symtab_add_subfield(symtab, "flags.icmp_snat", NULL,
> flags_str);
> snprintf(flags_str, sizeof flags_str, "flags[%d]",
> MLF_RX_FROM_TUNNEL_BIT);
> expr_symtab_add_subfield(symtab, "flags.tunnel_rx", NULL, flags_str);
> diff --git a/northd/northd.c b/northd/northd.c
> index bb028f2ef..222143220 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -501,6 +501,15 @@ build_chassis_features(const struct sbrec_chassis_table
> *sbrec_chassis_table,
> chassis_features->ls_dpg_column) {
> chassis_features->ls_dpg_column = false;
> }
> +
> + bool ct_commit_nat_v2 =
> + smap_get_bool(&chassis->other_config,
> + OVN_FEATURE_CT_COMMIT_NAT_V2,
> + false);
> + if (!ct_commit_nat_v2 &&
> + chassis_features->ct_commit_nat_v2) {
> + chassis_features->ct_commit_nat_v2 = false;
> + }
> }
> }
>
> @@ -14132,96 +14141,103 @@ build_arp_resolve_flows_for_lsp(
> }
> }
>
> +#define ICMP4_NEED_FRAG_FORMAT \
> + "icmp4_error {" \
> + "%s" \
> + REGBIT_EGRESS_LOOPBACK" = 1; " \
> + REGBIT_PKT_LARGER" = 0; " \
> + "eth.dst = %s; " \
> + "ip4.dst = ip4.src; " \
> + "ip4.src = %s; " \
> + "ip.ttl = 255; " \
> + "icmp4.type = 3; /* Destination Unreachable. */ " \
> + "icmp4.code = 4; /* Frag Needed and DF was Set. */ " \
> + "icmp4.frag_mtu = %d; " \
> + "next(pipeline=ingress, table=%d); };" \
> +
> +#define ICMP6_NEED_FRAG_FORMAT \
> + "icmp6_error {" \
> + "%s" \
> + REGBIT_EGRESS_LOOPBACK" = 1; " \
> + REGBIT_PKT_LARGER" = 0; " \
> + "eth.dst = %s; " \
> + "ip6.dst = ip6.src; " \
> + "ip6.src = %s; " \
> + "ip.ttl = 255; " \
> + "icmp6.type = 2; /* Packet Too Big. */ " \
> + "icmp6.code = 0; " \
> + "icmp6.frag_mtu = %d; " \
> + "next(pipeline=ingress, table=%d); };"
> +
> static void
> -build_icmperr_pkt_big_flows(struct ovn_port *op, int mtu, struct hmap
> *lflows,
> - const struct shash *meter_groups, struct ds
> *match,
> - struct ds *actions, enum ovn_stage stage,
> - struct ovn_port *outport)
> -{
> - char *outport_match = outport ? xasprintf("outport == %s && ",
> - outport->json_key)
> - : NULL;
> +create_icmp_need_frag_lflow(const struct ovn_port *op, int mtu,
> + struct ds *actions, struct ds *match,
> + const char *meter, struct hmap *lflows,
> + enum ovn_stage stage, uint16_t priority,
> + bool is_ipv6, const char *extra_match,
> + const char *extra_action)
> +{
> + if ((is_ipv6 && !op->lrp_networks.ipv6_addrs) ||
> + (!is_ipv6 && !op->lrp_networks.ipv4_addrs)) {
> + return;
> + }
>
> - char *ip4_src = NULL;
> + const char *ip = is_ipv6
> + ? op->lrp_networks.ipv6_addrs[0].addr_s
> + : op->lrp_networks.ipv4_addrs[0].addr_s;
> + size_t match_len = match->length;
>
> - if (outport && outport->lrp_networks.ipv4_addrs) {
> - ip4_src = outport->lrp_networks.ipv4_addrs[0].addr_s;
> - } else if (op->lrp_networks.ipv4_addrs) {
> - ip4_src = op->lrp_networks.ipv4_addrs[0].addr_s;
> + ds_put_format(match, " && ip%c && "REGBIT_PKT_LARGER
> + " && "REGBIT_EGRESS_LOOPBACK" == 0", is_ipv6 ? '6' : '4');
> +
> + if (*extra_match) {
> + ds_put_format(match, " && %s", extra_match);
> }
>
> - if (ip4_src) {
> - ds_clear(match);
> - ds_put_format(match, "inport == %s && %sip4 && "REGBIT_PKT_LARGER
> - " && "REGBIT_EGRESS_LOOPBACK" == 0", op->json_key,
> - outport ? outport_match : "");
> + ds_clear(actions);
> + ds_put_format(actions,
> + is_ipv6 ? ICMP6_NEED_FRAG_FORMAT : ICMP4_NEED_FRAG_FORMAT,
> + extra_action, op->lrp_networks.ea_s, ip,
> + mtu, ovn_stage_get_table(S_ROUTER_IN_ADMISSION));
>
> - ds_clear(actions);
> - /* Set icmp4.frag_mtu to gw_mtu */
> - ds_put_format(actions,
> - "icmp4_error {"
> - REGBIT_EGRESS_LOOPBACK" = 1; "
> - REGBIT_PKT_LARGER" = 0; "
> - "eth.dst = %s; "
> - "ip4.dst = ip4.src; "
> - "ip4.src = %s; "
> - "ip.ttl = 255; "
> - "icmp4.type = 3; /* Destination Unreachable. */ "
> - "icmp4.code = 4; /* Frag Needed and DF was Set. */ "
> - "icmp4.frag_mtu = %d; "
> - "next(pipeline=ingress, table=%d); };",
> - op->lrp_networks.ea_s, ip4_src, mtu,
> - ovn_stage_get_table(S_ROUTER_IN_ADMISSION));
> - ovn_lflow_add_with_hint__(lflows, op->od, stage, 150,
> - ds_cstr(match), ds_cstr(actions),
> - NULL,
> - copp_meter_get(
> - COPP_ICMP4_ERR,
> - op->od->nbr->copp,
> - meter_groups),
> - &op->nbrp->header_);
> - }
> + ovn_lflow_add_with_hint__(lflows, op->od, stage, priority,
> + ds_cstr(match), ds_cstr(actions),
> + NULL, meter, &op->nbrp->header_);
>
> - char *ip6_src = NULL;
> + ds_truncate(match, match_len);
> +}
>
> - if (outport && outport->lrp_networks.ipv6_addrs) {
> - ip6_src = outport->lrp_networks.ipv6_addrs[0].addr_s;
> - } else if (op->lrp_networks.ipv6_addrs) {
> - ip6_src = op->lrp_networks.ipv6_addrs[0].addr_s;
> - }
> +static void
> +build_icmperr_pkt_big_flows(struct ovn_port *op, int mtu, struct hmap
> *lflows,
> + const struct shash *meter_groups, struct ds
> *match,
> + struct ds *actions, enum ovn_stage stage,
> + struct ovn_port *outport)
> +{
> + const char *ipv4_meter = copp_meter_get(COPP_ICMP4_ERR,
> op->od->nbr->copp,
> + meter_groups);
> + const char *ipv6_meter = copp_meter_get(COPP_ICMP6_ERR,
> op->od->nbr->copp,
> + meter_groups);
>
> - if (ip6_src) {
> - ds_clear(match);
> - ds_put_format(match, "inport == %s && %sip6 && "REGBIT_PKT_LARGER
> - " && "REGBIT_EGRESS_LOOPBACK" == 0", op->json_key,
> - outport ? outport_match : "");
> + ds_clear(match);
> + ds_put_format(match, "inport == %s", op->json_key);
>
> - ds_clear(actions);
> - /* Set icmp6.frag_mtu to gw_mtu */
> - ds_put_format(actions,
> - "icmp6_error {"
> - REGBIT_EGRESS_LOOPBACK" = 1; "
> - REGBIT_PKT_LARGER" = 0; "
> - "eth.dst = %s; "
> - "ip6.dst = ip6.src; "
> - "ip6.src = %s; "
> - "ip.ttl = 255; "
> - "icmp6.type = 2; /* Packet Too Big. */ "
> - "icmp6.code = 0; "
> - "icmp6.frag_mtu = %d; "
> - "next(pipeline=ingress, table=%d); };",
> - op->lrp_networks.ea_s, ip6_src, mtu,
> - ovn_stage_get_table(S_ROUTER_IN_ADMISSION));
> - ovn_lflow_add_with_hint__(lflows, op->od, stage, 150,
> - ds_cstr(match), ds_cstr(actions),
> - NULL,
> - copp_meter_get(
> - COPP_ICMP6_ERR,
> - op->od->nbr->copp,
> - meter_groups),
> - &op->nbrp->header_);
> + if (outport) {
> + ds_put_format(match, " && outport == %s", outport->json_key);
> +
> + create_icmp_need_frag_lflow(op, mtu, actions, match, ipv4_meter,
> + lflows, stage, 160, false,
> + "ct.trk && ct.rpl && ct.dnat",
> + "flags.icmp_snat = 1; ");
> + create_icmp_need_frag_lflow(op, mtu, actions, match, ipv6_meter,
> + lflows, stage, 160, true,
> + "ct.trk && ct.rpl && ct.dnat",
> + "flags.icmp_snat = 1; ");
Numan pointed out offline that in the past we tried to avoid matching on
"ct.dnat" because it creates flows that cannot be offloaded to hardware
(for specific vendors) [0]. However, these flows we add here always
send packets to ovn-controller (pinctrl) and cannot be offloaded anyway.
To me that seems to be fine but I'd like to hear an opinion from Numan
and Han about this too.
Regards,
Dumitru
[0]
https://github.com/ovn-org/ovn/commit/110e670462a9ae580d40d14181c388fc2f0b1e1c
> }
> - free(outport_match);
> +
> + create_icmp_need_frag_lflow(op, mtu, actions, match, ipv4_meter, lflows,
> + stage, 150, false, "", "");
> + create_icmp_need_frag_lflow(op, mtu, actions, match, ipv6_meter, lflows,
> + stage, 150, true, "", "");
> }
>
> static void
> @@ -14229,8 +14245,8 @@ build_check_pkt_len_flows_for_lrp(struct ovn_port *op,
> struct hmap *lflows,
> const struct hmap *lr_ports,
> const struct shash *meter_groups,
> - struct ds *match,
> - struct ds *actions)
> + struct ds *match, struct ds *actions,
> + const struct chassis_features *features)
> {
> int gw_mtu = smap_get_int(&op->nbrp->options, "gateway_mtu", 0);
> if (gw_mtu <= 0) {
> @@ -14259,6 +14275,12 @@ build_check_pkt_len_flows_for_lrp(struct ovn_port
> *op,
> match, actions, S_ROUTER_IN_LARGER_PKTS,
> op);
> }
> +
> + if (features->ct_commit_nat_v2) {
> + ovn_lflow_add_with_hint(lflows, op->od, S_ROUTER_OUT_POST_SNAT, 100,
> + "icmp && flags.icmp_snat == 1",
> + "ct_commit_nat(snat);", &op->nbrp->header_);
> + }
> }
>
> /* Local router ingress table CHK_PKT_LEN: Check packet length.
> @@ -14279,7 +14301,8 @@ build_check_pkt_len_flows_for_lrouter(
> struct ovn_datapath *od, struct hmap *lflows,
> const struct hmap *lr_ports,
> struct ds *match, struct ds *actions,
> - const struct shash *meter_groups)
> + const struct shash *meter_groups,
> + const struct chassis_features *features)
> {
> ovs_assert(od->nbr);
>
> @@ -14296,7 +14319,7 @@ build_check_pkt_len_flows_for_lrouter(
> continue;
> }
> build_check_pkt_len_flows_for_lrp(rp, lflows, lr_ports, meter_groups,
> - match, actions);
> + match, actions, features);
> }
> }
>
> @@ -16266,7 +16289,7 @@ build_lswitch_and_lrouter_iterate_by_lr(struct
> ovn_datapath *od,
> build_arp_resolve_flows_for_lrouter(od, lsi->lflows);
> build_check_pkt_len_flows_for_lrouter(od, lsi->lflows, lsi->lr_ports,
> &lsi->match, &lsi->actions,
> - lsi->meter_groups);
> + lsi->meter_groups, lsi->features);
> build_gateway_redirect_flows_for_lrouter(od, lsi->lflows, &lsi->match,
> &lsi->actions);
> build_arp_request_flows_for_lrouter(od, lsi->lflows, &lsi->match,
> @@ -17898,6 +17921,7 @@ northd_enable_all_features(struct northd_data *data)
> .ct_lb_related = true,
> .fdb_timestamp = true,
> .ls_dpg_column = true,
> + .ct_commit_nat_v2 = true,
> };
> }
>
> diff --git a/northd/northd.h b/northd/northd.h
> index ebbb4ba0a..27ae5da08 100644
> --- a/northd/northd.h
> +++ b/northd/northd.h
> @@ -71,6 +71,7 @@ struct chassis_features {
> bool ct_lb_related;
> bool fdb_timestamp;
> bool ls_dpg_column;
> + bool ct_commit_nat_v2;
> };
>
> /* A collection of datapaths. E.g. all logical switch datapaths, or all
> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> index 18073ad19..ba8c67e4e 100644
> --- a/tests/ovn-northd.at
> +++ b/tests/ovn-northd.at
> @@ -6138,7 +6138,8 @@ OVN_FOR_EACH_NORTHD_NO_HV([
> AT_SETUP([ovn -- gateway mtu check pkt larger flows])
> ovn_start
>
> -check ovn-sbctl chassis-add ch1 geneve 127.0.0.1
> +check ovn-sbctl chassis-add ch1 geneve 127.0.0.1 --\
> + set chassis ch1 other_config:ct-commit-nat-v2=true
>
> check ovn-nbctl ls-add sw0
> check ovn-nbctl ls-add sw1
> @@ -6183,10 +6184,14 @@ AT_CHECK([grep -e "chk_pkt_len" -e
> "lr_in_larger_pkts" lr0flows | sed 's/table=.
> table=??(lr_in_chk_pkt_len ), priority=0 , match=(1), action=(next;)
> table=??(lr_in_chk_pkt_len ), priority=50 , match=(outport ==
> "lr0-public"), action=(reg9[[1]] = check_pkt_larger(1514); next;)
> table=??(lr_in_larger_pkts ), priority=0 , match=(1), action=(next;)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> + table=??(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=??(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=??(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=??(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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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
> @@ -6201,6 +6206,10 @@ AT_CHECK([grep -E "lr_in_ip_input.*icmp6_error"
> lr0flows | sort], [0], [dnl
> table=3 (lr_in_ip_input ), 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 = 1500;
> next(pipeline=ingress, table=0); };)
> ])
>
> +AT_CHECK([grep -E "lr_out_post_snat.*ct_commit_nat" lr0flows | sed
> 's/table=../table=??/' | sort], [0], [dnl
> + table=??(lr_out_post_snat ), priority=100 , match=(icmp &&
> flags.icmp_snat == 1), action=(ct_commit_nat(snat);)
> +])
> +
> # Clear the gateway-chassis for lr0-public
> check ovn-nbctl --wait=sb clear logical_router_port lr0-public
> gateway_chassis
>
> @@ -6214,10 +6223,14 @@ AT_CHECK([grep -e "chk_pkt_len" -e
> "lr_in_larger_pkts" lr0flows | sed 's/table=.
> table=??(lr_in_chk_pkt_len ), priority=0 , match=(1), action=(next;)
> table=??(lr_in_chk_pkt_len ), priority=50 , match=(outport ==
> "lr0-public"), action=(reg9[[1]] = check_pkt_larger(1514); next;)
> table=??(lr_in_larger_pkts ), priority=0 , match=(1), action=(next;)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> + table=??(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=??(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=??(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=??(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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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
> @@ -6232,6 +6245,10 @@ AT_CHECK([grep -E "lr_in_ip_input.*icmp6_error"
> lr0flows | sort], [0], [dnl
> table=3 (lr_in_ip_input ), 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 = 1500;
> next(pipeline=ingress, table=0); };)
> ])
>
> +AT_CHECK([grep -E "lr_out_post_snat.*ct_commit_nat" lr0flows | sed
> 's/table=../table=??/' | sort], [0], [dnl
> + table=??(lr_out_post_snat ), priority=100 , match=(icmp &&
> flags.icmp_snat == 1), action=(ct_commit_nat(snat);)
> +])
> +
> # Set gateway_mtu_bypass to avoid check_pkt_larger() for tcp on lr0-public.
> check ovn-nbctl --wait=sb set logical_router_port lr0-public
> options:gateway_mtu_bypass=tcp
>
> @@ -6243,10 +6260,14 @@ AT_CHECK([grep -e "chk_pkt_len" -e
> "lr_in_larger_pkts" lr0flows | sed 's/table=.
> table=??(lr_in_chk_pkt_len ), priority=50 , match=(outport ==
> "lr0-public"), action=(reg9[[1]] = check_pkt_larger(1514); next;)
> table=??(lr_in_chk_pkt_len ), priority=55 , match=(outport ==
> "lr0-public" && (tcp)), action=(next;)
> table=??(lr_in_larger_pkts ), priority=0 , match=(1), action=(next;)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> + table=??(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=??(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=??(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=??(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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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 "lr_in_admission" lr0flows | grep -e "check_pkt_larger" -e
> "tcp" | sort], [0], [dnl
> @@ -6268,14 +6289,22 @@ AT_CHECK([grep -e "chk_pkt_len" -e
> "lr_in_larger_pkts" lr0flows | sed 's/table=.
> table=??(lr_in_chk_pkt_len ), priority=50 , match=(outport ==
> "lr0-sw0"), action=(reg9[[1]] = check_pkt_larger(1414); next;)
> table=??(lr_in_chk_pkt_len ), priority=55 , match=(outport ==
> "lr0-public" && (tcp)), action=(next;)
> table=??(lr_in_larger_pkts ), priority=0 , match=(1), action=(next;)
> - table=??(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 = 10.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=??(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:ff:fe00:ff01;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> - table=??(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 = 10.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=??(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:ff01;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
> + table=??(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=??(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=??(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=??(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=??(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=??(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=??(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=??(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); };)
> + table=??(lr_in_larger_pkts ), priority=160 , match=(inport ==
> "lr0-public" && outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0 &&
> ct.trk && ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1;
> 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=??(lr_in_larger_pkts ), priority=160 , match=(inport ==
> "lr0-public" && outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0 &&
> ct.trk && ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1;
> 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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 "lr_in_admission.*check_pkt_larger" lr0flows | sort], [0],
> [dnl
> @@ -6294,6 +6323,10 @@ AT_CHECK([grep -E "lr_in_ip_input.*icmp6_error"
> lr0flows | sort], [0], [dnl
> table=3 (lr_in_ip_input ), 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 = 1400; next(pipeline=ingress, table=0); };)
> ])
>
> +AT_CHECK([grep -E "lr_out_post_snat.*ct_commit_nat" lr0flows | sed
> 's/table=../table=??/' | sort], [0], [dnl
> + table=??(lr_out_post_snat ), priority=100 , match=(icmp &&
> flags.icmp_snat == 1), action=(ct_commit_nat(snat);)
> +])
> +
> # Set gateway_mtu_bypass to avoid check_pkt_larger() for tcp on lr0-sw0.
> check ovn-nbctl --wait=sb set logical_router_port lr0-sw0
> options:gateway_mtu_bypass=tcp
>
> @@ -6307,14 +6340,22 @@ AT_CHECK([grep -e "chk_pkt_len" -e
> "lr_in_larger_pkts" lr0flows | sed 's/table=.
> table=??(lr_in_chk_pkt_len ), priority=55 , match=(outport ==
> "lr0-public" && (tcp)), action=(next;)
> table=??(lr_in_chk_pkt_len ), priority=55 , match=(outport == "lr0-sw0"
> && (tcp)), action=(next;)
> table=??(lr_in_larger_pkts ), priority=0 , match=(1), action=(next;)
> - table=??(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 = 10.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=??(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:ff:fe00:ff01;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> - table=??(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 = 172.168.0.100; 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=??(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:20ff:fe20:1213;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1500; next(pipeline=ingress, table=0); };)
> - table=??(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 = 10.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=??(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:ff01;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
> + table=??(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=??(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=??(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=??(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=??(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=??(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=??(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=??(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); };)
> + table=??(lr_in_larger_pkts ), priority=160 , match=(inport ==
> "lr0-public" && outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0 &&
> ct.trk && ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1;
> 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=??(lr_in_larger_pkts ), priority=160 , match=(inport ==
> "lr0-public" && outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0 &&
> ct.trk && ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1;
> 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw0"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-public" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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 "lr_in_admission" lr0flows | grep -e "check_pkt_larger" -e
> "tcp" | sort], [0], [dnl
> @@ -6333,16 +6374,19 @@ check ovn-nbctl --wait=sb clear logical_router_port
> lr0-public options
> ovn-sbctl dump-flows lr0 > lr0flows
> AT_CAPTURE_FILE([lr0flows])
>
> -grep -e "chk_pkt_len" -e "lr_in_larger_pkts" lr0flows | sed
> 's/table=../table=??/' | sort
> AT_CHECK([grep -e "chk_pkt_len" -e "lr_in_larger_pkts" lr0flows | sed
> 's/table=../table=??/' | sort], [0], [dnl
> table=??(lr_in_chk_pkt_len ), priority=0 , match=(1), action=(next;)
> table=??(lr_in_chk_pkt_len ), priority=50 , match=(outport ==
> "lr0-sw0"), action=(reg9[[1]] = check_pkt_larger(1414); next;)
> table=??(lr_in_chk_pkt_len ), priority=55 , match=(outport == "lr0-sw0"
> && (tcp)), action=(next;)
> table=??(lr_in_larger_pkts ), priority=0 , match=(1), action=(next;)
> - table=??(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 = 10.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=??(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:ff:fe00:ff01;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
> - table=??(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 = 10.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=??(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:ff01;
> ip.ttl = 255; icmp6.type = 2; /* Packet Too Big. */ icmp6.code = 0;
> icmp6.frag_mtu = 1400; next(pipeline=ingress, table=0); };)
> + table=??(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=??(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=??(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=??(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); };)
> + table=??(lr_in_larger_pkts ), priority=160 , match=(inport ==
> "lr0-public" && outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0 &&
> ct.trk && ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1;
> 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=??(lr_in_larger_pkts ), priority=160 , match=(inport ==
> "lr0-public" && outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0 &&
> ct.trk && ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1;
> 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-sw0" && ip4 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp4_error {flags.icmp_snat = 1; 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=??(lr_in_larger_pkts ), priority=160 , match=(inport == "lr0-sw1"
> && outport == "lr0-sw0" && ip6 && reg9[[1]] && reg9[[0]] == 0 && ct.trk &&
> ct.rpl && ct.dnat), action=(icmp6_error {flags.icmp_snat = 1; 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); };)
> ])
>
> check ovn-nbctl --wait=sb clear logical_router_port lr0-sw0 options
> @@ -6375,6 +6419,12 @@ AT_CHECK([grep "lr_in_admission" lr0flows | grep -e
> "check_pkt_larger" | sort],
> table=0 (lr_in_admission ), priority=50 , match=(eth.mcast && inport
> == "lr0-public"), action=(reg9[[1]] = check_pkt_larger(1518); xreg0[[0..47]]
> = 00:00:20:20:12:13; next;)
> ])
>
> +check ovn-sbctl set chassis ch1 other_config:ct-commit-nat-v2=false
> +check ovn-nbctl --wait=sb sync
> +
> +ovn-sbctl dump-flows lr0 > lr0flows
> +AT_CHECK([grep -E "lr_out_post_snat.*ct_commit_nat" lr0flows], [1])
> +
> AT_CLEANUP
> ])
>
> diff --git a/tests/ovn.at b/tests/ovn.at
> index d362b4c56..2411c653e 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -20601,12 +20601,12 @@ test_ip_packet_larger() {
> expected=${expected}0000000000000000000000000000
> echo $expected > br_phys_n1.expected
> else
> - src_ip=`ip_to_hex 172.168.0.100`
> + src_ip=`ip_to_hex 10 0 0 1`
> dst_ip=`ip_to_hex 10 0 0 3`
> # pkt len should be 146 (28 (icmp packet) + 118 (orig ip + payload))
> reply_pkt_len=008e
> ip_csum=fc97
> -
> icmp_reply=${src_mac}${dst_mac}08004500${reply_pkt_len}00004000fe01c55f
> +
> icmp_reply=${src_mac}${dst_mac}08004500${reply_pkt_len}00004000fe01686b
> icmp_reply=${icmp_reply}${src_ip}${dst_ip}0304${ip_csum}0000$(printf
> "%04x" $mtu)
> icmp_reply=${icmp_reply}4500${pkt_len}000000003f01c4dd
> icmp_reply=${icmp_reply}${orig_packet_l3}
> @@ -20698,7 +20698,7 @@ test_ip6_packet_larger() {
>
> local ipv6_src=10000000000000000000000000000003
> local ipv6_dst=20000000000000000000000000000002
> - local ipv6_rt=20000000000000000000000000000001
> + local ipv6_rt=10000000000000000000000000000001
>
> local payload=0000000000000000000000000000000000000000
> local payload=${payload}0000000000000000000000000000000000000000
> diff --git a/tests/system-ovn-kmod.at b/tests/system-ovn-kmod.at
> index 88c72edcd..2341bb387 100644
> --- a/tests/system-ovn-kmod.at
> +++ b/tests/system-ovn-kmod.at
> @@ -977,7 +977,7 @@ dnl check ovn-nbctl lr-lb-add lr lb1
> check ovn-nbctl set logical_router lr options:chassis=hv1
> check ovn-nbctl set logical_router_port lr-internal options:gateway_mtu=800
>
> -check ovn-nbctl lr-nat-add lr snat 192.168.1.1 172.16.1.2/24
> +check ovn-nbctl lr-nat-add lr snat 192.168.1.1 172.16.1.2
>
> check ovn-nbctl --wait=hv sync
>
> @@ -1032,6 +1032,7 @@ NS_CHECK_EXEC([client], [$PYTHON3 ./client.py])
>
> dnl Expecting 2 outgoing packets and 2 fragments back - 8 lines total.
> OVS_WAIT_UNTIL([test "$(cat client.tcpdump | wc -l)" = "8"])
> +AT_CHECK([test $(grep -c "need to frag (mtu 800)" server.tcpdump) -eq 1])
>
> ovn-appctl -t ovn-controller vlog/set info
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev