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