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