Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jarrod Johnson committed Mar 8, 2013
1 parent 26af634 commit cca49ac
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/core/device.c
Expand Up @@ -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
Expand Down Expand Up @@ -77,13 +81,30 @@ 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 );
INIT_LIST_HEAD ( &rootdev->dev.children );
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 );
}

/**
Expand Down

0 comments on commit cca49ac

Please sign in to comment.