# HG changeset patch
# User Dan Smith <danms(a)us.ibm.com>
# Date 1207776499 25200
# Node ID d297967bad1fb290230fa9f42dee9a4e5e68f7bb
# Parent ad9a40f4e04defe60897169cd7b93ef115bfcaf8
Make the 'default' NetRASD allocation include a randomly-generated MAC
Signed-off-by: Dan Smith <danms(a)us.ibm.com>
diff -r ad9a40f4e04d -r d297967bad1f src/Virt_SettingsDefineCapabilities.c
--- a/src/Virt_SettingsDefineCapabilities.c Wed Apr 09 14:28:18 2008 -0700
+++ b/src/Virt_SettingsDefineCapabilities.c Wed Apr 09 14:28:19 2008 -0700
@@ -25,6 +25,7 @@
#include <stdbool.h>
#include <sys/vfs.h>
#include <errno.h>
+#include <time.h>
#include <libvirt/libvirt.h>
@@ -52,6 +53,8 @@ const static CMPIBroker *_BROKER;
#define SDC_DISK_MIN 2000
#define SDC_DISK_DEF 5000
#define SDC_DISK_INC 250
+
+#define DEFAULT_MAC_PREFIX "00:16:3e"
static bool rasd_prop_copy_value(struct sdc_rasd_prop src,
struct sdc_rasd_prop *dest)
@@ -430,6 +433,45 @@ static struct sdc_rasd_prop *net_max(con
return rasd;
}
+static const char *_net_rand_mac(void)
+{
+ int r;
+ int ret;
+ unsigned int s;
+ char *mac = NULL;
+ CMPIString *str = NULL;
+ CMPIStatus status;
+
+ srand(time(NULL));
+ r = rand_r(&s);
+
+ ret = asprintf(&mac,
+ "%s:%02x:%02x:%02x",
+ DEFAULT_MAC_PREFIX,
+ r & 0xFF,
+ (r & 0xFF00) >> 8,
+ (r & 0xFF0000) >> 16);
+
+ if (ret == -1)
+ goto out;
+
+ str = CMNewString(_BROKER, mac, &status);
+ if ((str == NULL) || (status.rc != CMPI_RC_OK)) {
+ str = NULL;
+ CU_DEBUG("Failed to create string");
+ goto out;
+ }
+ out:
+ free(mac);
+
+ if (str != NULL)
+ mac = CMGetCharPtr(str);
+ else
+ mac = NULL;
+
+ return mac;
+}
+
static struct sdc_rasd_prop *net_def(const CMPIObjectPath *ref,
CMPIStatus *s)
{
@@ -440,6 +482,7 @@ static struct sdc_rasd_prop *net_def(con
struct sdc_rasd_prop tmp[] = {
{"InstanceID", (CMPIValue *)"Default", CMPI_chars},
{"VirtualQuantity", (CMPIValue *)&num_nics, CMPI_uint16},
+ {"Address", (CMPIValue *)_net_rand_mac(), CMPI_chars},
PROP_END
};