| // SPDX-License-Identifier: GPL-2.0 |
| // Copyright (c) 2019 Isovalent, Inc. |
| |
| #include <linux/bpf.h> |
| #include <linux/pkt_cls.h> |
| #include <string.h> |
| |
| #include <bpf/bpf_helpers.h> |
| |
| struct { |
| __uint(type, BPF_MAP_TYPE_ARRAY); |
| __uint(max_entries, 11); |
| __type(key, __u32); |
| __type(value, __u64); |
| } result_number SEC(".maps"); |
| |
| struct { |
| __uint(type, BPF_MAP_TYPE_ARRAY); |
| __uint(max_entries, 5); |
| __type(key, __u32); |
| const char (*value)[32]; |
| } result_string SEC(".maps"); |
| |
| struct foo { |
| __u8 a; |
| __u32 b; |
| __u64 c; |
| }; |
| |
| struct { |
| __uint(type, BPF_MAP_TYPE_ARRAY); |
| __uint(max_entries, 5); |
| __type(key, __u32); |
| __type(value, struct foo); |
| } result_struct SEC(".maps"); |
| |
| /* Relocation tests for __u64s. */ |
| static __u64 num0; |
| static __u64 num1 = 42; |
| static const __u64 num2 = 24; |
| static __u64 num3 = 0; |
| static __u64 num4 = 0xffeeff; |
| static const __u64 num5 = 0xabab; |
| static const __u64 num6 = 0xab; |
| |
| /* Relocation tests for strings. */ |
| static const char str0[32] = "abcdefghijklmnopqrstuvwxyz"; |
| static char str1[32] = "abcdefghijklmnopqrstuvwxyz"; |
| static char str2[32]; |
| |
| /* Relocation tests for structs. */ |
| static const struct foo struct0 = { |
| .a = 42, |
| .b = 0xfefeefef, |
| .c = 0x1111111111111111ULL, |
| }; |
| static struct foo struct1; |
| static const struct foo struct2; |
| static struct foo struct3 = { |
| .a = 41, |
| .b = 0xeeeeefef, |
| .c = 0x2111111111111111ULL, |
| }; |
| |
| #define test_reloc(map, num, var) \ |
| do { \ |
| __u32 key = num; \ |
| bpf_map_update_elem(&result_##map, &key, var, 0); \ |
| } while (0) |
| |
| SEC("tc") |
| int load_static_data(struct __sk_buff *skb) |
| { |
| static const __u64 bar = ~0; |
| |
| test_reloc(number, 0, &num0); |
| test_reloc(number, 1, &num1); |
| test_reloc(number, 2, &num2); |
| test_reloc(number, 3, &num3); |
| test_reloc(number, 4, &num4); |
| test_reloc(number, 5, &num5); |
| num4 = 1234; |
| test_reloc(number, 6, &num4); |
| test_reloc(number, 7, &num0); |
| test_reloc(number, 8, &num6); |
| |
| test_reloc(string, 0, str0); |
| test_reloc(string, 1, str1); |
| test_reloc(string, 2, str2); |
| str1[5] = 'x'; |
| test_reloc(string, 3, str1); |
| __builtin_memcpy(&str2[2], "hello", sizeof("hello")); |
| test_reloc(string, 4, str2); |
| |
| test_reloc(struct, 0, &struct0); |
| test_reloc(struct, 1, &struct1); |
| test_reloc(struct, 2, &struct2); |
| test_reloc(struct, 3, &struct3); |
| |
| test_reloc(number, 9, &struct0.c); |
| test_reloc(number, 10, &bar); |
| |
| return TC_ACT_OK; |
| } |
| |
| char _license[] SEC("license") = "GPL"; |