From b86396dc545b88d9b091b24da5e1250df3564c6b Mon Sep 17 00:00:00 2001 From: Nikolay Shirokovskiy Date: Wed, 20 Apr 2016 17:05:36 +0300 Subject: [PATCH] vz: dump ip addresses to domain xml Signed-off-by: Nikolay Shirokovskiy --- src/libvirt_private.syms | 1 + src/vz/vz_sdk.c | 88 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9ac033d3ab..2c17f4e8b7 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2257,6 +2257,7 @@ virSocketAddrEqual; virSocketAddrFormat; virSocketAddrFormatFull; virSocketAddrGetIpPrefix; +virSocketAddrGetNumNetmaskBits; virSocketAddrGetPort; virSocketAddrGetRange; virSocketAddrIsNetmask; diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index d4c78738b2..d8af64b56a 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -747,6 +747,91 @@ prlsdkAddDomainOpticalDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomain return -1; } +static virDomainNetIpDefPtr +prlsdkParseNetAddress(char *addr) +{ + char *maskstr = NULL; + int nbits; + virSocketAddr mask; + virDomainNetIpDefPtr ip = NULL, ret = NULL; + + if (!(maskstr = strchr(addr, '/'))) + goto cleanup; + + *maskstr = '\0'; + ++maskstr; + + if (VIR_ALLOC(ip) < 0) + goto cleanup; + + if (virSocketAddrParse(&ip->address, addr, AF_UNSPEC) < 0) + goto cleanup; + + if (virSocketAddrParse(&mask, maskstr, AF_UNSPEC) < 0) + goto cleanup; + + if ((nbits = virSocketAddrGetNumNetmaskBits(&mask)) < 0) + goto cleanup; + ip->prefix = nbits; + + ret = ip; + ip = NULL; + + cleanup: + if (!ret) + VIR_WARN("cannot parse network address '%s'", addr); + + VIR_FREE(ip); + VIR_FREE(addr); + + return ret; +} + +static int +prlsdkGetNetAddresses(PRL_HANDLE sdknet, virDomainNetDefPtr net) +{ + int ret = -1; + PRL_HANDLE addrlist = PRL_INVALID_HANDLE; + PRL_UINT32 num; + size_t i; + PRL_RESULT pret; + + pret = PrlVmDevNet_GetNetAddresses(sdknet, &addrlist); + prlsdkCheckRetGoto(pret, cleanup); + + PrlStrList_GetItemsCount(addrlist, &num); + prlsdkCheckRetGoto(pret, cleanup); + + for (i = 0; i < num; ++i) { + virDomainNetIpDefPtr ip = NULL; + PRL_UINT32 buflen = 0; + char *addr; + + pret = PrlStrList_GetItem(addrlist, i, NULL, &buflen); + prlsdkCheckRetGoto(pret, cleanup); + + if (VIR_ALLOC_N(addr, buflen) < 0) + goto cleanup; + + pret = PrlStrList_GetItem(addrlist, i, addr, &buflen); + prlsdkCheckRetGoto(pret, cleanup); + + if (!(ip = prlsdkParseNetAddress(addr))) + continue; + + if (VIR_APPEND_ELEMENT(net->ips, net->nips, ip) < 0) { + VIR_FREE(ip); + goto cleanup; + } + } + + ret = 0; + cleanup: + + PrlHandle_Free(addrlist); + return ret; +} + static int prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) { @@ -786,6 +871,9 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) if (virMacAddrParse(macstr, &net->mac) < 0) goto cleanup; + if (prlsdkGetNetAddresses(netAdapter, net) < 0) + goto cleanup; + pret = PrlVmDev_GetEmulatedType(netAdapter, &emulatedType); prlsdkCheckRetGoto(pret, cleanup);