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