[Libvirt-cim] [PATCH 2 of 2] Generate a random MAC for NetRASD instances in VSMS if not specified

Dan Smith danms at us.ibm.com
Wed Apr 30 18:24:46 UTC 2008


# HG changeset patch
# User Dan Smith <danms at 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 at 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);




More information about the Libvirt-cim mailing list