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/bpf_helpers.h>
9
10struct {
11 __uint(type, BPF_MAP_TYPE_ARRAY);
12 __uint(max_entries, 11);
13 __type(key, __u32);
14 __type(value, __u64);
15} result_number SEC(".maps");
16
17struct {
18 __uint(type, BPF_MAP_TYPE_ARRAY);
19 __uint(max_entries, 5);
20 __type(key, __u32);
21 const char (*value)[32];
22} result_string SEC(".maps");
23
24struct foo {
25 __u8 a;
26 __u32 b;
27 __u64 c;
28};
29
30struct {
31 __uint(type, BPF_MAP_TYPE_ARRAY);
32 __uint(max_entries, 5);
33 __type(key, __u32);
34 __type(value, struct foo);
35} result_struct SEC(".maps");
36
37/* Relocation tests for __u64s. */
38static __u64 num0;
39static __u64 num1 = 42;
40static const __u64 num2 = 24;
41static __u64 num3 = 0;
42static __u64 num4 = 0xffeeff;
43static const __u64 num5 = 0xabab;
44static const __u64 num6 = 0xab;
45
46/* Relocation tests for strings. */
47static const char str0[32] = "abcdefghijklmnopqrstuvwxyz";
48static char str1[32] = "abcdefghijklmnopqrstuvwxyz";
49static char str2[32];
50
51/* Relocation tests for structs. */
52static const struct foo struct0 = {
53 .a = 42,
54 .b = 0xfefeefef,
55 .c = 0x1111111111111111ULL,
56};
57static struct foo struct1;
58static const struct foo struct2;
59static 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
71SEC("tc")
72int 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
106char _license[] SEC("license") = "GPL";
107

source code of linux/tools/testing/selftests/bpf/progs/test_global_data.c