On Tue, Feb 07, 2012 at 09:38:50PM +0800, Osier Yang wrote: > The auto-generated WWN comply with the new addressing schema of WWN: > > <quote> > the first nibble is either hex 5 or 6 followed by a 3-byte vendor > identifier and 36 bits for a vendor-specified serial number. > </quote> > > We choose hex 5 for the first nibble. And for the 3-bytes vendor ID, > we uses the OUI according to underlying hypervisor type, (invoking > virConnectGetType to get the virt type). e.g. If virConnectGetType > returns "QEMU", we use Qumranet's OUI (00:1A:4A), if returns > ESX|VMWARE, we use VMWARE's OUI (00:05:69). Currently it only > supports qemu|xen|libxl|xenapi|hyperv|esx|vmware drivers. The last > 36 bits are auto-generated. > diff --git a/src/util/virrandom.c b/src/util/virrandom.c > index ec0cf03..760b975 100644 > --- a/src/util/virrandom.c > +++ b/src/util/virrandom.c > @@ -22,10 +22,20 @@ > #include <config.h> > > #include <stdlib.h> > +#include <inttypes.h> > > #include "virrandom.h" > #include "threads.h" > #include "count-one-bits.h" > +#include "util.h" > +#include "virterror_internal.h" > +#include "conf/domain_conf.h" > + > +#define VIR_FROM_THIS VIR_FROM_NONE > + > +#define virRandomError(code, ...) \ > + virReportErrorHelper(VIR_FROM_NONE, code, __FILE__, \ > + __FUNCTION__, __LINE__, __VA_ARGS__) > > static char randomState[128]; > static struct random_data randomData; > @@ -79,3 +89,46 @@ uint64_t virRandomBits(int nbits) > virMutexUnlock(&randomLock); > return ret; > } > + > +#define QUMRANET_OUI "001a4a" > +#define VMWARE_OUI "000569" > +#define MICROSOFT_OUI "0050f2" > +#define XEN_OUI "00163e" > + > +int > +virRandomGenerateWWN(char **wwn, > + const char *virt_type) { > + const char *oui = NULL; > + > + if (!virt_type) { > + virRandomError(VIR_ERR_INVALID_ARG, "%s", > + _("argument virt_type must not be NULL")); > + return -1; > + } > + > + if (STREQ(virt_type, "QEMU")) { > + oui = QUMRANET_OUI; > + } else if (STREQ(virt_type, "Xen") || > + STREQ(virt_type, "xenlight") || > + STREQ(virt_type, "XenAPI")) { > + oui = XEN_OUI; > + } else if (STREQ(virt_type, "ESX") || > + STREQ(virt_type, "VMWARE")) { > + oui = VMWARE_OUI; > + } else if (STREQ(virt_type, "HYPER-V")) { > + oui = MICROSOFT_OUI; > + } else { > + virRandomError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("Unsupported virt type")); > + return -1; > + } > + > + if (virAsprintf(wwn, "5" "%s%09" PRIx64, > + oui, virRandomBits(36)) < 0) { > + virReportOOMError(); > + return -1; > + } > + > + return 0; > +} This has broken the build on Mingw32, because PRIx64 is coming from the Win32 headers, but virAsprintf uses the gnulib printf. You need to use the normal "%09llu" format specific here, not the PRIx64 macro. We ought to have a syntax check test to forbid use of PRIx* stuff really. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list