From cca49ac01f1a5a6bdc67ec55d8d3d83bd16d818d Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Fri, 8 Mar 2013 14:39:40 -0500 Subject: [PATCH] When (re)starting a couple of virtual machines (about 10) on the same host it frequently happens that some of them use the same DHCP transaction ID. This problem can be solved by combining the current timer ticks and the least significant bits of the hardware address(es) to get a better randomness for the seed. Signed-off-by: Bernhard Kohl --- src/core/device.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/core/device.c b/src/core/device.c index dc182e03..864f9fe2 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -19,11 +19,15 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include +#include +#include #include #include #include #include #include +#include +#include /** * @file @@ -77,6 +81,9 @@ static void rootdev_remove ( struct root_device *rootdev ) { static void probe_devices ( void ) { struct root_device *rootdev; int rc; + struct net_device *netdev; + unsigned int seed; + unsigned int ll_addr; for_each_table_entry ( rootdev, ROOT_DEVICES ) { list_add ( &rootdev->dev.siblings, &devices ); @@ -84,6 +91,20 @@ static void probe_devices ( void ) { if ( ( rc = rootdev_probe ( rootdev ) ) != 0 ) list_del ( &rootdev->dev.siblings ); } + + /* Seed the pseudo-random number generator. Combine the current + * timer ticks and the least significant bits of the hardware + * address(es) to get a high degree of randomness for the seed. + */ + seed = (unsigned int)currticks(); + for_each_netdev ( netdev ) { + memcpy ( &ll_addr, ( netdev->ll_addr + netdev->ll_protocol->ll_addr_len + - sizeof ( ll_addr ) ), sizeof ( ll_addr ) ); + ll_addr = ntohl ( ll_addr ); + seed <<= 1; + seed ^= ll_addr; + } + srand ( seed ); } /**