selftests/bpf: Check VLAN tag and proto in xdp_metadata
authorLarysa Zaremba <larysa.zaremba@intel.com>
Tue, 5 Dec 2023 21:08:47 +0000 (22:08 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 14 Dec 2023 00:16:41 +0000 (16:16 -0800)
Verify, whether VLAN tag and proto are set correctly.

To simulate "stripped" VLAN tag on veth, send test packet from VLAN
interface.

Also, add TO_STR() macro for convenience.

Acked-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
Link: https://lore.kernel.org/r/20231205210847.28460-19-larysa.zaremba@intel.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/xdp_metadata.c
tools/testing/selftests/bpf/progs/xdp_metadata.c
tools/testing/selftests/bpf/testing_helpers.h

index e7f06cbdd84585bfa5e2521d9aabb7bb06a8f9be..05edcf32f52898ec25efcae773da6a8aa490d7fe 100644 (file)
 #define TX_MAC "00:00:00:00:00:01"
 #define RX_MAC "00:00:00:00:00:02"
 
+#define VLAN_ID 59
+#define VLAN_PROTO "802.1Q"
+#define VLAN_PID htons(ETH_P_8021Q)
+#define TX_NAME_VLAN TX_NAME "." TO_STR(VLAN_ID)
+
 #define XDP_RSS_TYPE_L4 BIT(3)
+#define VLAN_VID_MASK 0xfff
 
 struct xsk {
        void *umem_area;
@@ -323,6 +329,12 @@ static int verify_xsk_metadata(struct xsk *xsk, bool sent_from_af_xdp)
        if (!sent_from_af_xdp) {
                if (!ASSERT_NEQ(meta->rx_hash_type & XDP_RSS_TYPE_L4, 0, "rx_hash_type"))
                        return -1;
+
+               if (!ASSERT_EQ(meta->rx_vlan_tci & VLAN_VID_MASK, VLAN_ID, "rx_vlan_tci"))
+                       return -1;
+
+               if (!ASSERT_EQ(meta->rx_vlan_proto, VLAN_PID, "rx_vlan_proto"))
+                       return -1;
                goto done;
        }
 
@@ -378,10 +390,14 @@ void test_xdp_metadata(void)
 
        SYS(out, "ip link set dev " TX_NAME " address " TX_MAC);
        SYS(out, "ip link set dev " TX_NAME " up");
-       SYS(out, "ip addr add " TX_ADDR "/" PREFIX_LEN " dev " TX_NAME);
+
+       SYS(out, "ip link add link " TX_NAME " " TX_NAME_VLAN
+                " type vlan proto " VLAN_PROTO " id " TO_STR(VLAN_ID));
+       SYS(out, "ip link set dev " TX_NAME_VLAN " up");
+       SYS(out, "ip addr add " TX_ADDR "/" PREFIX_LEN " dev " TX_NAME_VLAN);
 
        /* Avoid ARP calls */
-       SYS(out, "ip -4 neigh add " RX_ADDR " lladdr " RX_MAC " dev " TX_NAME);
+       SYS(out, "ip -4 neigh add " RX_ADDR " lladdr " RX_MAC " dev " TX_NAME_VLAN);
 
        switch_ns_to_rx(&tok);
 
index 5d6c1245c3106ecf91cffb604c60046222eb851d..31ca229bb3c0f182483334a4ab0bd204acae20f3 100644 (file)
@@ -23,6 +23,9 @@ extern int bpf_xdp_metadata_rx_timestamp(const struct xdp_md *ctx,
                                         __u64 *timestamp) __ksym;
 extern int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, __u32 *hash,
                                    enum xdp_rss_hash_type *rss_type) __ksym;
+extern int bpf_xdp_metadata_rx_vlan_tag(const struct xdp_md *ctx,
+                                       __be16 *vlan_proto,
+                                       __u16 *vlan_tci) __ksym;
 
 SEC("xdp")
 int rx(struct xdp_md *ctx)
@@ -86,6 +89,8 @@ int rx(struct xdp_md *ctx)
                meta->rx_timestamp = 1;
 
        bpf_xdp_metadata_rx_hash(ctx, &meta->rx_hash, &meta->rx_hash_type);
+       bpf_xdp_metadata_rx_vlan_tag(ctx, &meta->rx_vlan_proto,
+                                    &meta->rx_vlan_tci);
 
        return bpf_redirect_map(&xsk, ctx->rx_queue_index, XDP_PASS);
 }
index 5b7a55136741ac45e2b477fd1e304f2698467d16..35284faff4f2934d1b70a26e947e1c4f3f9b349b 100644 (file)
@@ -9,6 +9,9 @@
 #include <bpf/libbpf.h>
 #include <time.h>
 
+#define __TO_STR(x) #x
+#define TO_STR(x) __TO_STR(x)
+
 int parse_num_list(const char *s, bool **set, int *set_len);
 __u32 link_info_prog_id(const struct bpf_link *link, struct bpf_link_info *info);
 int bpf_prog_test_load(const char *file, enum bpf_prog_type type,