Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Daniel Krebs
>> In contrast to the current procedure of having a global state, we rather
>> should opt to allow local states for each thread (not excluding a global
>> state).
> 
> Is testing and simulation the only use case you can imagine? I'm somewhat
> reluctant to add code just for non-production purposes.

Deterministic PRNGs can also be used for the implementation of certain
MAC protocols for instance in channel assignment (e.g. frequency hopping
schedule, time slot assignment).


Cheers,
Daniel
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Mathias Tausig
On Mit, 2017-03-08 at 09:09 +0100, Kaspar Schleiser wrote:
> Hey,
> 
> On 03/08/2017 12:18 AM, Cenk Gündoğan wrote:
> > 
> > we rather
> > should opt to allow local states for each thread (not excluding a global
> > state).
> Interesting. Up to now our trouble with RNGs was mostly on how to make
> them more random. Now we're trying to make them predictable. What's your
> use case for that?

Using the random numbers for a stream cipher, for instance.

> How about an interface a la
> 
> rand_init_(rnd__t *rnd);
> rand_seed32(rnd_t *rnd, uint32_t);
> rand_seed(rnd_t *rnd, const uint8_t *in, size_t len);
> rand_get(rnd_t *rnd, uint8_t *out, size_t n);
> rand_get32(rnd_t *rnd);
> 
> typedef struct {
>   
> } rnd_t;
> 
> typedef struct {
>   rnd_t rnd;
>   ;
> } rnd_tinymt32_t;
> 
> That way we'd have:
> 
> - user controlled state
> - the ability to overload (e.g., combine hwrng, collected entropy, prng
> but with the same interface)
> 

Look good, imo.

cheers
Mathias



___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Thomas C. Schmidt

Hi Oleg, Ludwig,

On 08.03.2017 10:30, Oleg Hahm wrote:

Hi Ludwig!

On Wed, Mar 08, 2017 at 10:28:13AM +0100, Ludwig Knüpfer wrote:

Am 8. März 2017 10:21:15 MEZ schrieb Oleg Hahm :

Is testing and simulation the only use case you can imagine? I'm somewhat
reluctant to add code just for non-production purposes.


Since we outspokenly target researchers with RIOT this is a production feature.

However we might want to move this feature into a dedicated implementation
of the same interface.


Thanks, that was more or less what I meant.


I'm not sure whether we 'over-complicate' the issue.

There are good PRNGs with state space of one (or very few) int, call it 
seed. So if this function is called as 'rand(seed)', rand can be 
stateless ... and seed is allocated memory of the application. Seeds 
could be initially generated by 'random_init(seed)'.


At the same time, one can overload with a stateful 'rand()' which is 
auto-initialized and convenient ... and for those who don't care for 
more control. IMO, this would not need a 'random_init()' user call.


Cheers,
 Thomas


Btw: David Jones (UCL Bioinformatics) writes "Rule #1: Do not use system 
generators. ... Almost all of these generators are badly flawed. Even 
when they are not, there is no guarantee that they were not flawed in 
earlier releases of the library."



--

Prof. Dr. Thomas C. Schmidt
° Hamburg University of Applied Sciences   Berliner Tor 7 °
° Dept. Informatik, Internet Technologies Group20099 Hamburg, Germany °
° http://www.haw-hamburg.de/inet   Fon: +49-40-42875-8452 °
° http://www.informatik.haw-hamburg.de/~schmidtFax: +49-40-42875-8409 °
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Oleg Hahm
Hi Ludwig!

On Wed, Mar 08, 2017 at 10:28:13AM +0100, Ludwig Knüpfer wrote:
> Am 8. März 2017 10:21:15 MEZ schrieb Oleg Hahm :
> >Is testing and simulation the only use case you can imagine? I'm somewhat
> >reluctant to add code just for non-production purposes.
> 
> Since we outspokenly target researchers with RIOT this is a production 
> feature.
> 
> However we might want to move this feature into a dedicated implementation
> of the same interface.

Thanks, that was more or less what I meant.

Cheers,
Oleg
-- 
The problem with TCPIP jokes is that when I tell them, all I want is an ACK but
usually get FINs and RSTs


signature.asc
Description: PGP signature
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Ludwig Knüpfer
Hi,

Am 8. März 2017 10:21:15 MEZ schrieb Oleg Hahm :
>Is testing and simulation the only use case you can imagine? I'm
>somewhat
>reluctant to add code just for non-production purposes.

Since we outspokenly target researchers with RIOT this is a production feature.

However we might want to move this feature into a dedicated implementation of 
the same interface.

Cheers,
Ludwig
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Ludwig Knüpfer
Hi,

Am 8. März 2017 10:06:17 MEZ schrieb "Cenk Gündoğan" :
>On 17-03-08 09:09:34, Kaspar Schleiser wrote: 
>> That way we'd have:
>> 
>> - user controlled state
>> - the ability to overload (e.g., combine hwrng, collected entropy,
>prng
>> but with the same interface)
>
>Looks good at first sight. We also would need some sort of
>synchronization for concurrent access, e.g. a mutex in the `rnd_t`
>struct, if two threads should use the same local state.

Just as a remark (might make sense to copy and paste to upcoming documentation):
If two threads are using the same local state they will probably not get 
deterministic numbers.

Cheers,
Ludwig
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Oleg Hahm
Dear Cenk,

thanks for bringing up this discussion.

On Wed, Mar 08, 2017 at 12:18:28AM +0100, Cenk Gündoğan wrote:
 
> 1) we can define it as BCP to *not* use `random_init()` if `auto_init`
>is used
>=> it's hard to guarantee a one-time call to `random_init()` as human
>do surely err (especially if several nested modules are involved).

Basically, we have similar problems for other modules that should (or even
must) not be initialized twice. So far, my/our take on this was to document
this rather than programmatically prevent this. The memory overhead is small,
but existent, the runtime overhead is probably negligible for a function that
should not be called more than once.

> In contrast to the current procedure of having a global state, we rather
> should opt to allow local states for each thread (not excluding a global
> state).

Is testing and simulation the only use case you can imagine? I'm somewhat
reluctant to add code just for non-production purposes.

Cheers,
Oleg
-- 
/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
 *
 * Wirzenius wrote this portably, Torvalds fucked it up :-)
 */
linux-2.2.16/lib/vsprintf.c


signature.asc
Description: PGP signature
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Kaspar Schleiser
Hey,

On 03/08/2017 10:06 AM, Cenk Gündoğan wrote:
> 
>> How about an interface a la
>>
> Looks good at first sight. We also would need some sort of
> synchronization for concurrent access, e.g. a mutex in the `rnd_t`
> struct, if two threads should use the same local state.

Do we need that kind of synchronization if all state is localized in the
overloaded rnd_t, at that level?

Applications *seeding* the same state in multiple threads will be rare
and can synchronize externally.

Whether "reading" from the rng needs to be synchronized should be up to
the RNG implementation.

Kaspar



signature.asc
Description: OpenPGP digital signature
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Cenk Gündoğan
Heyho,

On 17-03-08 09:09:34, Kaspar Schleiser wrote:
> Hey,
> 
> On 03/08/2017 12:18 AM, Cenk Gündoğan wrote:
> > we rather
> > should opt to allow local states for each thread (not excluding a global
> > state).
> 
> Interesting. Up to now our trouble with RNGs was mostly on how to make
> them more random. Now we're trying to make them predictable. What's your
> use case for that?
> 

Well .. PRNGs are predictable with enough knowledge (algorithm used +
seed) and an enthusiastic observer (or someone who reached divine
omniscience) can even derive numbers by looking at the sequence across
several runs and constant seeds. The trouble, IMO, is seeding those
PRNGS randomly, but that's not what I wanted to focus on in this mail.
Sorry, if I gave this kind of impression.

My point is: a user application may need a specific seed to have a
deterministic sequence (especially interesting for simulation/testing).
And such determinism is removed from the application's POV, if NDP, RPL,
or TCP are also advancing the pointer in the sequence.

> How about an interface a la
> 
> rand_init_(rnd__t *rnd);
> rand_seed32(rnd_t *rnd, uint32_t);
> rand_seed(rnd_t *rnd, const uint8_t *in, size_t len);
> rand_get(rnd_t *rnd, uint8_t *out, size_t n);
> rand_get32(rnd_t *rnd);
> 
> typedef struct {
>   
> } rnd_t;
> 
> typedef struct {
>   rnd_t rnd;
>   ;
> } rnd_tinymt32_t;
> 
> That way we'd have:
> 
> - user controlled state
> - the ability to overload (e.g., combine hwrng, collected entropy, prng
> but with the same interface)

Looks good at first sight. We also would need some sort of
synchronization for concurrent access, e.g. a mutex in the `rnd_t`
struct, if two threads should use the same local state.

Cheerio!
Cenk

> 
> Kaspar
> 




> ___
> devel mailing list
> devel@riot-os.org
> https://lists.riot-os.org/mailman/listinfo/devel



signature.asc
Description: PGP signature
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel


Re: [riot-devel] To global seed or not to global seed

2017-03-08 Thread Kaspar Schleiser
Hey,

On 03/08/2017 12:18 AM, Cenk Gündoğan wrote:
> we rather
> should opt to allow local states for each thread (not excluding a global
> state).

Interesting. Up to now our trouble with RNGs was mostly on how to make
them more random. Now we're trying to make them predictable. What's your
use case for that?

How about an interface a la

rand_init_(rnd__t *rnd);
rand_seed32(rnd_t *rnd, uint32_t);
rand_seed(rnd_t *rnd, const uint8_t *in, size_t len);
rand_get(rnd_t *rnd, uint8_t *out, size_t n);
rand_get32(rnd_t *rnd);

typedef struct {

} rnd_t;

typedef struct {
rnd_t rnd;
;
} rnd_tinymt32_t;

That way we'd have:

- user controlled state
- the ability to overload (e.g., combine hwrng, collected entropy, prng
but with the same interface)

Kaspar



signature.asc
Description: OpenPGP digital signature
___
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel