Hi Josh, On 09/16/2015 05:18 AM, Josh Wu wrote: > As 'time(0) | getpid()' sometimes get same value. That depends on the > value of getpid(). > So that is not a expected behavior. We expect different value for the > seed when when run it in many times.
I don't think your change made it better. Here is a snippet from a run of time(NULL) and getpid(): ---8<--- time: 1442389450; pid: 11632; time | pid: 1442397690; time: 1442389450; pid: 11633; time | pid: 1442397691; time: 1442389450; pid: 11634; time | pid: 1442397690; time: 1442389450; pid: 11635; time | pid: 1442397691; time: 1442389450; pid: 11636; time | pid: 1442397694; time: 1442389450; pid: 11637; time | pid: 1442397695; time: 1442389450; pid: 11638; time | pid: 1442397694; time: 1442389450; pid: 11639; time | pid: 1442397695; time: 1442389450; pid: 11640; time | pid: 1442397690; time: 1442389450; pid: 11641; time | pid: 1442397691; time: 1442389450; pid: 11642; time | pid: 1442397690; time: 1442389450; pid: 11643; time | pid: 1442397691; --->8--- While time(NULL) is stable, getpid() is incrementing by one. As you may expect the OR'ed value is oscillating and the values almost the same. So calling gen_eth_addr three times within the same second you will get two time the same MAC. > So this patch remove the getpid(), just use the time(0) as the seed. So let's see the effect of your change ... The output of gen_eth_addr at the current ToT: % RUN=0; while [ $RUN -lt 10000 ]; do /tmp/build-uboot-test/tools/gen_eth_addr; RUN=$(($RUN+1)); done | sort | uniq | wc -l 254 With your change applied: % RUN=0; while [ $RUN -lt 10000 ]; do /tmp/build-uboot-test/tools/gen_eth_addr; RUN=$(($RUN+1)); done | sort | uniq | wc -l 10 Another approach would be to change the algorithm (OR the values) here. A short test showed that using XOR could be a solution: ---8<--- time: 1442389450; pid: 11632; time ^ pid: 1442394298; time: 1442389450; pid: 11633; time ^ pid: 1442394299; time: 1442389450; pid: 11634; time ^ pid: 1442394296; time: 1442389450; pid: 11635; time ^ pid: 1442394297; time: 1442389450; pid: 11636; time ^ pid: 1442394302; time: 1442389450; pid: 11637; time ^ pid: 1442394303; time: 1442389450; pid: 11638; time ^ pid: 1442394300; time: 1442389450; pid: 11639; time ^ pid: 1442394301; time: 1442389450; pid: 11640; time ^ pid: 1442394290; time: 1442389450; pid: 11641; time ^ pid: 1442394291; time: 1442389450; pid: 11642; time ^ pid: 1442394288; time: 1442389450; pid: 11643; time ^ pid: 1442394289; --->8--- It is the same input but none of the outputs is the same value. The XOR approach applied to gen_eth_addr: % RUN=0; while [ $RUN -lt 10000 ]; do /tmp/build-uboot-test/tools/gen_eth_addr; RUN=$(($RUN+1)); done | sort | uniq | wc -l 9988 Andreas > Signed-off-by: Josh Wu <josh...@atmel.com> > --- > > tools/gen_eth_addr.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tools/gen_eth_addr.c b/tools/gen_eth_addr.c > index bf9d935..53b023a 100644 > --- a/tools/gen_eth_addr.c > +++ b/tools/gen_eth_addr.c > @@ -15,7 +15,7 @@ main(int argc, char *argv[]) > { > unsigned long ethaddr_low, ethaddr_high; > > - srand(time(0) | getpid()); > + srand(time(0)); > > /* > * setting the 2nd LSB in the most significant byte of > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot