Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/bpf/bpf_rand.h
26285 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
#ifndef __BPF_RAND__
3
#define __BPF_RAND__
4
5
#include <stdint.h>
6
#include <stdlib.h>
7
#include <time.h>
8
9
static inline uint64_t bpf_rand_mask(uint64_t mask)
10
{
11
return (((uint64_t)(uint32_t)rand()) |
12
((uint64_t)(uint32_t)rand() << 32)) & mask;
13
}
14
15
#define bpf_rand_ux(x, m) \
16
static inline uint64_t bpf_rand_u##x(int shift) \
17
{ \
18
return bpf_rand_mask((m)) << shift; \
19
}
20
21
bpf_rand_ux( 8, 0xffULL)
22
bpf_rand_ux(16, 0xffffULL)
23
bpf_rand_ux(24, 0xffffffULL)
24
bpf_rand_ux(32, 0xffffffffULL)
25
bpf_rand_ux(40, 0xffffffffffULL)
26
bpf_rand_ux(48, 0xffffffffffffULL)
27
bpf_rand_ux(56, 0xffffffffffffffULL)
28
bpf_rand_ux(64, 0xffffffffffffffffULL)
29
30
static inline void bpf_semi_rand_init(void)
31
{
32
srand(time(NULL));
33
}
34
35
static inline uint64_t bpf_semi_rand_get(void)
36
{
37
switch (rand() % 39) {
38
case 0: return 0x000000ff00000000ULL | bpf_rand_u8(0);
39
case 1: return 0xffffffff00000000ULL | bpf_rand_u16(0);
40
case 2: return 0x00000000ffff0000ULL | bpf_rand_u16(0);
41
case 3: return 0x8000000000000000ULL | bpf_rand_u32(0);
42
case 4: return 0x00000000f0000000ULL | bpf_rand_u32(0);
43
case 5: return 0x0000000100000000ULL | bpf_rand_u24(0);
44
case 6: return 0x800ff00000000000ULL | bpf_rand_u32(0);
45
case 7: return 0x7fffffff00000000ULL | bpf_rand_u32(0);
46
case 8: return 0xffffffffffffff00ULL ^ bpf_rand_u32(24);
47
case 9: return 0xffffffffffffff00ULL | bpf_rand_u8(0);
48
case 10: return 0x0000000010000000ULL | bpf_rand_u32(0);
49
case 11: return 0xf000000000000000ULL | bpf_rand_u8(0);
50
case 12: return 0x0000f00000000000ULL | bpf_rand_u8(8);
51
case 13: return 0x000000000f000000ULL | bpf_rand_u8(16);
52
case 14: return 0x0000000000000f00ULL | bpf_rand_u8(32);
53
case 15: return 0x00fff00000000f00ULL | bpf_rand_u8(48);
54
case 16: return 0x00007fffffffffffULL ^ bpf_rand_u32(1);
55
case 17: return 0xffff800000000000ULL | bpf_rand_u8(4);
56
case 18: return 0xffff800000000000ULL | bpf_rand_u8(20);
57
case 19: return (0xffffffc000000000ULL + 0x80000ULL) | bpf_rand_u32(0);
58
case 20: return (0xffffffc000000000ULL - 0x04000000ULL) | bpf_rand_u32(0);
59
case 21: return 0x0000000000000000ULL | bpf_rand_u8(55) | bpf_rand_u32(20);
60
case 22: return 0xffffffffffffffffULL ^ bpf_rand_u8(3) ^ bpf_rand_u32(40);
61
case 23: return 0x0000000000000000ULL | bpf_rand_u8(bpf_rand_u8(0) % 64);
62
case 24: return 0x0000000000000000ULL | bpf_rand_u16(bpf_rand_u8(0) % 64);
63
case 25: return 0xffffffffffffffffULL ^ bpf_rand_u8(bpf_rand_u8(0) % 64);
64
case 26: return 0xffffffffffffffffULL ^ bpf_rand_u40(bpf_rand_u8(0) % 64);
65
case 27: return 0x0000800000000000ULL;
66
case 28: return 0x8000000000000000ULL;
67
case 29: return 0x0000000000000000ULL;
68
case 30: return 0xffffffffffffffffULL;
69
case 31: return bpf_rand_u16(bpf_rand_u8(0) % 64);
70
case 32: return bpf_rand_u24(bpf_rand_u8(0) % 64);
71
case 33: return bpf_rand_u32(bpf_rand_u8(0) % 64);
72
case 34: return bpf_rand_u40(bpf_rand_u8(0) % 64);
73
case 35: return bpf_rand_u48(bpf_rand_u8(0) % 64);
74
case 36: return bpf_rand_u56(bpf_rand_u8(0) % 64);
75
case 37: return bpf_rand_u64(bpf_rand_u8(0) % 64);
76
default: return bpf_rand_u64(0);
77
}
78
}
79
80
#endif /* __BPF_RAND__ */
81
82