[libvirt] [PATCHv2 3/5] Add virDomain{S, G}etInterfaceparameters support to the remote driver

Osier Yang jyang at redhat.com
Wed Dec 28 06:35:58 UTC 2011


On 2011年12月23日 15:09, Hu Tao wrote:
> * daemon/remote.c: implement the server side support
> * src/remote/remote_driver.c: implement the client side support
> * src/remote/remote_protocol.x: definitions for the mew entry points

s/mew/new/

> * src/remote_protocol-structs: structure definitions
> ---
>   daemon/remote.c              |   64 ++++++++++++++++++++++++++++++++++++++++++
>   src/remote/remote_driver.c   |   52 ++++++++++++++++++++++++++++++++++
>   src/remote/remote_protocol.x |   28 +++++++++++++++++-
>   src/remote_protocol-structs  |   24 +++++++++++++++
>   4 files changed, 167 insertions(+), 1 deletions(-)
>
> diff --git a/daemon/remote.c b/daemon/remote.c
> index 316d530..b7ba321 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -3436,6 +3436,70 @@ cleanup:
>       return rv;
>   }
>
> +static int
> +remoteDispatchDomainGetInterfaceParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
> +                                           virNetServerClientPtr client ATTRIBUTE_UNUSED,
> +                                           virNetMessagePtr msg ATTRIBUTE_UNUSED,
> +                                           virNetMessageErrorPtr rerr,
> +                                           remote_domain_get_interface_parameters_args *args,
> +                                           remote_domain_get_interface_parameters_ret *ret)
> +{
> +    virDomainPtr dom = NULL;
> +    virTypedParameterPtr params = NULL;
> +    const char *device = args->device;
> +    int nparams = args->nparams;
> +    unsigned int flags;
> +    int rv = -1;
> +    struct daemonClientPrivate *priv =
> +        virNetServerClientGetPrivateData(client);
> +
> +    if (!priv->conn) {
> +        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
> +        goto cleanup;
> +    }
> +
> +    flags = args->flags;
> +
> +    if (nparams>  REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX) {
> +        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
> +        goto cleanup;
> +    }
> +    if (VIR_ALLOC_N(params, nparams)<  0) {
> +        virReportOOMError();
> +        goto cleanup;
> +    }
> +
> +    if (!(dom = get_nonnull_domain(priv->conn, args->dom)))
> +        goto cleanup;
> +
> +    if (virDomainGetInterfaceParameters(dom, device, params,&nparams, flags)<  0)
> +        goto cleanup;
> +
> +    /* In this case, we need to send back the number of parameters
> +     * supported
> +     */
> +    if (args->nparams == 0) {
> +        ret->nparams = nparams;
> +        goto success;
> +    }
> +
> +    if (remoteSerializeTypedParameters(params, nparams,
> +&ret->params.params_val,
> +&ret->params.params_len,
> +                                       flags)<  0)
> +        goto cleanup;
> +
> +success:
> +    rv = 0;
> +
> +cleanup:
> +    if (rv<  0)
> +        virNetMessageSaveError(rerr);
> +    if (dom)
> +        virDomainFree(dom);
> +    VIR_FREE(params);
> +    return rv;
> +}
>
>   /*----- Helpers. -----*/
>
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index cd3da53..7580477 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -4396,6 +4396,56 @@ call (virConnectPtr conn,
>   }
>
>
> +static int
> +remoteDomainGetInterfaceParameters (virDomainPtr domain,
> +                                    const char *device,
> +                                    virTypedParameterPtr params, int *nparams,
> +                                    unsigned int flags)
> +{
> +    int rv = -1;
> +    remote_domain_get_interface_parameters_args args;
> +    remote_domain_get_interface_parameters_ret ret;
> +    struct private_data *priv = domain->conn->privateData;
> +
> +    remoteDriverLock(priv);
> +
> +    make_nonnull_domain (&args.dom, domain);
> +    args.device = (char *)device;
> +    args.nparams = *nparams;
> +    args.flags = flags;
> +
> +    memset (&ret, 0, sizeof ret);
> +    if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS,
> +              (xdrproc_t) xdr_remote_domain_get_interface_parameters_args, (char *)&args,
> +              (xdrproc_t) xdr_remote_domain_get_interface_parameters_ret, (char *)&ret) == -1)
> +        goto done;
> +
> +    /* Handle the case when the caller does not know the number of parameters
> +     * and is asking for the number of parameters supported
> +     */
> +    if (*nparams == 0) {
> +        *nparams = ret.nparams;
> +        rv = 0;
> +        goto cleanup;
> +    }
> +
> +    if (remoteDeserializeTypedParameters(ret.params.params_val,
> +                                         ret.params.params_len,
> +                                         REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX,
> +                                         params,
> +                                         nparams)<  0)
> +        goto cleanup;
> +
> +    rv = 0;
> +
> +cleanup:
> +    xdr_free ((xdrproc_t) xdr_remote_domain_get_interface_parameters_ret,
> +              (char *)&ret);
> +done:
> +    remoteDriverUnlock(priv);
> +    return rv;
> +}
> +
>   static void
>   remoteDomainEventQueue(struct private_data *priv, virDomainEventPtr event)
>   {
> @@ -4619,6 +4669,8 @@ static virDriver remote_driver = {
>       .domainBlockStats = remoteDomainBlockStats, /* 0.3.2 */
>       .domainBlockStatsFlags = remoteDomainBlockStatsFlags, /* 0.9.5 */
>       .domainInterfaceStats = remoteDomainInterfaceStats, /* 0.3.2 */
> +    .domainSetInterfaceParameters = remoteDomainSetInterfaceParameters, /* 0.9.9 */
> +    .domainGetInterfaceParameters = remoteDomainGetInterfaceParameters, /* 0.9.9 */
>       .domainMemoryStats = remoteDomainMemoryStats, /* 0.7.5 */
>       .domainBlockPeek = remoteDomainBlockPeek, /* 0.4.2 */
>       .domainMemoryPeek = remoteDomainMemoryPeek, /* 0.4.2 */
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index 18dba8c..ca739ff 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -202,6 +202,11 @@ const REMOTE_CPU_BASELINE_MAX = 256;
>    */
>   const REMOTE_DOMAIN_SEND_KEY_MAX = 16;
>
> +/*
> + * Upper limit on list of interface parameters
> + */
> +const REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX = 16;
> +
>   /* UUID.  VIR_UUID_BUFLEN definition comes from libvirt.h */
>   typedef opaque remote_uuid[VIR_UUID_BUFLEN];
>
> @@ -608,6 +613,25 @@ struct remote_domain_interface_stats_ret { /* insert at 2 */
>       hyper tx_drop;
>   };
>
> +struct remote_domain_set_interface_parameters_args {
> +    remote_nonnull_domain dom;
> +    remote_nonnull_string device;
> +    remote_typed_param params<REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX>;
> +    unsigned int flags;
> +};
> +
> +struct remote_domain_get_interface_parameters_args {
> +    remote_nonnull_domain dom;
> +    remote_nonnull_string device;
> +    int nparams;
> +    unsigned int flags;
> +};
> +
> +struct remote_domain_get_interface_parameters_ret {
> +    remote_typed_param params<REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX>;
> +    int nparams;
> +};
> +
>   struct remote_domain_memory_stats_args {
>       remote_nonnull_domain dom;
>       unsigned int maxStats;
> @@ -2627,7 +2651,9 @@ enum remote_procedure {
>       REMOTE_PROC_DOMAIN_SET_BLOCK_IO_TUNE = 252, /* autogen autogen */
>       REMOTE_PROC_DOMAIN_GET_BLOCK_IO_TUNE = 253, /* skipgen skipgen */
>       REMOTE_PROC_DOMAIN_SET_NUMA_PARAMETERS = 254, /* autogen autogen */
> -    REMOTE_PROC_DOMAIN_GET_NUMA_PARAMETERS = 255 /* skipgen skipgen */
> +    REMOTE_PROC_DOMAIN_GET_NUMA_PARAMETERS = 255, /* skipgen skipgen */
> +    REMOTE_PROC_DOMAIN_SET_INTERFACE_PARAMETERS = 256, /* autogen autogen */
> +    REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS = 257 /* skipgen skipgen */
>
>       /*
>        * Notice how the entries are grouped in sets of 10 ?
> diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
> index f6d8ff5..2758315 100644
> --- a/src/remote_protocol-structs
> +++ b/src/remote_protocol-structs
> @@ -328,6 +328,28 @@ struct remote_domain_interface_stats_ret {
>           int64_t                    tx_errs;
>           int64_t                    tx_drop;
>   };
> +struct remote_domain_set_interface_parameters_args {
> +        remote_nonnull_domain      dom;
> +        remote_nonnull_string      device;
> +        struct {
> +                u_int              params_len;
> +                remote_typed_param * params_val;
> +        } params;
> +        u_int                      flags;
> +};
> +struct remote_domain_get_interface_parameters_args {
> +        remote_nonnull_domain      dom;
> +        remote_nonnull_string      device;
> +        int                        nparams;
> +        u_int                      flags;
> +};
> +struct remote_domain_get_interface_parameters_ret {
> +        struct {
> +                u_int              params_len;
> +                remote_typed_param * params_val;
> +        } params;
> +        int                        nparams;
> +};
>   struct remote_domain_memory_stats_args {
>           remote_nonnull_domain      dom;
>           u_int                      maxStats;
> @@ -2066,4 +2088,6 @@ enum remote_procedure {
>           REMOTE_PROC_DOMAIN_GET_BLOCK_IO_TUNE = 253,
>           REMOTE_PROC_DOMAIN_SET_NUMA_PARAMETERS = 254,
>           REMOTE_PROC_DOMAIN_GET_NUMA_PARAMETERS = 255,
> +        REMOTE_PROC_DOMAIN_SET_INTERFACE_PARAMETERS = 256,
> +        REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS = 257,
>   };


ACK




More information about the libvir-list mailing list