[libvirt] [PATCH v2] vz: implementation of attach/detach network devices

Dmitry Guryanov dguryanov at odin.com
Wed Jun 24 15:40:12 UTC 2015


On 06/22/2015 07:57 PM, Mikhail Feoktistov wrote:
> In this patch we add VIR_DOMAIN_DEVICE_NET handlers implementation
> for domainAttachDevice and domainDetachDevice callbacks.
>
> As soon as we don't support this operation for hypervisor type domains,
> we implement this functionality for containers only.
>
> In detach procedure we find network device by MAC address.
> Because PrlVmDevNet_GetMacAddress() returns MAC as a UTF-8 encoded
> null-terminated string, we use memcmp() to compare it.
> Also we remove corresponding virtual network by prlsdkDelNetAdapter call.

I've fixed small syntax lacks and pushed the patch.

> ---
>   src/vz/vz_driver.c |   16 +++++++
>   src/vz/vz_sdk.c    |  123 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>   src/vz/vz_sdk.h    |    4 ++
>   3 files changed, 143 insertions(+), 0 deletions(-)
>
> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
> index cef3c77..d9ddd4f 100644
> --- a/src/vz/vz_driver.c
> +++ b/src/vz/vz_driver.c
> @@ -1117,6 +1117,14 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>               goto cleanup;
>           }
>           break;
> +    case VIR_DOMAIN_DEVICE_NET:
> +        ret = prlsdkAttachNet(privdom, privconn, dev->data.net);
> +        if (ret) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("network attach failed"));
> +            goto cleanup;
> +        }
> +        break;
>       default:
>           virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
>                          _("device type '%s' cannot be attached"),
> @@ -1186,6 +1194,14 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
>               goto cleanup;
>           }
>           break;
> +    case VIR_DOMAIN_DEVICE_NET:
> +        ret = prlsdkDetachNet(privdom, privconn, dev->data.net);
> +        if (ret) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("network detach failed"));
> +            goto cleanup;
> +        }
> +        break;
>       default:
>           virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
>                          _("device type '%s' cannot be detached"),
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index 090a3ad..6e6d8c9 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -2914,6 +2914,129 @@ static void prlsdkDelNet(vzConnPtr privconn, virDomainNetDefPtr net)
>       PrlHandle_Free(vnet);
>   }
>   
> +int prlsdkAttachNet(virDomainObjPtr dom, parallelsConnPtr privconn, virDomainNetDefPtr net)
Too long line

> +{
> +    int ret = -1;
> +    parallelsDomObjPtr privdom = dom->privateData;
> +    PRL_HANDLE job = PRL_INVALID_HANDLE;
> +
> +    if (!IS_CT(dom->def)) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("network device cannot be attached"));
> +        return ret;
> +    }
> +
> +    job = PrlVm_BeginEdit(privdom->sdkdom);
> +    if (PRL_FAILED(waitJob(job)))
> +        return ret;
> +
> +    ret = prlsdkAddNet(privdom->sdkdom, privconn, net, IS_CT(dom->def));
> +    if (ret == 0) {
> +        job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
> +        if (PRL_FAILED(waitJob(job))) {
> +            return -1;
> +        }
Braces around single-statement block.

> +    }
> +
> +    return ret;
> +}
> +
> +static int
> +prlsdkGetNetIndex(PRL_HANDLE sdkdom, virDomainNetDefPtr net)
> +{
> +    int idx = -1;
> +    PRL_RESULT pret;
> +    PRL_UINT32 adaptersCount;
> +    PRL_UINT32 i;
> +    PRL_HANDLE adapter = PRL_INVALID_HANDLE;
> +    PRL_UINT32 len;
> +    char adapterMac[PRL_MAC_STRING_BUFNAME];
> +    char expectedMac[PRL_MAC_STRING_BUFNAME];
> +
> +    prlsdkFormatMac(&net->mac, expectedMac);
> +    pret = PrlVmCfg_GetNetAdaptersCount(sdkdom, &adaptersCount);
> +    prlsdkCheckRetGoto(pret, cleanup);
> +
> +    for (i = 0; i < adaptersCount; ++i) {
> +
> +        pret = PrlVmCfg_GetNetAdapter(sdkdom, i, &adapter);
> +        prlsdkCheckRetGoto(pret, cleanup);
> +
> +        len = sizeof(adapterMac);
> +        memset(adapterMac, 0, sizeof(adapterMac));
> +        pret = PrlVmDevNet_GetMacAddress(adapter, adapterMac, &len);
> +        prlsdkCheckRetGoto(pret, cleanup);
> +
> +        if (memcmp(adapterMac, expectedMac, PRL_MAC_STRING_BUFNAME)) {
> +
> +            PrlHandle_Free(adapter);
> +            adapter = PRL_INVALID_HANDLE;
> +            continue;
> +        }
> +
> +        idx = i;
> +        break;
> +    }
> +
> + cleanup:
> +    PrlHandle_Free(adapter);
> +    return idx;
> +}
> +
> +static int prlsdkDelNetAdapter(PRL_HANDLE sdkdom, int idx)
> +{
> +    int ret = -1;
> +    PRL_RESULT pret;
> +    PRL_HANDLE sdknet = PRL_INVALID_HANDLE;
> +
> +    pret = PrlVmCfg_GetNetAdapter(sdkdom, idx, &sdknet);
> +    prlsdkCheckRetGoto(pret, cleanup);
> +
> +    pret = PrlVmDev_Remove(sdknet);
> +    prlsdkCheckRetGoto(pret, cleanup);
> +
> +    ret = 0;
> +
> + cleanup:
> +    PrlHandle_Free(sdknet);
> +    return ret;
> +}
> +
> +int prlsdkDetachNet(virDomainObjPtr dom, parallelsConnPtr privconn, virDomainNetDefPtr net)

Too long line
> +{
> +    int ret = -1, idx = -1;
> +    parallelsDomObjPtr privdom = dom->privateData;
> +    PRL_HANDLE job = PRL_INVALID_HANDLE;
> +
> +    if (!IS_CT(dom->def)) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("network device cannot be detached"));
> +        return ret;
> +    }
> +
> +    job = PrlVm_BeginEdit(privdom->sdkdom);
> +    if (PRL_FAILED(waitJob(job)))
> +        return ret;
> +
> +    idx = prlsdkGetNetIndex(privdom->sdkdom, net);
> +    if (idx < 0)
> +        return ret;
> +
> +    ret = prlsdkDelNet(privconn, net);
> +    if (ret != 0)
> +        return ret;
> +
> +    ret = prlsdkDelNetAdapter(privdom->sdkdom, idx);
> +    if (ret == 0) {
> +        job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
> +        if (PRL_FAILED(waitJob(job))) {
> +            return -1;
> +        }
Braces around single-statement block, please, run make syntax-check 
before sending a patch.

> +    }
> +
> +    return ret;
> +}
> +
>   static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx)
>   {
>       int ret = -1;
> diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
> index dd4fecf..cde8904 100644
> --- a/src/vz/vz_sdk.h
> +++ b/src/vz/vz_sdk.h
> @@ -66,3 +66,7 @@ int
>   prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
>   int
>   prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats);
> +int
> +prlsdkAttachNet(virDomainObjPtr dom, parallelsConnPtr privconn, virDomainNetDefPtr net);
> +int
> +prlsdkDetachNet(virDomainObjPtr dom, parallelsConnPtr privconn, virDomainNetDefPtr net);


-- 
Dmitry Guryanov




More information about the libvir-list mailing list