linux/tools/testing/selftests/bpf/progs/test_global_data.c
<<
>>
Prefs
   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("classifier/static_data_load")
  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