[libvirt] [PATCH v6] npiv: Auto-generate WWN if it's not specified

Daniel P. Berrange berrange at redhat.com
Fri Feb 10 10:03:46 UTC 2012


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 :|




More information about the libvir-list mailing list