# HG changeset patch
# User Dan Smith <danms(a)us.ibm.com>
# Date 1209579877 25200
# Node ID ffa1024f9012873e29c732a9b355199bd61d0440
# Parent ffd90f0ed0e8e06c51db09befd3a09c956b00444
Generate a random MAC for NetRASD instances in VSMS if not specified
This is a direct import of the MAC generation function previously in
SettingsDefineCapabilities.
Signed-off-by: Dan Smith <danms(a)us.ibm.com>
diff -r ffd90f0ed0e8 -r ffa1024f9012 src/Virt_VirtualSystemManagementService.c
--- a/src/Virt_VirtualSystemManagementService.c Wed Apr 30 11:11:50 2008 -0700
+++ b/src/Virt_VirtualSystemManagementService.c Wed Apr 30 11:24:37 2008 -0700
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include <stdbool.h>
#include <inttypes.h>
+#include <time.h>
#include <libvirt/libvirt.h>
#include "cmpidt.h"
@@ -51,6 +52,8 @@
#include "svpc_types.h"
#include "config.h"
+
+#define DEFAULT_MAC_PREFIX "00:16:3e"
const static CMPIBroker *_BROKER;
@@ -311,6 +314,45 @@ static const char *kvm_net_rasd_to_vdev(
return NULL;
}
+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 const char *net_rasd_to_vdev(CMPIInstance *inst,
struct virt_device *dev)
{
@@ -319,8 +361,11 @@ static const char *net_rasd_to_vdev(CMPI
const char *msg = NULL;
if (cu_get_str_prop(inst, "Address", &val) != CMPI_RC_OK) {
- msg = "Required field `Address' missing from NetRASD";
- goto out;
+ val = _net_rand_mac();
+ if (val == NULL) {
+ msg = "Unable to generate a MAC address";
+ goto out;
+ }
}
free(dev->dev.net.mac);