Commit | Line | Data |
---|---|---|
a82d8cd3 DB |
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__ */ |