On Fri, Dec 9, 2016 at 3:27 AM, Savolainen, Petri (Nokia - FI/Espoo) <petri.savolai...@nokia-bell-labs.com> wrote: > > >> + >> +/** >> + * Generate repeatable random data for testing purposes >> + * >> + * For testing purposes it is often useful to generate "random" sequences >> that >> + * are repeatable. This is accomplished by supplying a seed value that is >> used >> + * for pseudo-random data generation. The caller-provided seed value is >> + * updated for each call to continue the sequence. Restarting a series of >> + * calls with the same initial seed value will generate the same sequence >> of >> + * random test data. >> + * >> + * This function should be used only for testing purposes. Use >> + * odp_random_data() for production. >> * >> - * @todo Define the implication of the use_entropy parameter >> + * @param[out] buf Output buffer >> + * @param len Length of output buffer in bytes >> + * @param kind Specifies the type of random data required. >> Request >> + * will fail if the implementation is unable to >> provide >> + * repeatable random of the requested type. This is >> + * always true for true random and may be true for >> + * cryptographic random. >> + * @param[in,out] seed Seed value to use >> * >> * @return Number of bytes written >> * @retval <0 on failure >> */ >> -int32_t odp_random_data(uint8_t *buf, int32_t size, odp_bool_t >> use_entropy); >> +int32_t odp_random_test_data(uint8_t *buf, uint32_t len, >> + odp_random_kind_t kind, uint32_t *seed); >> > > This is from rand_r() documentation: > " The value pointed to by the seedp argument of rand_r() provides only > a very small amount of state, so this function will be a weak pseudo- > random generator. Try drand48_r(3) instead."
>From the drand48_r documentation [1]: "These functions are GNU extensions and are not portable". So I don't think we should be using these. The whole point of odp_random_test_data() was to provide a simple repeatable random function for ODP testing, so I don't think we need to go beyond what the portable rand_r() provides. [1] http://man7.org/linux/man-pages/man3/drand48_r.3.html > > API should not limit the state size to be so small that e.g. > ODP_RANDOM_CRYPTO quality implementation is not possible. > > So, I think we are back in my previous proposal of implementation specific > state size. > > /** Random number generator state data */ > typedef struct odp_random_state_t { > // Implementation defined structure size > uint32_t random_state[32]; > } odp_random_state_t; > > /** > * Initialize random state data with a seed value > * > * Uses some bits of seed to initialize the state data > */ > void odp_random_state_init(odp_random_state_t *state, uint64_t seed); > > /** > * Generate repeatable random data for testing purposes > * > * For testing purposes it is often useful to generate "random" sequences that > * are repeatable. This is accomplished by supplying a seed value that is used > * for pseudo-random data generation. The caller-provided state data is > * updated for each call to continue the sequence. A series of calls with the > * same initial seeded state data will generate the same sequence of random > * test data. Use odp_random_state_init() to initialize or restart the state. > * The function is thread safe as long as multiple threads do not use the same > * state simultaneously. > * > * This function should be used only for testing purposes. Use > odp_random_data() > * for production. > */ > int32_t odp_random_test_data(uint8_t *buf, uint32_t len, odp_random_kind_t > kind, odp_random_state_t *state); > > > For example, these functions could be used with this spec: > > int random_r(struct random_data *buf, int32_t *result); > int srandom_r(unsigned int seed, struct random_data *buf); > int initstate_r(unsigned int seed, char *statebuf, > size_t statelen, struct random_data *buf); > int setstate_r(char *statebuf, struct random_data *buf); > > > Although, those seem to be nonstandard glibc extensions, so might not what to > use those in odp-linux, if strict posix API implementation is preferred. > > > -Petri > >