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