bpf_rand.h 3.1 KB

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