Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: Check VLAN tag and proto in xdp_metadata

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>

authored by

Larysa Zaremba and committed by
Alexei Starovoitov
4c6612f6 a3850af4

+26 -2
+18 -2
tools/testing/selftests/bpf/prog_tests/xdp_metadata.c
··· 38 38 #define TX_MAC "00:00:00:00:00:01" 39 39 #define RX_MAC "00:00:00:00:00:02" 40 40 41 + #define VLAN_ID 59 42 + #define VLAN_PROTO "802.1Q" 43 + #define VLAN_PID htons(ETH_P_8021Q) 44 + #define TX_NAME_VLAN TX_NAME "." TO_STR(VLAN_ID) 45 + 41 46 #define XDP_RSS_TYPE_L4 BIT(3) 47 + #define VLAN_VID_MASK 0xfff 42 48 43 49 struct xsk { 44 50 void *umem_area; ··· 329 323 if (!sent_from_af_xdp) { 330 324 if (!ASSERT_NEQ(meta->rx_hash_type & XDP_RSS_TYPE_L4, 0, "rx_hash_type")) 331 325 return -1; 326 + 327 + if (!ASSERT_EQ(meta->rx_vlan_tci & VLAN_VID_MASK, VLAN_ID, "rx_vlan_tci")) 328 + return -1; 329 + 330 + if (!ASSERT_EQ(meta->rx_vlan_proto, VLAN_PID, "rx_vlan_proto")) 331 + return -1; 332 332 goto done; 333 333 } 334 334 ··· 390 378 391 379 SYS(out, "ip link set dev " TX_NAME " address " TX_MAC); 392 380 SYS(out, "ip link set dev " TX_NAME " up"); 393 - SYS(out, "ip addr add " TX_ADDR "/" PREFIX_LEN " dev " TX_NAME); 381 + 382 + SYS(out, "ip link add link " TX_NAME " " TX_NAME_VLAN 383 + " type vlan proto " VLAN_PROTO " id " TO_STR(VLAN_ID)); 384 + SYS(out, "ip link set dev " TX_NAME_VLAN " up"); 385 + SYS(out, "ip addr add " TX_ADDR "/" PREFIX_LEN " dev " TX_NAME_VLAN); 394 386 395 387 /* Avoid ARP calls */ 396 - SYS(out, "ip -4 neigh add " RX_ADDR " lladdr " RX_MAC " dev " TX_NAME); 388 + SYS(out, "ip -4 neigh add " RX_ADDR " lladdr " RX_MAC " dev " TX_NAME_VLAN); 397 389 398 390 switch_ns_to_rx(&tok); 399 391
+5
tools/testing/selftests/bpf/progs/xdp_metadata.c
··· 23 23 __u64 *timestamp) __ksym; 24 24 extern int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, __u32 *hash, 25 25 enum xdp_rss_hash_type *rss_type) __ksym; 26 + extern int bpf_xdp_metadata_rx_vlan_tag(const struct xdp_md *ctx, 27 + __be16 *vlan_proto, 28 + __u16 *vlan_tci) __ksym; 26 29 27 30 SEC("xdp") 28 31 int rx(struct xdp_md *ctx) ··· 89 86 meta->rx_timestamp = 1; 90 87 91 88 bpf_xdp_metadata_rx_hash(ctx, &meta->rx_hash, &meta->rx_hash_type); 89 + bpf_xdp_metadata_rx_vlan_tag(ctx, &meta->rx_vlan_proto, 90 + &meta->rx_vlan_tci); 92 91 93 92 return bpf_redirect_map(&xsk, ctx->rx_queue_index, XDP_PASS); 94 93 }
+3
tools/testing/selftests/bpf/testing_helpers.h
··· 9 9 #include <bpf/libbpf.h> 10 10 #include <time.h> 11 11 12 + #define __TO_STR(x) #x 13 + #define TO_STR(x) __TO_STR(x) 14 + 12 15 int parse_num_list(const char *s, bool **set, int *set_len); 13 16 __u32 link_info_prog_id(const struct bpf_link *link, struct bpf_link_info *info); 14 17 int bpf_prog_test_load(const char *file, enum bpf_prog_type type,