selftests/bpf: Amend test_tunnel to exercise BPF_F_TUNINFO_FLAGS
authorShmulik Ladkani <shmulik@metanetworks.com>
Wed, 31 Aug 2022 14:40:10 +0000 (17:40 +0300)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 2 Sep 2022 13:21:03 +0000 (15:21 +0200)
Get the tunnel flags in {ipv6}vxlan_get_tunnel_src and ensure they are
aligned with tunnel params set at {ipv6}vxlan_set_tunnel_dst.

Signed-off-by: Shmulik Ladkani <shmulik.ladkani@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20220831144010.174110-2-shmulik.ladkani@gmail.com
tools/testing/selftests/bpf/progs/test_tunnel_kern.c

index df0673c..98af55f 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/bpf.h>
 #include <linux/if_ether.h>
 #include <linux/if_packet.h>
+#include <linux/if_tunnel.h>
 #include <linux/ip.h>
 #include <linux/ipv6.h>
 #include <linux/icmp.h>
@@ -386,7 +387,8 @@ int vxlan_get_tunnel_src(struct __sk_buff *skb)
        __u32 orig_daddr;
        __u32 index = 0;
 
-       ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0);
+       ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key),
+                                    BPF_F_TUNINFO_FLAGS);
        if (ret < 0) {
                log_err(ret);
                return TC_ACT_SHOT;
@@ -398,10 +400,13 @@ int vxlan_get_tunnel_src(struct __sk_buff *skb)
                return TC_ACT_SHOT;
        }
 
-       if (key.local_ipv4 != ASSIGNED_ADDR_VETH1 || md.gbp != 0x800FF) {
-               bpf_printk("vxlan key %d local ip 0x%x remote ip 0x%x gbp 0x%x\n",
+       if (key.local_ipv4 != ASSIGNED_ADDR_VETH1 || md.gbp != 0x800FF ||
+           !(key.tunnel_flags & TUNNEL_KEY) ||
+           (key.tunnel_flags & TUNNEL_CSUM)) {
+               bpf_printk("vxlan key %d local ip 0x%x remote ip 0x%x gbp 0x%x flags 0x%x\n",
                           key.tunnel_id, key.local_ipv4,
-                          key.remote_ipv4, md.gbp);
+                          key.remote_ipv4, md.gbp,
+                          bpf_ntohs(key.tunnel_flags));
                log_err(ret);
                return TC_ACT_SHOT;
        }
@@ -541,16 +546,19 @@ int ip6vxlan_get_tunnel_src(struct __sk_buff *skb)
        }
 
        ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key),
-                                    BPF_F_TUNINFO_IPV6);
+                                    BPF_F_TUNINFO_IPV6 | BPF_F_TUNINFO_FLAGS);
        if (ret < 0) {
                log_err(ret);
                return TC_ACT_SHOT;
        }
 
-       if (bpf_ntohl(key.local_ipv6[3]) != *local_ip) {
-               bpf_printk("ip6vxlan key %d local ip6 ::%x remote ip6 ::%x label 0x%x\n",
+       if (bpf_ntohl(key.local_ipv6[3]) != *local_ip ||
+           !(key.tunnel_flags & TUNNEL_KEY) ||
+           !(key.tunnel_flags & TUNNEL_CSUM)) {
+               bpf_printk("ip6vxlan key %d local ip6 ::%x remote ip6 ::%x label 0x%x flags 0x%x\n",
                           key.tunnel_id, bpf_ntohl(key.local_ipv6[3]),
-                          bpf_ntohl(key.remote_ipv6[3]), key.tunnel_label);
+                          bpf_ntohl(key.remote_ipv6[3]), key.tunnel_label,
+                          bpf_ntohs(key.tunnel_flags));
                bpf_printk("local_ip 0x%x\n", *local_ip);
                log_err(ret);
                return TC_ACT_SHOT;