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