Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef __BPF_RAND__
0003 #define __BPF_RAND__
0004 
0005 #include <stdint.h>
0006 #include <stdlib.h>
0007 #include <time.h>
0008 
0009 static inline uint64_t bpf_rand_mask(uint64_t mask)
0010 {
0011     return (((uint64_t)(uint32_t)rand()) |
0012             ((uint64_t)(uint32_t)rand() << 32)) & mask;
0013 }
0014 
0015 #define bpf_rand_ux(x, m)           \
0016 static inline uint64_t bpf_rand_u##x(int shift) \
0017 {                       \
0018     return bpf_rand_mask((m)) << shift; \
0019 }
0020 
0021 bpf_rand_ux( 8,               0xffULL)
0022 bpf_rand_ux(16,             0xffffULL)
0023 bpf_rand_ux(24,           0xffffffULL)
0024 bpf_rand_ux(32,         0xffffffffULL)
0025 bpf_rand_ux(40,       0xffffffffffULL)
0026 bpf_rand_ux(48,     0xffffffffffffULL)
0027 bpf_rand_ux(56,   0xffffffffffffffULL)
0028 bpf_rand_ux(64, 0xffffffffffffffffULL)
0029 
0030 static inline void bpf_semi_rand_init(void)
0031 {
0032     srand(time(NULL));
0033 }
0034 
0035 static inline uint64_t bpf_semi_rand_get(void)
0036 {
0037     switch (rand() % 39) {
0038     case  0: return 0x000000ff00000000ULL | bpf_rand_u8(0);
0039     case  1: return 0xffffffff00000000ULL | bpf_rand_u16(0);
0040     case  2: return 0x00000000ffff0000ULL | bpf_rand_u16(0);
0041     case  3: return 0x8000000000000000ULL | bpf_rand_u32(0);
0042     case  4: return 0x00000000f0000000ULL | bpf_rand_u32(0);
0043     case  5: return 0x0000000100000000ULL | bpf_rand_u24(0);
0044     case  6: return 0x800ff00000000000ULL | bpf_rand_u32(0);
0045     case  7: return 0x7fffffff00000000ULL | bpf_rand_u32(0);
0046     case  8: return 0xffffffffffffff00ULL ^ bpf_rand_u32(24);
0047     case  9: return 0xffffffffffffff00ULL | bpf_rand_u8(0);
0048     case 10: return 0x0000000010000000ULL | bpf_rand_u32(0);
0049     case 11: return 0xf000000000000000ULL | bpf_rand_u8(0);
0050     case 12: return 0x0000f00000000000ULL | bpf_rand_u8(8);
0051     case 13: return 0x000000000f000000ULL | bpf_rand_u8(16);
0052     case 14: return 0x0000000000000f00ULL | bpf_rand_u8(32);
0053     case 15: return 0x00fff00000000f00ULL | bpf_rand_u8(48);
0054     case 16: return 0x00007fffffffffffULL ^ bpf_rand_u32(1);
0055     case 17: return 0xffff800000000000ULL | bpf_rand_u8(4);
0056     case 18: return 0xffff800000000000ULL | bpf_rand_u8(20);
0057     case 19: return (0xffffffc000000000ULL + 0x80000ULL) | bpf_rand_u32(0);
0058     case 20: return (0xffffffc000000000ULL - 0x04000000ULL) | bpf_rand_u32(0);
0059     case 21: return 0x0000000000000000ULL | bpf_rand_u8(55) | bpf_rand_u32(20);
0060     case 22: return 0xffffffffffffffffULL ^ bpf_rand_u8(3) ^ bpf_rand_u32(40);
0061     case 23: return 0x0000000000000000ULL | bpf_rand_u8(bpf_rand_u8(0) % 64);
0062     case 24: return 0x0000000000000000ULL | bpf_rand_u16(bpf_rand_u8(0) % 64);
0063     case 25: return 0xffffffffffffffffULL ^ bpf_rand_u8(bpf_rand_u8(0) % 64);
0064     case 26: return 0xffffffffffffffffULL ^ bpf_rand_u40(bpf_rand_u8(0) % 64);
0065     case 27: return 0x0000800000000000ULL;
0066     case 28: return 0x8000000000000000ULL;
0067     case 29: return 0x0000000000000000ULL;
0068     case 30: return 0xffffffffffffffffULL;
0069     case 31: return bpf_rand_u16(bpf_rand_u8(0) % 64);
0070     case 32: return bpf_rand_u24(bpf_rand_u8(0) % 64);
0071     case 33: return bpf_rand_u32(bpf_rand_u8(0) % 64);
0072     case 34: return bpf_rand_u40(bpf_rand_u8(0) % 64);
0073     case 35: return bpf_rand_u48(bpf_rand_u8(0) % 64);
0074     case 36: return bpf_rand_u56(bpf_rand_u8(0) % 64);
0075     case 37: return bpf_rand_u64(bpf_rand_u8(0) % 64);
0076     default: return bpf_rand_u64(0);
0077     }
0078 }
0079 
0080 #endif /* __BPF_RAND__ */