On 12/7/22 17:17, Eelco Chaudron wrote:
> The dpif_execute_helper_cb() function is supposed to add the
> OVS_ACTION_ATTR_SET(OVS_KEY_ATTR_TUNNEL()) action to the
> list of actions when passing it down to the kernel.
> 
> This function was only checking if the IPv4 destination
> address was set, not both. This patch fixes this, including
> a datapath testcase.
> 
> Fixes: 076caa2fb077 ("ofproto: Meter translation.")
> Signed-off-by: Eelco Chaudron <echau...@redhat.com>
> ---
>  lib/dpif.c              |    2 +-
>  tests/system-traffic.at |   44 ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 45 insertions(+), 1 deletion(-)

Hi, Eelco.  Good catch!

I wonder if we can have a unit test instead of a system test here.
The issue doesn't seem to depend on the datapath implementation.

Maybe something similar to what we have in tests/tunnel-push-pop.at ?
We can set IPs and capture packets in pcap files on dummy ports
as well.  Probably, the 'tunnel_push_pop - packet_out debug_slow'
test can be used as a reference.

A couple of small comments inline.

Best regards, Ilya Maximets.

> 
> diff --git a/lib/dpif.c b/lib/dpif.c
> index 40f5fe446..fe4db83fb 100644
> --- a/lib/dpif.c
> +++ b/lib/dpif.c
> @@ -1213,7 +1213,7 @@ dpif_execute_helper_cb(void *aux_, struct 
> dp_packet_batch *packets_,
>              /* The Linux kernel datapath throws away the tunnel information
>               * that we supply as metadata.  We have to use a "set" action to
>               * supply it. */
> -            if (md->tunnel.ip_dst) {
> +            if (flow_tnl_dst_is_set(&md->tunnel)) {
>                  odp_put_tunnel_action(&md->tunnel, &execute_actions, NULL);
>              }
>              ofpbuf_put(&execute_actions, action, NLA_ALIGN(action->nla_len));
> diff --git a/tests/system-traffic.at b/tests/system-traffic.at
> index e5403519f..91e15ddef 100644
> --- a/tests/system-traffic.at
> +++ b/tests/system-traffic.at
> @@ -855,6 +855,50 @@ NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 
> 2 10.1.1.100 | FORMAT_PI
>  OVS_TRAFFIC_VSWITCHD_STOP
>  AT_CLEANUP
>  
> +AT_SETUP([datapath - slow_action on geneve6 tunnel])
> +AT_SKIP_IF([test $HAVE_TCPDUMP = no])
> +OVS_CHECK_TUNNEL_TSO()
> +OVS_CHECK_GENEVE_UDP6ZEROCSUM()
> +
> +OVS_TRAFFIC_VSWITCHD_START()
> +ADD_BR([br-underlay])
> +
> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
> +AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
> +
> +ADD_NAMESPACES(at_ns0)
> +
> +dnl Set up underlay link from host into the namespace using veth pair.
> +ADD_VETH(p0, at_ns0, br-underlay, "fc00::1/64", [], [], "nodad")
> +AT_CHECK([ip addr add dev br-underlay "fc00::100/64" nodad])
> +AT_CHECK([ip link set dev br-underlay up])
> +
> +dnl Set up tunnel endpoints on OVS outside the namespace and with a native
> +dnl linux device inside the namespace.
> +ADD_OVS_TUNNEL6([geneve], [br0], [at_gnv0], [fc00::1], [10.1.1.100/24])
> +ADD_NATIVE_TUNNEL6([geneve], [ns_gnv0], [at_ns0], [fc00::100], [10.1.1.1/24],
> +                   [vni 0 udp6zerocsumtx udp6zerocsumrx])
> +AT_CHECK([ovs-ofctl add-flow br0 "table=37,actions=at_gnv0"])
> +
> +OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::100])
> +
> +dnl First, check the underlay.
> +NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::100 | FORMAT_PING], 
> [0], [dnl
> +3 packets transmitted, 3 received, 0% packet loss, time 0ms
> +])
> +
> +dnl Start tcpdump to capture the encapsulated packets.
> +NETNS_DAEMONIZE([at_ns0], [tcpdump -l -n -xx -U -i p0 > p0.pcap], 
> [tcpdump.pid])

This doesn't generate a pcap file AFAICT, so the name p0.pcap is a bit
misleading.

> +sleep 1
> +
> +dnl Generate a single packet trough the controler that needs an ARP 
> modification
> +AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 "in_port=controller 
> packet=fffffffffffffa163e949d8008060001080006040001fa163e949d80c0a820300000000000000a0000fe
>  
> actions=set_field:0xa0000f4->reg1,move:NXM_NX_XXREG0[[64..95]]->NXM_OF_ARP_SPA[[]],resubmit(,37)"])


As an alternative, we may use 'actions=debug_slow,<...>' to force the
slow action execution in userspace.  This should ensure that we're
testing what we want to test.

> +
> +dnl Stop OVS and tcpdump and verify the results.
> +OVS_TRAFFIC_VSWITCHD_STOP
> +AT_CHECK([grep -Eq "IP6 fc00::100\..*> fc00::1.geneve: Geneve, Flags 
> \[[none\]], vni 0x0: ARP, Request who-has 10\.0\.0\.254 tell 10\.0\.0\.244, 
> length 28" p0.pcap])
> +AT_CLEANUP
> +
>  AT_SETUP([datapath - ping over gre tunnel by simulated packets])
>  OVS_CHECK_TUNNEL_TSO()
>  OVS_CHECK_MIN_KERNEL(3, 10)

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to