# HG changeset patch
# User Dan Smith <danms(a)us.ibm.com>
# Date 1208203862 25200
# Node ID b8c657f804fda928ea45798f5c1f0ff9f0234889
# Parent d00685b6206aaf99f37527442886c878e1010362
Make the 'default' NetRASD allocation include a randomly-generated MAC
No changes from last time, except I think this can be put in by itself,
to reduce the size of my queue for the VSMS stuff.
Signed-off-by: Dan Smith <danms(a)us.ibm.com>
diff -r d00685b6206a -r b8c657f804fd src/Virt_SettingsDefineCapabilities.c
--- a/src/Virt_SettingsDefineCapabilities.c Mon Apr 14 10:57:32 2008 -0700
+++ b/src/Virt_SettingsDefineCapabilities.c Mon Apr 14 13:11:02 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,26 +433,73 @@ 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)
{
bool ret;
uint16_t num_nics = 1;
struct sdc_rasd_prop *rasd = NULL;
-
+ const char *mac = _net_rand_mac();
struct sdc_rasd_prop tmp[] = {
{"InstanceID", (CMPIValue *)"Default", CMPI_chars},
{"VirtualQuantity", (CMPIValue *)&num_nics, CMPI_uint16},
- PROP_END
- };
-
- ret = dup_rasd_prop_list(tmp, &rasd);
- if (!ret) {
- cu_statusf(_BROKER, s,
- CMPI_RC_ERR_FAILED,
- "Could not copy RASD");
- }
-
+ {"Address", (CMPIValue *)mac, CMPI_chars},
+ PROP_END
+ };
+
+ if (mac == NULL) {
+ cu_statusf(_BROKER, s,
+ CMPI_RC_ERR_FAILED,
+ "Failed to generate new MAC address");
+ goto out;
+ }
+
+ ret = dup_rasd_prop_list(tmp, &rasd);
+ if (!ret) {
+ cu_statusf(_BROKER, s,
+ CMPI_RC_ERR_FAILED,
+ "Could not copy RASD");
+ }
+ out:
return rasd;
}