[libvirt] [PATCH 15/16] hyperv: network list functions

John Ferlan jferlan at redhat.com
Thu Sep 15 20:25:16 UTC 2016



On 08/09/2016 08:39 AM, Jason Miesionczek wrote:
> ---
>  src/hyperv/hyperv_network_driver.c | 156 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 156 insertions(+)
> 
> diff --git a/src/hyperv/hyperv_network_driver.c b/src/hyperv/hyperv_network_driver.c
> index 00037ae..68f03e5 100644
> --- a/src/hyperv/hyperv_network_driver.c
> +++ b/src/hyperv/hyperv_network_driver.c
> @@ -115,10 +115,166 @@ hypervNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags)
>      return xml;
>  }
>  
> +static int
> +hypervConnectNumOfNetworks(virConnectPtr conn)
> +{
> +    int result = -1, count = 0;
> +    hypervPrivate *priv = conn->privateData;
> +    virBuffer query = VIR_BUFFER_INITIALIZER;
> +    Msvm_VirtualSwitch *virtualSwitchList = NULL;
> +    Msvm_VirtualSwitch *virtualSwitch = NULL;
> +
> +    virBufferAddLit(&query, MSVM_VIRTUALSWITCH_WQL_SELECT);
> +    virBufferAsprintf(&query, "where HealthState = %d", 5);

5 is a magic number

> +    if (hypervGetMsvmVirtualSwitchList(priv, &query, &virtualSwitchList) < 0) {
> +        goto cleanup;
> +    }
> +
> +    for (virtualSwitch = virtualSwitchList; virtualSwitch != NULL;
> +         virtualSwitch = virtualSwitch->next) {
> +        count++;
> +    }
> +
> +    result = count;
> +
> + cleanup:
> +    hypervFreeObject(priv, (hypervObject *) virtualSwitchList);
> +    virBufferFreeAndReset(&query);
> +
> +    return result;
> +}
> +
> +
> +
> +static int
> +hypervConnectListNetworks(virConnectPtr conn, char **const names, int maxnames)
> +{
> +    int i, count = 0;
> +    bool success = false;
> +    hypervPrivate *priv = conn->privateData;
> +    virBuffer query = VIR_BUFFER_INITIALIZER;
> +    Msvm_VirtualSwitch *virtualSwitchList = NULL;
> +    Msvm_VirtualSwitch *virtualSwitch = NULL;
> +
> +    if (maxnames <= 0)
> +        return 0;
> +
> +    virBufferAddLit(&query, MSVM_VIRTUALSWITCH_WQL_SELECT);
> +    virBufferAsprintf(&query, "where HealthState = %d", 5);
> +    if (hypervGetMsvmVirtualSwitchList(priv, &query, &virtualSwitchList) < 0) {
> +        goto cleanup;
> +    }

Hmmm this looks familiar - consider a helper instead of cut-copy-paste

> +
> +    for (virtualSwitch = virtualSwitchList; virtualSwitch != NULL;
> +         virtualSwitch = virtualSwitch->next) {
> +        if (VIR_STRDUP(names[count], virtualSwitch->data->ElementName) < 0) {
> +            goto cleanup;
> +        }
> +        count++;
> +        if (count >= maxnames) {

Well I hope count is never > maxnames!

> +            break;
> +        }
> +    }
> +
> +    success = true;
> +
> + cleanup:
> +    if (!success) {
> +        for (i = 0; i < count; ++i) {
> +            VIR_FREE(names[i]);
> +        }
> +        count = -1;
> +    }
> +
> +    hypervFreeObject(priv, (hypervObject *) virtualSwitchList);
> +    virBufferFreeAndReset(&query);
> +
> +    return count;
> +}
>  

The hunks above and below could be separate patches, although I do see
some sense in combining them.

> +static int
> +hypervConnectNumOfDefinedNetworks(virConnectPtr conn)
> +{
> +    int result = -1, count = 0;
> +    hypervPrivate *priv = conn->privateData;
> +    virBuffer query = VIR_BUFFER_INITIALIZER;
> +    Msvm_VirtualSwitch *virtualSwitchList = NULL;
> +    Msvm_VirtualSwitch *virtualSwitch = NULL;
> +
> +    virBufferAddLit(&query, MSVM_VIRTUALSWITCH_WQL_SELECT);
> +    virBufferAsprintf(&query, "where HealthState <> %d", 5);

So defined networks don't include ones with the magic #5

I would think a "defined"
> +    if (hypervGetMsvmVirtualSwitchList(priv, &query, &virtualSwitchList) < 0) {
> +        goto cleanup;
> +    }
> +
> +    for (virtualSwitch = virtualSwitchList; virtualSwitch != NULL;
> +         virtualSwitch = virtualSwitch->next) {
> +        count++;
> +    }
> +
> +    result = count;
> +
> + cleanup:
> +    hypervFreeObject(priv, (hypervObject *) virtualSwitchList);
> +    virBufferFreeAndReset(&query);
> +
> +    return result;
> +}
> +
> +
> +
> +static int
> +hypervConnectListDefinedNetworks(virConnectPtr conn, char **const names, int maxnames)
> +{
> +    int i, count = 0;
> +    bool success = false;
> +    hypervPrivate *priv = conn->privateData;
> +    virBuffer query = VIR_BUFFER_INITIALIZER;
> +    Msvm_VirtualSwitch *virtualSwitchList = NULL;
> +    Msvm_VirtualSwitch *virtualSwitch = NULL;
> +
> +    if (maxnames <= 0)
> +        return 0;
> +
> +    virBufferAddLit(&query, MSVM_VIRTUALSWITCH_WQL_SELECT);
> +    virBufferAsprintf(&query, "where HealthState <> %d", 5);
> +    if (hypervGetMsvmVirtualSwitchList(priv, &query, &virtualSwitchList) < 0) {
> +        goto cleanup;
> +    }

Common code.

> +
> +    for (virtualSwitch = virtualSwitchList; virtualSwitch != NULL;
> +         virtualSwitch = virtualSwitch->next) {
> +        if (VIR_STRDUP(names[count], virtualSwitch->data->ElementName) < 0) {
> +            goto cleanup;
> +        }
> +        count++;
> +        if (count >= maxnames) {
> +            break;
> +        }
> +    }
> +
> +    success = true;
> +
> + cleanup:
> +    if (!success) {
> +        for (i = 0; i < count; ++i) {
> +            VIR_FREE(names[i]);
> +        }
> +        count = -1;
> +    }
> +
> +    hypervFreeObject(priv, (hypervObject *) virtualSwitchList);
> +    virBufferFreeAndReset(&query);
> +
> +    return count;
> +}
>  
>  virNetworkDriver hypervNetworkDriver = {
>      .name = "Hyper-V",
>      .networkLookupByName = hypervNetworkLookupByName, /* 1.2.10 */
>      .networkGetXMLDesc = hypervNetworkGetXMLDesc, /* 1.2.10 */
> +    .connectNumOfNetworks = hypervConnectNumOfNetworks, /* 1.2.10 */
> +    .connectListNetworks = hypervConnectListNetworks, /* 1.2.10 */
> +    .connectNumOfDefinedNetworks = hypervConnectNumOfDefinedNetworks, /* 1.2.10 */
> +    .connectListDefinedNetworks = hypervConnectListDefinedNetworks, /* 1.2.10 */

2.3.0 at the earliest

John

>  };
> 




More information about the libvir-list mailing list