2
0
mirror of https://github.com/xcat2/xNBA.git synced 2024-11-25 11:00:15 +00:00

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 <bernhard.kohl@nsn.com>
This commit is contained in:
Jarrod Johnson 2013-03-08 14:39:40 -05:00
parent 26af634b81
commit cca49ac01f

View File

@ -19,11 +19,15 @@
FILE_LICENCE ( GPL2_OR_LATER );
#include <string.h>
#include <stdlib.h>
#include <byteswap.h>
#include <ipxe/list.h>
#include <ipxe/tables.h>
#include <ipxe/init.h>
#include <ipxe/interface.h>
#include <ipxe/device.h>
#include <ipxe/netdevice.h>
#include <ipxe/timer.h>
/**
* @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 );
}
/**