1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2019 Isovalent, Inc.
3 
4 #include <linux/bpf.h>
5 #include <linux/pkt_cls.h>
6 #include <string.h>
7 
8 #include "bpf_helpers.h"
9 
10 struct bpf_map_def SEC("maps") result_number = {
11 	.type		= BPF_MAP_TYPE_ARRAY,
12 	.key_size	= sizeof(__u32),
13 	.value_size	= sizeof(__u64),
14 	.max_entries	= 11,
15 };
16 
17 struct bpf_map_def SEC("maps") result_string = {
18 	.type		= BPF_MAP_TYPE_ARRAY,
19 	.key_size	= sizeof(__u32),
20 	.value_size	= 32,
21 	.max_entries	= 5,
22 };
23 
24 struct foo {
25 	__u8  a;
26 	__u32 b;
27 	__u64 c;
28 };
29 
30 struct bpf_map_def SEC("maps") result_struct = {
31 	.type		= BPF_MAP_TYPE_ARRAY,
32 	.key_size	= sizeof(__u32),
33 	.value_size	= sizeof(struct foo),
34 	.max_entries	= 5,
35 };
36 
37 /* Relocation tests for __u64s. */
38 static       __u64 num0;
39 static       __u64 num1 = 42;
40 static const __u64 num2 = 24;
41 static       __u64 num3 = 0;
42 static       __u64 num4 = 0xffeeff;
43 static const __u64 num5 = 0xabab;
44 static const __u64 num6 = 0xab;
45 
46 /* Relocation tests for strings. */
47 static const char str0[32] = "abcdefghijklmnopqrstuvwxyz";
48 static       char str1[32] = "abcdefghijklmnopqrstuvwxyz";
49 static       char str2[32];
50 
51 /* Relocation tests for structs. */
52 static const struct foo struct0 = {
53 	.a = 42,
54 	.b = 0xfefeefef,
55 	.c = 0x1111111111111111ULL,
56 };
57 static struct foo struct1;
58 static const struct foo struct2;
59 static struct foo struct3 = {
60 	.a = 41,
61 	.b = 0xeeeeefef,
62 	.c = 0x2111111111111111ULL,
63 };
64 
65 #define test_reloc(map, num, var)					\
66 	do {								\
67 		__u32 key = num;					\
68 		bpf_map_update_elem(&result_##map, &key, var, 0);	\
69 	} while (0)
70 
71 SEC("static_data_load")
72 int load_static_data(struct __sk_buff *skb)
73 {
74 	static const __u64 bar = ~0;
75 
76 	test_reloc(number, 0, &num0);
77 	test_reloc(number, 1, &num1);
78 	test_reloc(number, 2, &num2);
79 	test_reloc(number, 3, &num3);
80 	test_reloc(number, 4, &num4);
81 	test_reloc(number, 5, &num5);
82 	num4 = 1234;
83 	test_reloc(number, 6, &num4);
84 	test_reloc(number, 7, &num0);
85 	test_reloc(number, 8, &num6);
86 
87 	test_reloc(string, 0, str0);
88 	test_reloc(string, 1, str1);
89 	test_reloc(string, 2, str2);
90 	str1[5] = 'x';
91 	test_reloc(string, 3, str1);
92 	__builtin_memcpy(&str2[2], "hello", sizeof("hello"));
93 	test_reloc(string, 4, str2);
94 
95 	test_reloc(struct, 0, &struct0);
96 	test_reloc(struct, 1, &struct1);
97 	test_reloc(struct, 2, &struct2);
98 	test_reloc(struct, 3, &struct3);
99 
100 	test_reloc(number,  9, &struct0.c);
101 	test_reloc(number, 10, &bar);
102 
103 	return TC_ACT_OK;
104 }
105 
106 char _license[] SEC("license") = "GPL";
107