Linux Audio

Check our new training course

Linux BSP development engineering services

Need help to port Linux and bootloaders to your hardware?
Loading...
Note: File does not exist in v3.5.6.
  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";