test_global_data.c (2401B)
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";