xref: /linux/tools/testing/selftests/bpf/progs/test_btf_newkv.c (revision f6d08d9d8543c8ee494b307804b28e2750ffedb9)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2018 Facebook */
3 #include <linux/bpf.h>
4 #include "bpf_helpers.h"
5 
6 int _version SEC("version") = 1;
7 
8 struct ipv_counts {
9 	unsigned int v4;
10 	unsigned int v6;
11 };
12 
13 /* just to validate we can handle maps in multiple sections */
14 struct bpf_map_def SEC("maps") btf_map_legacy = {
15 	.type = BPF_MAP_TYPE_ARRAY,
16 	.key_size = sizeof(int),
17 	.value_size = sizeof(long long),
18 	.max_entries = 4,
19 };
20 
21 BPF_ANNOTATE_KV_PAIR(btf_map_legacy, int, struct ipv_counts);
22 
23 struct {
24 	int *key;
25 	struct ipv_counts *value;
26 	unsigned int type;
27 	unsigned int max_entries;
28 } btf_map SEC(".maps") = {
29 	.type = BPF_MAP_TYPE_ARRAY,
30 	.max_entries = 4,
31 };
32 
33 struct dummy_tracepoint_args {
34 	unsigned long long pad;
35 	struct sock *sock;
36 };
37 
38 __attribute__((noinline))
39 static int test_long_fname_2(struct dummy_tracepoint_args *arg)
40 {
41 	struct ipv_counts *counts;
42 	int key = 0;
43 
44 	if (!arg->sock)
45 		return 0;
46 
47 	counts = bpf_map_lookup_elem(&btf_map, &key);
48 	if (!counts)
49 		return 0;
50 
51 	counts->v6++;
52 
53 	/* just verify we can reference both maps */
54 	counts = bpf_map_lookup_elem(&btf_map_legacy, &key);
55 	if (!counts)
56 		return 0;
57 
58 	return 0;
59 }
60 
61 __attribute__((noinline))
62 static int test_long_fname_1(struct dummy_tracepoint_args *arg)
63 {
64 	return test_long_fname_2(arg);
65 }
66 
67 SEC("dummy_tracepoint")
68 int _dummy_tracepoint(struct dummy_tracepoint_args *arg)
69 {
70 	return test_long_fname_1(arg);
71 }
72 
73 char _license[] SEC("license") = "GPL";
74