[libvirt] [PATCH 1/8] parallels: parse information about network interfaces
Daniel Veillard
veillard at redhat.com
Tue Dec 11 14:16:46 UTC 2012
On Tue, Dec 11, 2012 at 02:59:42PM +0400, Dmitry Guryanov wrote:
> Parse network interfaces info from prlctl output.
>
> Parallels Cloud Server uses virtual networks model for
> network configuration: You can add network adapter to
> VM and connect it to some predefined virtual network.
>
> Fill type, mac, network name and linkstate fields of
> virDomainNetDef structure.
>
> Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
> ---
> src/parallels/parallels_driver.c | 111 ++++++++++++++++++++++++++++++++++++++
> 1 files changed, 111 insertions(+), 0 deletions(-)
>
> diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
> index 118dc13..755816e 100644
> --- a/src/parallels/parallels_driver.c
> +++ b/src/parallels/parallels_driver.c
> @@ -50,6 +50,7 @@
> #include "configmake.h"
> #include "storage_file.h"
> #include "nodeinfo.h"
> +#include "c-ctype.h"
>
> #include "parallels_driver.h"
> #include "parallels_utils.h"
> @@ -426,6 +427,113 @@ error:
> return -1;
> }
>
> +static inline unsigned char hex2int(char c)
> +{
> + if (c <= '9')
> + return c - '0';
> + else
> + return 10 + c - 'A';
> +}
> +
> +/*
> + * Parse MAC address in format XXXXXXXXXXXX.
> + */
> +static int
> +parallelsMacAddrParse(const char *str, virMacAddrPtr addr)
> +{
> + int i;
> +
> + if (strlen(str) != 12)
> + goto error;
> +
> + for (i = 0; i < 6; i++) {
> + if (!c_isxdigit(str[2 * i]) || !c_isxdigit(str[2 * i + 1]))
> + goto error;
> +
> + addr->addr[i] = (hex2int(str[2 * i]) << 4) + hex2int(str[2 * i + 1]);
> + }
> +
> + return 0;
> +error:
> + virReportError(VIR_ERR_INVALID_ARG,
> + _("Invalid MAC address format '%s'"), str);
> + return -1;
> +}
> +
> +static int
> +parallelsGetNetInfo(virDomainNetDefPtr net,
> + const char *key,
> + virJSONValuePtr value)
> +{
> + const char *tmp;
> +
> + /* use device name, shown by prlctl as target device
> + * for identifying network adapter in virDomainDefineXML */
> + if (!(net->ifname = strdup(key))) {
> + virReportOOMError();
> + goto error;
> + }
> +
> + net->type = VIR_DOMAIN_NET_TYPE_NETWORK;
> +
> + if (!(tmp = virJSONValueObjectGetString(value, "mac"))) {
> + parallelsParseError();
> + return -1;
> + }
> +
> + if (parallelsMacAddrParse(tmp, &net->mac) < 0) {
> + parallelsParseError();
> + goto error;
> + }
> +
> + if (!(tmp = virJSONValueObjectGetString(value, "network"))) {
> + parallelsParseError();
> + goto error;
> + }
> +
> + if (!(net->data.network.name = strdup(tmp))) {
> + virReportOOMError();
> + goto error;
> + }
> +
> + net->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_UP;
> + if (virJSONValueObjectHasKey(value, "state")) {
> + tmp = virJSONValueObjectGetString(value, "state");
> + if STREQ(tmp, "disconnected")
> + net->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN;
> + }
> +
> + return 0;
> +
> +error:
> + return -1;
> +}
> +
> +static int
> +parallelsAddNetInfo(virDomainDefPtr def, const char *key, virJSONValuePtr value)
> +{
> + virDomainNetDefPtr net = NULL;
> +
> + if (VIR_ALLOC(net) < 0)
> + goto no_memory;
> +
> + if (parallelsGetNetInfo(net, key, value))
> + goto error;
> +
> + if (VIR_EXPAND_N(def->nets, def->nnets, 1) < 0)
> + goto no_memory;
> +
> + def->nets[def->nnets - 1] = net;
> +
> + return 0;
> +
> +no_memory:
> + virReportOOMError();
> +error:
> + virDomainNetDefFree(net);
> + return -1;
> +}
> +
> static int
> parallelsAddDomainHardware(virDomainDefPtr def, virJSONValuePtr jobj)
> {
> @@ -457,6 +565,9 @@ parallelsAddDomainHardware(virDomainDefPtr def, virJSONValuePtr jobj)
> } else if (STRPREFIX(key, "hdd")) {
> if (parallelsAddHddInfo(def, key, value))
> goto cleanup;
> + } else if (STRPREFIX(key, "net")) {
> + if (parallelsAddNetInfo(def, key, value))
> + goto cleanup;
> }
> }
>
Looks fine, ACK, but I would double check for existing hex parsing
we already have parsing of arbitrary number in a user specified base
in utils/utils.h so it is likely the parsing code could be cleaned up
or even better with some of the routine from src/util/virmacaddr.h
but that cleanup can be deferred,
Daniel
--
Daniel Veillard | Open Source and Standards, Red Hat
veillard at redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list