linux/tools/testing/selftests/bpf/bpf_rand.h
<<
>>
Prefs
   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
   9static 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)                       \
  16static inline uint64_t bpf_rand_u##x(int shift) \
  17{                                               \
  18        return bpf_rand_mask((m)) << shift;     \
  19}
  20
  21bpf_rand_ux( 8,               0xffULL)
  22bpf_rand_ux(16,             0xffffULL)
  23bpf_rand_ux(24,           0xffffffULL)
  24bpf_rand_ux(32,         0xffffffffULL)
  25bpf_rand_ux(40,       0xffffffffffULL)
  26bpf_rand_ux(48,     0xffffffffffffULL)
  27bpf_rand_ux(56,   0xffffffffffffffULL)
  28bpf_rand_ux(64, 0xffffffffffffffffULL)
  29
  30static inline void bpf_semi_rand_init(void)
  31{
  32        srand(time(NULL));
  33}
  34
  35static 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