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