[PATCH] Make the 'default' NetRASD allocation include a randomly-generated MAC

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

Dan Smith wrote:
# HG changeset patch # User Dan Smith <danms@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.
This tested out fine for me. +1 -- Kaitlin Rupert IBM Linux Technology Center kaitlin@linux.vnet.ibm.com
participants (2)
-
Dan Smith
-
Kaitlin Rupert