> On Tue, Jan 9, 2024 at 8:59 AM Lorenzo Bianconi
> <[email protected]> wrote:
> >
> > > On Fri, Dec 22, 2023 at 11:27 AM Lorenzo Bianconi
> > > <[email protected]> wrote:
> > > >
> > > > Introduce specif flows for E/W ICMPv{4,6} packets if tunnelled packets
> > > > do not fit path MTU. This patch enable PMTUD for East/West Geneve 
> > > > traffic.
> > > >
> > > > Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2241711
> > > > Signed-off-by: Lorenzo Bianconi <[email protected]>
> > >
> > > Hi Lorenzo,
> > >
> > > Thanks for the patch.  Please see below for a few comments.
> >
> > Hi Numan,
> >
> > thx for the review. Few comments inline.
> >
> > Regards,
> > Lorenzo
> >
> > >
> > >
> > [...]
> > > > +/* Following flows are used to manage traffic redirected by the kernel
> > > > + * (e.g. ICMP errors packets) that enter the cluster from the geneve 
> > > > ports
> > > > + */
> > > > +static void
> > > > +build_lrouter_icmp_packet_toobig_admin_flows(
> > > > +        struct ovn_port *op, struct hmap *lflows,
> > > > +        struct ds *match, struct ds *actions)
> > > > +{
> > > > +    ovs_assert(op->nbrp);
> > > > +
> > > > +    if (is_l3dgw_port(op)) {
> > > > +        ds_clear(match);
> > > > +        ds_put_format(match,
> > > > +                      "((ip4 && icmp4.type == 3 && icmp4.code == 4) ||"
> > > > +                      " (ip6 && icmp6.type == 2 && icmp6.code == 0)) 
> > > > && "
> > > > +                      "eth.dst == %s && !is_chassis_resident(%s)",
> > > > +                      op->nbrp->mac, op->cr_port->json_key);
> > > > +        ds_clear(actions);
> > > > +        ds_put_format(actions, "outport = inport; inport = %s; next;",
> > > > +                      op->json_key);
> > > > +        ovn_lflow_add(lflows, op->od, S_ROUTER_IN_ADMISSION, 120,
> > > > +                      ds_cstr(match), ds_cstr(actions));
> > > > +    }
> > > > +
> > > > +    /* default flow */
> > > > +    ovn_lflow_add(lflows, op->od, S_ROUTER_IN_ADMISSION, 110,
> > > > +                  "(ip4 && icmp4.type == 3 && icmp4.code == 4) || "
> > > > +                  "(ip6 && icmp6.type == 2 && icmp6.code == 0)", 
> > > > "next; ");
> > > > +}
> > > > +
> > >
> > > I don't think there is a need for default flow.  If I understand
> > > correctly,  we are trying to handle
> > > the scenario when the kernel generates the icmp needs frag error
> > > packet.  For the normal case i.e  icmp
> > > needs a frag error packet not generated by the kernel,  it should
> > > continue the normal flow.
> >
> > Reviewing the code I think it is wrong, but for icmp error "packet too big"
> > traffic hitting a gw router port I think we need a 'default' flow since if 
> > the
> > port is "local" to the hv we need to set the inport from the l3dgw_port 
> > port to
> > the regular router one. Do you agree? (We need this flow just if
> > is_l3dgw_port() is true).
> 
> I don't understand your point.  For the scenario you mentioned about
> icmp error "packet too big" packet,  who generates it ?
> Is it generated by the local kernel due to route mtu exception ?
> 
> If the port is local to the hypervisor, then the original packet will
> never go out of the tunnel.
> 
> In my testing,  I've one router port which has gateway chassis set and
> I see the below logical flows added by this patch
> 
> ---
> table=0 (lr_in_admission    ), priority=120  , match=(((ip4 &&
> icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 &&
> icmp6.code == 0)) && eth.dst == 00:11:22:00:ff:01 &&
> !is_chassis_resident("cr-lr0-public")), action=(outport = inport;
> inport = "lr0-public"; next;)
> table=0 (lr_in_admission    ), priority=110  , match=((ip4 &&
> icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 &&
> icmp6.code == 0)), action=(next; )
> ---
> 
> If the packet matches the first flow with priority 120,  then the
> outport/inport is set properly by the actions and it goes to the next
> table.  But if the packet doesn't hit the first flow or if that flow
> is not installed
> because is_chassis_resident("cr-lr0-public") is true,  then the packet
> will continue with the remaining matches in the "lr_in_admission"
> table and will advance to the next stage.
> So we don't need that flow.

Hi Numan,

reading my previous email I think I have not been very clear, sorry for that :(
Let's assume N/S traffic and an ICMP error message 'packet too big'
not generated locally (let's say from a device outside the cluster).
In table OFTABLE_PHY_TO_LOG we resumbit this packet to table 
OFTABLE_LOG_INGRESS_PIPELINE.
What I mean is for this packet we need a flow to set inport from 
'cr-lr0-public' to
'lr0-public' since in this case since we are not hitting the flows you reported 
above, right?
Am I missing something?

> 
> 
> >
> > >
> > >
> > > > +static void
> > > > +build_lswitch_icmp_packet_toobig_admin_flows(
> > > > +        struct ovn_port *op, struct hmap *lflows,
> > > > +        struct ds *match, struct ds *actions)
> > > > +{
> > > > +    ovs_assert(op->nbsp);
> > > > +
> > > > +    if (lsp_is_router(op->nbsp)) {
> > > > +        return;
> > > > +    }
> > > > +
> > > > +    struct ovn_datapath *od = op->od;
> > > > +    for (int i = 0; i < od->n_router_ports; i++) {
> > > > +        struct ovn_port *peer = od->router_ports[i]->peer;
> > > > +        if (!peer) {
> > > > +            continue;
> > > > +        }
> > > > +
> > > > +        ds_clear(match);
> > > > +        char *rp_port =
> > > > +            is_l3dgw_port(peer) ? peer->cr_port->json_key : 
> > > > peer->json_key;
> > > > +        ds_put_format(match,
> > > > +                      "((ip4 && icmp4.type == 3 && icmp4.code == 4) ||"
> > > > +                      " (ip6 && icmp6.type == 2 && icmp6.code == 0)) 
> > > > && "
> > > > +                      "eth.dst == %s && !is_chassis_resident(%s)",
> > > > +                      peer->nbrp->mac, rp_port);
> > > > +        ds_clear(actions);
> > > > +        ds_put_format(actions, "outport = %s; inport = %s; output;",
> > > > +                      od->router_ports[i]->json_key, op->json_key);
> > > > +        ovn_lflow_add(lflows, od, S_SWITCH_IN_CHECK_PORT_SEC, 120,
> > > > +                      ds_cstr(match), ds_cstr(actions));
> > > > +    }
> > >
> > > I think with this we will end up adding two logical flows for every
> > > logical port in the logical switch.
> > > I don't think that's necessary.
> > >
> > > I think we should add the logical flow only for logical switch ports
> > > of type router.
> > > The function should return immediately if !lsp_is_router(op->nbsp).
> >
> > ack, agree. I will fix it.
> >
> > >
> > > I think you can also match on the "inport == <lrp" in the first
> > > logical flow of this function.
> >
> > If we use the inport as match I think it is hard to distinguish between the
> > locally generated ICMP 'packet too big' traffic (generated by the kernel) 
> > and
> > ICMP 'packet too big' sent by a remote node. Am I wrong or am I missing
> > something?
> 
> You don't need to distinguish between the two.  You just need to figure out
> if the icmp error 'packet too big' is generated locally by geneve or NOT.

yes

> 
> If the icmp error packet was  actually received from the tunnel,
> then the packet will continue with the pipeline.  Only in the case where
> kernel generates the icmp error packet due to route mtu exception,  the inport
> will be "lrp".

I do not think we can use inport for vxlan tunnels, right? In physical_run() we
just set the outport from tunnel_id for vxlan. Can we just use eth.dst in this
case too?

> 
> 
> >
> > >
> > > Also I don't think there is a need for the default flow below.
> > > The below logical flow by-passes the port security check which could
> > > be exploited by a rogue pod/VM.
> >
> > ack, I will fix it.
> >
> 
>  >
> > > Let me know if my suggestions don't work.
> > >
> > > Thanks
> > > Numan
> > >
> > >
> > > > +
> > > > +    /* default flow */
> > > > +    ovn_lflow_add(lflows, op->od, S_SWITCH_IN_CHECK_PORT_SEC, 110,
> > > > +                  "(ip4 && icmp4.type == 3 && icmp4.code == 4) || "
> > > > +                  "(ip6 && icmp6.type == 2 && icmp6.code == 0)", 
> > > > "next; ");
> > > > +}
> > > > +
> > > >  static void
> > > >  build_lrouter_force_snat_flows_op(struct ovn_port *op,
> > > >                                    struct hmap *lflows,
> > > > @@ -16161,6 +16230,7 @@ build_lswitch_and_lrouter_iterate_by_lsp(struct 
> > > > ovn_port *op,
> > > >      build_lswitch_dhcp_options_and_response(op, lflows, meter_groups);
> > > >      build_lswitch_external_port(op, lflows);
> > > >      build_lswitch_ip_unicast_lookup(op, lflows, actions, match);
> > > > +    build_lswitch_icmp_packet_toobig_admin_flows(op, lflows, match, 
> > > > actions);
> > > >
> > > >      /* Build Logical Router Flows. */
> > > >      build_ip_routing_flows_for_router_type_lsp(op, lr_ports, lflows);
> > > > @@ -16197,6 +16267,8 @@ build_lswitch_and_lrouter_iterate_by_lrp(struct 
> > > > ovn_port *op,
> > > >                                  &lsi->match, &lsi->actions, 
> > > > lsi->meter_groups);
> > > >      build_lrouter_force_snat_flows_op(op, lsi->lflows, &lsi->match,
> > > >                                        &lsi->actions);
> > > > +    build_lrouter_icmp_packet_toobig_admin_flows(op, lsi->lflows, 
> > > > &lsi->match,
> > > > +                                                 &lsi->actions);
> > > >  }
> > > >
> > > >  static void *
> > > > diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
> > > > index 97718821f..85576a845 100644
> > > > --- a/northd/ovn-northd.8.xml
> > > > +++ b/northd/ovn-northd.8.xml
> > > > @@ -372,6 +372,20 @@
> > > >
> > > >      <h3>Ingress Table 1: Ingress Port Security - Apply</h3>
> > > >
> > > > +    <p>
> > > > +      For each logical switch port <var>P</var> a priority-120 flow 
> > > > that
> > > > +      matches icmp{4,6} error 'packet too big' and <code>eth.dst ==
> > > > +      <var>D</var> &amp;&amp; 
> > > > !is_chassis_resident(<var>RP</var>)</code> where
> > > > +      <var>D</var> is the peer logical router port <var>RP</var> mac 
> > > > address,
> > > > +      stores <var>RP</var> peer port as outport, stores <var>P</var> 
> > > > as inport
> > > > +      and forward the packet to the egress pipeline.
> > > > +    </p>
> > > > +
> > > > +    <p>
> > > > +      This table adds a priority-110 flow that matches icmp{4,6} error 
> > > > 'packet
> > > > +      too big' to forward the packet to the next stage in the pipeline.
> > > > +    </p>
> > > > +
> > > >      <p>
> > > >        This table drops the packets if the port security check failed
> > > >        in the previous stage i.e the register bit
> > > > @@ -2463,6 +2477,21 @@ output;
> > > >            (LBs, NAT).
> > > >          </p>
> > > >
> > > > +        <p>
> > > > +          For each gateway port <var>GW</var> on a distributed logical 
> > > > router
> > > > +          a priority-120 flow that matches icmp{4,6} error 'packet too 
> > > > big' and
> > > > +          <code>eth.dst == <var>D</var> &amp;&amp; 
> > > > !is_chassis_resident(<var>
> > > > +          cr-GW</var>)</code> where <var>D</var> is the gateway port 
> > > > mac
> > > > +          address and <var>cr-GW</var> is the chassis resident port of
> > > > +          <var>GW</var>, swap inport and outport and stores 
> > > > <var>GW</var>
> > > > +          as inport.
> > > > +        </p>
> > > > +
> > > > +        <p>
> > > > +          This table adds a priority-110 flow that matches icmp{4,6} 
> > > > error 'packet
> > > > +          too big' to forward the packet to the next stage in the 
> > > > pipeline.
> > > > +        </p>
> > > > +
> > > >          <p>
> > > >            For a distributed logical router or for gateway router where
> > > >            the port is configured with <code>options:gateway_mtu</code>
> > > > diff --git a/tests/multinode.at b/tests/multinode.at
> > > > index 2b199b4bc..772134b7d 100644
> > > > --- a/tests/multinode.at
> > > > +++ b/tests/multinode.at
> > > > @@ -42,7 +42,6 @@ M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 
> > > > 3 -i 0.3 -w 2 10.0.0.4 | F
> > > >  3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > >  ])
> > > >
> > > > -
> > > >  # Create the second logical switch with one port
> > > >  check multinode_nbctl ls-add sw1
> > > >  check multinode_nbctl lsp-add sw1 sw1-port1
> > > > @@ -72,3 +71,350 @@ M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q 
> > > > -c 3 -i 0.3 -w 2 20.0.0.3 | F
> > > >  ])
> > > >
> > > >  AT_CLEANUP
> > > > +
> > > > +AT_SETUP([ovn multinode pmtu - distributed router])
> > > > +
> 
> The test case added here will also run for the branch-23.03 and it will fail.
> 
> You need to skip this test for "multinode tests branch-22.03".
> 
> Check this commit (which was reverted) to skip this test for
> branch-22.03 - 
> https://github.com/ovn-org/ovn/commit/450e41e783bfa69e4f9d6c80f6bcb01147d5cfe1

acj, I will fix it.

Regards,
Lorenzo

> 
> Please add the changes in "ovn-fake-multinode-tests.yml" of the above
> commit to this patch.
> 
> 
> Thanks
> Numan
> 
> 
> > > > +# Check that ovn-fake-multinode setup is up and running
> > > > +check_fake_multinode_setup
> > > > +
> > > > +# Delete the multinode NB and OVS resources before starting the test.
> > > > +cleanup_multinode_resources
> > > > +
> > > > +m_as ovn-chassis-1 ip link del sw0p1-p
> > > > +m_as ovn-chassis-2 ip link del sw0p2-p
> > > > +m_as ovn-chassis-2 ip link del sw1p1-p
> > > > +
> > > > +# Reset geneve tunnels
> > > > +for c in ovn-chassis-1 ovn-chassis-2 ovn-gw-1
> > > > +do
> > > > +    m_as $c ovs-vsctl set open . external-ids:ovn-encap-type=geneve
> > > > +done
> > > > +
> > > > +OVS_WAIT_UNTIL([m_as ovn-chassis-1 ip link show | grep -q genev_sys])
> > > > +OVS_WAIT_UNTIL([m_as ovn-chassis-2 ip link show | grep -q genev_sys])
> > > > +OVS_WAIT_UNTIL([m_as ovn-gw-1 ip link show | grep -q genev_sys])
> > > > +
> > > > +# Test East-West switching
> > > > +check multinode_nbctl ls-add sw0
> > > > +check multinode_nbctl lsp-add sw0 sw0-port1
> > > > +check multinode_nbctl lsp-set-addresses sw0-port1 "50:54:00:00:00:03 
> > > > 10.0.0.3 1000::3"
> > > > +check multinode_nbctl lsp-add sw0 sw0-port2
> > > > +check multinode_nbctl lsp-set-addresses sw0-port2 "50:54:00:00:00:04 
> > > > 10.0.0.4 1000::4"
> > > > +
> > > > +m_as ovn-chassis-1 /data/create_fake_vm.sh sw0-port1 sw0p1 
> > > > 50:54:00:00:00:03 10.0.0.3 24 10.0.0.1 1000::3/64 1000::a
> > > > +m_as ovn-chassis-2 /data/create_fake_vm.sh sw0-port2 sw0p2 
> > > > 50:54:00:00:00:04 10.0.0.4 24 10.0.0.1 1000::4/64 1000::a
> > > > +
> > > > +m_wait_for_ports_up
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 10.0.0.4 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +# Create the second logical switch with one port
> > > > +check multinode_nbctl ls-add sw1
> > > > +check multinode_nbctl lsp-add sw1 sw1-port1
> > > > +check multinode_nbctl lsp-set-addresses sw1-port1 "40:54:00:00:00:03 
> > > > 20.0.0.3 2000::3"
> > > > +
> > > > +# Create a logical router and attach both logical switches
> > > > +check multinode_nbctl lr-add lr0
> > > > +check multinode_nbctl lrp-add lr0 lr0-sw0 00:00:00:00:ff:01 
> > > > 10.0.0.1/24 1000::a/64
> > > > +check multinode_nbctl lsp-add sw0 sw0-lr0
> > > > +check multinode_nbctl lsp-set-type sw0-lr0 router
> > > > +check multinode_nbctl lsp-set-addresses sw0-lr0 router
> > > > +check multinode_nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
> > > > +
> > > > +check multinode_nbctl lrp-add lr0 lr0-sw1 00:00:00:00:ff:02 
> > > > 20.0.0.1/24 2000::a/64
> > > > +check multinode_nbctl lsp-add sw1 sw1-lr0
> > > > +check multinode_nbctl lsp-set-type sw1-lr0 router
> > > > +check multinode_nbctl lsp-set-addresses sw1-lr0 router
> > > > +check multinode_nbctl lsp-set-options sw1-lr0 router-port=lr0-sw1
> > > > +
> > > > +m_as ovn-chassis-2 /data/create_fake_vm.sh sw1-port1 sw1p1 
> > > > 40:54:00:00:00:03 20.0.0.3 24 20.0.0.1 2000::3/64 2000::a
> > > > +
> > > > +# create exteranl connection for N/S traffic
> > > > +check multinode_nbctl ls-add public
> > > > +check multinode_nbctl lsp-add public ln-lublic
> > > > +check multinode_nbctl lsp-set-type ln-lublic localnet
> > > > +check multinode_nbctl lsp-set-addresses ln-lublic unknown
> > > > +check multinode_nbctl lsp-set-options ln-lublic network_name=public
> > > > +
> > > > +check multinode_nbctl lrp-add lr0 lr0-public 00:11:22:00:ff:01 
> > > > 172.20.0.100/24
> > > > +check multinode_nbctl lsp-add public public-lr0
> > > > +check multinode_nbctl lsp-set-type public-lr0 router
> > > > +check multinode_nbctl lsp-set-addresses public-lr0 router
> > > > +check multinode_nbctl lsp-set-options public-lr0 router-port=lr0-public
> > > > +check multinode_nbctl lrp-set-gateway-chassis lr0-public ovn-gw-1 10
> > > > +check multinode_nbctl lr-route-add lr0 0.0.0.0/0 172.20.0.1
> > > > +
> > > > +check multinode_nbctl lr-nat-add lr0 snat 172.20.0.100 10.0.0.0/24
> > > > +check multinode_nbctl lr-nat-add lr0 snat 172.20.0.100 20.0.0.0/24
> > > > +
> > > > +# create some ACLs
> > > > +check multinode_nbctl acl-add sw0 from-lport 1002 'ip4 || ip6'  
> > > > allow-related
> > > > +check multinode_nbctl acl-add sw1 from-lport 1002 'ip4 || ip6'  
> > > > allow-related
> > > > +
> > > > +m_as ovn-gw-1 ip netns add ovn-ext0
> > > > +m_as ovn-gw-1 ovs-vsctl add-port br-ex ext0 -- set interface ext0 
> > > > type=internal
> > > > +m_as ovn-gw-1 ip link set ext0 netns ovn-ext0
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext0 ip link set ext0 up
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext0 ip addr add 172.20.0.1/24 dev ext0
> > > > +
> > > > +m_as ovn-gw-1 ovs-vsctl add-port br-ex ext1 -- set interface ext1 
> > > > type=internal
> > > > +m_as ovn-gw-1 ip link set ext1 netns ovn-ext0
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext0 ip link set ext1 up
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext0 ip addr add 172.20.1.1/24 dev ext1
> > > > +
> > > > +m_as ovn-gw-1 ip netns add ovn-ext2
> > > > +m_as ovn-gw-1 ovs-vsctl add-port br-ex ext2 -- set interface ext2 
> > > > type=internal
> > > > +m_as ovn-gw-1 ip link set ext2 netns ovn-ext2
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext2 ip link set ext2 up
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext2 ip addr add 172.20.1.2/24 dev ext2
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext2 ip route add default via 
> > > > 172.20.1.1 dev ext2
> > > > +
> > > > +m_as ovn-gw-1 ovs-vsctl set open . 
> > > > external-ids:ovn-bridge-mappings=public:br-ex
> > > > +m_as ovn-chassis-1 ovs-vsctl set open . 
> > > > external-ids:ovn-bridge-mappings=public:br-ex
> > > > +m_as ovn-chassis-2 ovs-vsctl set open . 
> > > > external-ids:ovn-bridge-mappings=public:br-ex
> > > > +
> > > > +m_wait_for_ports_up sw1-port1
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 20.0.0.3 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +# Change ptmu for the geneve tunnel
> > > > +m_as ovn-chassis-1 ip route change 170.168.0.0/16 mtu 1200 dev eth1
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -c 5 -s 1300 -M do 
> > > > 20.0.0.3 2>&1 |grep -q "message too long, mtu=1142"])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route flush dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add 10.0.0.0/24 
> > > > dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add default via 
> > > > 10.0.0.1 dev sw0p1])
> > > > +
> > > > +m_as ovn-chassis-1 ip route change 170.168.0.0/16 mtu 1400 dev eth1
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping6 -c 5 -s 1450 -M do 
> > > > 2000::3 2>&1 |grep -q "message too long, mtu: 1342"])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 172.20.1.2 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-gw-1], [ovn-ext0], [ip link set dev ext1 mtu 
> > > > 1000])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -c 10 -s 1300 -M do 
> > > > 172.20.1.2 2>&1 |grep -q "mtu = 1000"])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 172.20.1.2 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +# Create vxlan tunnels
> > > > +for c in ovn-chassis-1 ovn-chassis-2 ovn-gw-1
> > > > +do
> > > > +    m_as $c ovs-vsctl set open . external-ids:ovn-encap-type=vxlan
> > > > +done
> > > > +
> > > > +OVS_WAIT_UNTIL([m_as ovn-chassis-1 ip link show | grep -q vxlan_sys])
> > > > +OVS_WAIT_UNTIL([m_as ovn-chassis-2 ip link show | grep -q vxlan_sys])
> > > > +OVS_WAIT_UNTIL([m_as ovn-gw-1 ip link show | grep -q vxlan_sys])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route flush dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add 10.0.0.0/24 
> > > > dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add default via 
> > > > 10.0.0.1 dev sw0p1])
> > > > +
> > > > +m_as ovn-chassis-1 ip route change 170.168.0.0/16 mtu 1200 dev eth1
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 20.0.0.3 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -c 5 -s 1300 -M do 
> > > > 20.0.0.3 2>&1 |grep -q "message too long, mtu=1150"])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route flush dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add 10.0.0.0/24 
> > > > dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add default via 
> > > > 10.0.0.1 dev sw0p1])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-gw-1], [ovn-ext0], [ip link set dev ext1 mtu 
> > > > 1100])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 172.20.1.2 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -c 20 -i 0.5 -s 1300 
> > > > -M do 172.20.1.2 2>&1 |grep -q "mtu = 1150"])
> > > > +
> > > > +AT_CLEANUP
> > > > +
> > > > +AT_SETUP([ovn multinode pmtu - gw_router_port])
> > > > +
> > > > +# Check that ovn-fake-multinode setup is up and running
> > > > +check_fake_multinode_setup
> > > > +
> > > > +# Delete the multinode NB and OVS resources before starting the test.
> > > > +cleanup_multinode_resources
> > > > +
> > > > +m_as ovn-chassis-1 ip link del sw0p1-p
> > > > +m_as ovn-chassis-2 ip link del sw0p2-p
> > > > +m_as ovn-chassis-2 ip link del sw1p1-p
> > > > +
> > > > +# Reset geneve tunnels
> > > > +for c in ovn-chassis-1 ovn-chassis-2 ovn-gw-1
> > > > +do
> > > > +    m_as $c ovs-vsctl set open . external-ids:ovn-encap-type=geneve
> > > > +done
> > > > +
> > > > +OVS_WAIT_UNTIL([m_as ovn-chassis-1 ip link show | grep -q genev_sys])
> > > > +OVS_WAIT_UNTIL([m_as ovn-chassis-2 ip link show | grep -q genev_sys])
> > > > +OVS_WAIT_UNTIL([m_as ovn-gw-1 ip link show | grep -q genev_sys])
> > > > +
> > > > +# Test East-West switching
> > > > +check multinode_nbctl ls-add sw0
> > > > +check multinode_nbctl lsp-add sw0 sw0-port1
> > > > +check multinode_nbctl lsp-set-addresses sw0-port1 "50:54:00:00:00:03 
> > > > 10.0.0.3 1000::3"
> > > > +check multinode_nbctl lsp-add sw0 sw0-port2
> > > > +check multinode_nbctl lsp-set-addresses sw0-port2 "50:54:00:00:00:04 
> > > > 10.0.0.4 1000::4"
> > > > +
> > > > +m_as ovn-chassis-1 /data/create_fake_vm.sh sw0-port1 sw0p1 
> > > > 50:54:00:00:00:03 10.0.0.3 24 10.0.0.1 1000::3/64 1000::a
> > > > +m_as ovn-chassis-2 /data/create_fake_vm.sh sw0-port2 sw0p2 
> > > > 50:54:00:00:00:04 10.0.0.4 24 10.0.0.1 1000::4/64 1000::a
> > > > +
> > > > +m_wait_for_ports_up
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 10.0.0.4 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +# Create the second logical switch with one port
> > > > +check multinode_nbctl ls-add sw1
> > > > +check multinode_nbctl lsp-add sw1 sw1-port1
> > > > +check multinode_nbctl lsp-set-addresses sw1-port1 "40:54:00:00:00:03 
> > > > 20.0.0.3 2000::3"
> > > > +
> > > > +# Create a logical router and attach both logical switches
> > > > +check multinode_nbctl lr-add lr0
> > > > +check multinode_nbctl lrp-add lr0 lr0-sw0 00:00:00:00:ff:01 
> > > > 10.0.0.1/24 1000::a/64
> > > > +check multinode_nbctl lsp-add sw0 sw0-lr0
> > > > +check multinode_nbctl lsp-set-type sw0-lr0 router
> > > > +check multinode_nbctl lsp-set-addresses sw0-lr0 router
> > > > +check multinode_nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
> > > > +
> > > > +check multinode_nbctl lrp-add lr0 lr0-sw1 00:00:00:00:ff:02 
> > > > 20.0.0.1/24 2000::a/64
> > > > +check multinode_nbctl lsp-add sw1 sw1-lr0
> > > > +check multinode_nbctl lsp-set-type sw1-lr0 router
> > > > +check multinode_nbctl lsp-set-addresses sw1-lr0 router
> > > > +check multinode_nbctl lsp-set-options sw1-lr0 router-port=lr0-sw1
> > > > +
> > > > +m_as ovn-chassis-2 /data/create_fake_vm.sh sw1-port1 sw1p1 
> > > > 40:54:00:00:00:03 20.0.0.3 24 20.0.0.1 2000::3/64 2000::a
> > > > +
> > > > +# create exteranl connection for N/S traffic
> > > > +check multinode_nbctl ls-add public
> > > > +check multinode_nbctl lsp-add public ln-lublic
> > > > +check multinode_nbctl lsp-set-type ln-lublic localnet
> > > > +check multinode_nbctl lsp-set-addresses ln-lublic unknown
> > > > +check multinode_nbctl lsp-set-options ln-lublic network_name=public
> > > > +
> > > > +check multinode_nbctl lrp-add lr0 lr0-public 00:11:22:00:ff:01 
> > > > 172.20.0.100/24
> > > > +check multinode_nbctl lsp-add public public-lr0
> > > > +check multinode_nbctl lsp-set-type public-lr0 router
> > > > +check multinode_nbctl lsp-set-addresses public-lr0 router
> > > > +check multinode_nbctl lsp-set-options public-lr0 router-port=lr0-public
> > > > +check multinode_nbctl lrp-set-gateway-chassis lr0-public ovn-gw-1 10
> > > > +check multinode_nbctl lr-route-add lr0 0.0.0.0/0 172.20.0.1
> > > > +
> > > > +check multinode_nbctl lr-nat-add lr0 snat 172.20.0.100 10.0.0.0/24
> > > > +check multinode_nbctl lr-nat-add lr0 snat 172.20.0.100 20.0.0.0/24
> > > > +
> > > > +check multinode_nbctl lrp-set-gateway-chassis lr0-sw0 ovn-chassis-1 10
> > > > +check multinode_nbctl lrp-set-gateway-chassis lr0-sw1 ovn-chassis-2 10
> > > > +
> > > > +# create some ACLs
> > > > +check multinode_nbctl acl-add sw0 from-lport 1002 'ip4 || ip6'  
> > > > allow-related
> > > > +check multinode_nbctl acl-add sw1 from-lport 1002 'ip4 || ip6'  
> > > > allow-related
> > > > +
> > > > +m_as ovn-gw-1 ip netns add ovn-ext0
> > > > +m_as ovn-gw-1 ovs-vsctl add-port br-ex ext0 -- set interface ext0 
> > > > type=internal
> > > > +m_as ovn-gw-1 ip link set ext0 netns ovn-ext0
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext0 ip link set ext0 up
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext0 ip addr add 172.20.0.1/24 dev ext0
> > > > +
> > > > +m_as ovn-gw-1 ovs-vsctl add-port br-ex ext1 -- set interface ext1 
> > > > type=internal
> > > > +m_as ovn-gw-1 ip link set ext1 netns ovn-ext0
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext0 ip link set ext1 up
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext0 ip addr add 172.20.1.1/24 dev ext1
> > > > +
> > > > +m_as ovn-gw-1 ip netns add ovn-ext2
> > > > +m_as ovn-gw-1 ovs-vsctl add-port br-ex ext2 -- set interface ext2 
> > > > type=internal
> > > > +m_as ovn-gw-1 ip link set ext2 netns ovn-ext2
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext2 ip link set ext2 up
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext2 ip addr add 172.20.1.2/24 dev ext2
> > > > +m_as ovn-gw-1 ip netns exec ovn-ext2 ip route add default via 
> > > > 172.20.1.1 dev ext2
> > > > +
> > > > +m_as ovn-gw-1 ovs-vsctl set open . 
> > > > external-ids:ovn-bridge-mappings=public:br-ex
> > > > +m_as ovn-chassis-1 ovs-vsctl set open . 
> > > > external-ids:ovn-bridge-mappings=public:br-ex
> > > > +m_as ovn-chassis-2 ovs-vsctl set open . 
> > > > external-ids:ovn-bridge-mappings=public:br-ex
> > > > +
> > > > +m_wait_for_ports_up sw1-port1
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 20.0.0.3 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route flush dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add 10.0.0.0/24 
> > > > dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add default via 
> > > > 10.0.0.1 dev sw0p1])
> > > > +
> > > > +m_as ovn-chassis-1 ip route change 170.168.0.0/16 mtu 1200 dev eth1
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -c 5 -s 1300 -M do 
> > > > 20.0.0.3 2>&1 |grep -q "message too long, mtu=1142"])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route flush dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add 10.0.0.0/24 
> > > > dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add default via 
> > > > 10.0.0.1 dev sw0p1])
> > > > +
> > > > +m_as ovn-chassis-1 ip route change 170.168.0.0/16 mtu 1400 dev eth1
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping6 -c 5 -s 1450 -M do 
> > > > 2000::3 2>&1 |grep -q "message too long, mtu: 1342"])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route flush dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add 10.0.0.0/24 
> > > > dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add default via 
> > > > 10.0.0.1 dev sw0p1])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 172.20.1.2 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-gw-1], [ovn-ext0], [ip link set dev ext1 mtu 
> > > > 1100])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -c 20 -i 0.5 -s 1300 
> > > > -M do 172.20.1.2 2>&1 |grep -q "mtu = 1100"])
> > > > +
> > > > +# Create vxlan tunnels
> > > > +for c in ovn-chassis-1 ovn-chassis-2 ovn-gw-1
> > > > +do
> > > > +    m_as $c ovs-vsctl set open . external-ids:ovn-encap-type=vxlan
> > > > +done
> > > > +
> > > > +OVS_WAIT_UNTIL([m_as ovn-chassis-1 ip link show | grep -q vxlan_sys])
> > > > +OVS_WAIT_UNTIL([m_as ovn-chassis-2 ip link show | grep -q vxlan_sys])
> > > > +OVS_WAIT_UNTIL([m_as ovn-gw-1 ip link show | grep -q vxlan_sys])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route flush dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add 10.0.0.0/24 
> > > > dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add default via 
> > > > 10.0.0.1 dev sw0p1])
> > > > +
> > > > +m_as ovn-chassis-1 ip route change 170.168.0.0/16 mtu 1200 dev eth1
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 20.0.0.3 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -c 5 -s 1300 -M do 
> > > > 20.0.0.3 2>&1 |grep -q "message too long, mtu=1150"])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route flush dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add 10.0.0.0/24 
> > > > dev sw0p1])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ip route add default via 
> > > > 10.0.0.1 dev sw0p1])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-gw-1], [ovn-ext0], [ip link set dev ext1 mtu 
> > > > 1100])
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -q -c 3 -i 0.3 -w 2 
> > > > 172.20.1.2 | FORMAT_PING], \
> > > > +[0], [dnl
> > > > +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> > > > +])
> > > > +
> > > > +M_NS_CHECK_EXEC([ovn-chassis-1], [sw0p1], [ping -c 20 -i 0.5 -s 1300 
> > > > -M do 172.20.1.2 2>&1 |grep -q "mtu = 1150"])
> > > > +
> > > > +AT_CLEANUP
> > > > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> > > > index a267daca2..223e53991 100644
> > > > --- a/tests/ovn-northd.at
> > > > +++ b/tests/ovn-northd.at
> > > > @@ -6492,6 +6492,9 @@ AT_CAPTURE_FILE([lrflows])
> > > >
> > > >  # Check the flows in lr_in_admission stage
> > > >  AT_CHECK([grep lr_in_admission lrflows | grep cr-DR | sort], [0], [dnl
> > > > +  table=0 (lr_in_admission    ), priority=120  , match=(((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)) && eth.dst == 02:ac:10:01:00:01 && 
> > > > !is_chassis_resident("cr-DR-S1")), action=(outport = inport; inport = 
> > > > "DR-S1"; next;)
> > > > +  table=0 (lr_in_admission    ), priority=120  , match=(((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)) && eth.dst == 03:ac:10:01:00:01 && 
> > > > !is_chassis_resident("cr-DR-S2")), action=(outport = inport; inport = 
> > > > "DR-S2"; next;)
> > > > +  table=0 (lr_in_admission    ), priority=120  , match=(((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)) && eth.dst == 04:ac:10:01:00:01 && 
> > > > !is_chassis_resident("cr-DR-S3")), action=(outport = inport; inport = 
> > > > "DR-S3"; next;)
> > > >    table=0 (lr_in_admission    ), priority=50   , match=(eth.dst == 
> > > > 02:ac:10:01:00:01 && inport == "DR-S1" && 
> > > > is_chassis_resident("cr-DR-S1")), action=(xreg0[[0..47]] = 
> > > > 02:ac:10:01:00:01; next;)
> > > >    table=0 (lr_in_admission    ), priority=50   , match=(eth.dst == 
> > > > 03:ac:10:01:00:01 && inport == "DR-S2" && 
> > > > is_chassis_resident("cr-DR-S2")), action=(xreg0[[0..47]] = 
> > > > 03:ac:10:01:00:01; next;)
> > > >    table=0 (lr_in_admission    ), priority=50   , match=(eth.dst == 
> > > > 04:ac:10:01:00:01 && inport == "DR-S3" && 
> > > > is_chassis_resident("cr-DR-S3")), action=(xreg0[[0..47]] = 
> > > > 04:ac:10:01:00:01; next;)
> > > > @@ -6551,6 +6554,7 @@ AT_CAPTURE_FILE([lrflows])
> > > >
> > > >  # Check the flows in lr_in_admission stage
> > > >  AT_CHECK([grep lr_in_admission lrflows | grep lrp1 | sed 
> > > > 's/table=../table=??/' | sort], [0], [dnl
> > > > +  table=??(lr_in_admission    ), priority=120  , match=(((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)) && eth.dst == 00:00:00:00:00:01 && 
> > > > !is_chassis_resident("cr-lrp1")), action=(outport = inport; inport = 
> > > > "lrp1"; next;)
> > > >    table=??(lr_in_admission    ), priority=50   , match=(eth.dst == 
> > > > 00:00:00:00:00:01 && inport == "lrp1" && 
> > > > is_chassis_resident("cr-lrp1")), action=(xreg0[[0..47]] = 
> > > > 00:00:00:00:00:01; next;)
> > > >    table=??(lr_in_admission    ), priority=50   , match=(eth.mcast && 
> > > > inport == "lrp1"), action=(xreg0[[0..47]] = 00:00:00:00:00:01; next;)
> > > >  ])
> > > > @@ -6572,6 +6576,7 @@ AT_CAPTURE_FILE([lrflows])
> > > >
> > > >  # Check the flows in lr_in_admission stage
> > > >  AT_CHECK([grep lr_in_admission lrflows | grep lrp1 | sed 
> > > > 's/table=../table=??/' | sort], [0], [dnl
> > > > +  table=??(lr_in_admission    ), priority=120  , match=(((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)) && eth.dst == 00:00:00:00:00:01 && 
> > > > !is_chassis_resident("cr-lrp1")), action=(outport = inport; inport = 
> > > > "lrp1"; next;)
> > > >    table=??(lr_in_admission    ), priority=50   , match=(eth.dst == 
> > > > 00:00:00:00:00:01 && inport == "lrp1"), action=(xreg0[[0..47]] = 
> > > > 00:00:00:00:00:01; next;)
> > > >    table=??(lr_in_admission    ), priority=50   , match=(eth.mcast && 
> > > > inport == "lrp1"), action=(xreg0[[0..47]] = 00:00:00:00:00:01; next;)
> > > >  ])
> > > > @@ -6590,6 +6595,7 @@ AT_CAPTURE_FILE([lrflows])
> > > >
> > > >  # Check the flows in lr_in_admission stage
> > > >  AT_CHECK([grep lr_in_admission lrflows | grep lrp1 | sed 
> > > > 's/table=../table=??/' | sort], [0], [dnl
> > > > +  table=??(lr_in_admission    ), priority=120  , match=(((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)) && eth.dst == 00:00:00:00:00:01 && 
> > > > !is_chassis_resident("cr-lrp1")), action=(outport = inport; inport = 
> > > > "lrp1"; next;)
> > > >    table=??(lr_in_admission    ), priority=50   , match=(eth.dst == 
> > > > 00:00:00:00:00:01 && inport == "lrp1" && 
> > > > is_chassis_resident("cr-lrp1")), action=(xreg0[[0..47]] = 
> > > > 00:00:00:00:00:01; next;)
> > > >    table=??(lr_in_admission    ), priority=50   , match=(eth.mcast && 
> > > > inport == "lrp1"), action=(xreg0[[0..47]] = 00:00:00:00:00:01; next;)
> > > >  ])
> > > > @@ -8343,6 +8349,9 @@ AT_CHECK([cat sw0flows | grep -e port_sec -e 
> > > > ls_in_l2_lkup -e ls_in_l2_unknown |
> > > >  sort | sed 's/table=../table=??/' ], [0], [dnl
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(eth.src[[40]]), action=(drop;)
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(vlan.present), action=(drop;)
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > >    table=??(ls_in_check_port_sec), priority=50   , match=(1), 
> > > > action=(reg0[[15]] = check_in_port_sec(); next;)
> > > >    table=??(ls_in_apply_port_sec), priority=0    , match=(1), 
> > > > action=(next;)
> > > >    table=??(ls_in_apply_port_sec), priority=50   , match=(reg0[[15]] == 
> > > > 1), action=(drop;)
> > > > @@ -8369,6 +8378,9 @@ AT_CHECK([cat sw0flows | grep -e port_sec -e 
> > > > ls_in_l2_lkup -e ls_in_l2_unknown |
> > > >  sort | sed 's/table=../table=??/' ], [0], [dnl
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(eth.src[[40]]), action=(drop;)
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(vlan.present), action=(drop;)
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > >    table=??(ls_in_check_port_sec), priority=50   , match=(1), 
> > > > action=(reg0[[15]] = check_in_port_sec(); next;)
> > > >    table=??(ls_in_apply_port_sec), priority=0    , match=(1), 
> > > > action=(next;)
> > > >    table=??(ls_in_apply_port_sec), priority=50   , match=(reg0[[15]] == 
> > > > 1), action=(drop;)
> > > > @@ -8396,6 +8408,9 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(eth.src[[40]]), action=(drop;)
> > > >    table=??(ls_in_check_port_sec), priority=100  , match=(inport == 
> > > > "sw0p1"), action=(reg0[[15]] = 1; next;)
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(vlan.present), action=(drop;)
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > >    table=??(ls_in_check_port_sec), priority=50   , match=(1), 
> > > > action=(reg0[[15]] = check_in_port_sec(); next;)
> > > >    table=??(ls_in_apply_port_sec), priority=0    , match=(1), 
> > > > action=(next;)
> > > >    table=??(ls_in_apply_port_sec), priority=50   , match=(reg0[[15]] == 
> > > > 1), action=(drop;)
> > > > @@ -8422,6 +8437,9 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(eth.src[[40]]), action=(drop;)
> > > >    table=??(ls_in_check_port_sec), priority=100  , match=(inport == 
> > > > "sw0p1"), action=(reg0[[15]] = 1; next;)
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(vlan.present), action=(drop;)
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > >    table=??(ls_in_check_port_sec), priority=50   , match=(1), 
> > > > action=(reg0[[15]] = check_in_port_sec(); next;)
> > > >    table=??(ls_in_check_port_sec), priority=70   , match=(inport == 
> > > > "sw0p2"), action=(set_queue(10); reg0[[15]] = check_in_port_sec(); 
> > > > next;)
> > > >    table=??(ls_in_apply_port_sec), priority=0    , match=(1), 
> > > > action=(next;)
> > > > @@ -8451,6 +8469,9 @@ AT_CHECK([cat sw0flows | grep -e port_sec -e 
> > > > ls_in_l2_lkup -e ls_in_l2_unknown |
> > > >  sort | sed 's/table=../table=??/' ], [0], [dnl
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(eth.src[[40]]), action=(drop;)
> > > >    table=??(ls_in_check_port_sec), priority=100  , 
> > > > match=(vlan.present), action=(drop;)
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > > +  table=??(ls_in_check_port_sec), priority=110  , match=((ip4 && 
> > > > icmp4.type == 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && 
> > > > icmp6.code == 0)), action=(next; )
> > > >    table=??(ls_in_check_port_sec), priority=50   , match=(1), 
> > > > action=(reg0[[15]] = check_in_port_sec(); next;)
> > > >    table=??(ls_in_check_port_sec), priority=70   , match=(inport == 
> > > > "localnetport"), action=(set_queue(10); reg0[[15]] = 
> > > > check_in_port_sec(); next;)
> > > >    table=??(ls_in_check_port_sec), priority=70   , match=(inport == 
> > > > "sw0p1"), action=(reg0[[14]] = 1; next(pipeline=ingress, table=17);)
> > > > --
> > > > 2.43.0
> > > >
> > > >
> > > > _______________________________________________
> > > > dev mailing list
> > > > [email protected]
> > > > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> > > >
> > >
> > _______________________________________________
> > dev mailing list
> > [email protected]
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> 
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to