[libvirt] [PATCH v3 3/5] link-state: qemu: Add monitor handling for link state modification

Daniel Veillard veillard at redhat.com
Tue Sep 6 08:18:47 UTC 2011


On Mon, Sep 05, 2011 at 05:26:52PM +0200, Peter Krempa wrote:
> This patch adds handlers for modification of guest's interface
> link state. Both HMP and QMP commands are supported, but as the
> link state functionality is from the beginning supported in QMP
> the HMP code will probably never be used.
> 
>   src/qemu/qemu_monitor.c        - Add command dispatcher
>   src/qemu/qemu_monitor.h        - Add headar for command
>   src/qemu/qemu_monitor_json.c   - Add QMP command handling
>   src/qemu/qemu_monitor_json.h   - Add header for command
>   src/qemu/qemu_monitor_text.c   - Add HMP command handling
>   src/qemu/qemu_monitor_text.h   - Add header for command
> ---
>  src/qemu/qemu_monitor.c      |   19 +++++++++++++++++
>  src/qemu/qemu_monitor.h      |    4 +++
>  src/qemu/qemu_monitor_json.c |   23 +++++++++++++++++++++
>  src/qemu/qemu_monitor_json.h |    4 +++
>  src/qemu/qemu_monitor_text.c |   46 ++++++++++++++++++++++++++++++++++++++++++
>  src/qemu/qemu_monitor_text.h |    4 +++
>  6 files changed, 100 insertions(+), 0 deletions(-)
> 
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index db6107c..5738116 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -1135,6 +1135,25 @@ int qemuMonitorGetCPUInfo(qemuMonitorPtr mon,
>      return ret;
>  }
> 
> +int qemuMonitorSetLink(qemuMonitorPtr mon,
> +                       const char *name,
> +                       enum virDomainNetInterfaceLinkState state)
> +{
> +    int ret;
> +    VIR_DEBUG("mon=%p, name=%p:%s, state=%u", mon, name, name, state);
> +
> +    if (!mon || !name) {
> +        qemuReportError(VIR_ERR_INVALID_ARG,
> +                        _("monitor || name must not be NULL"));
> +        return -1;
> +    }
> +
> +    if (mon->json)
> +        ret = qemuMonitorJSONSetLink(mon, name, state);
> +    else
> +        ret = qemuMonitorTextSetLink(mon, name, state);
> +    return ret;
> +}
> 
>  int qemuMonitorGetVirtType(qemuMonitorPtr mon,
>                             int *virtType)
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index f241c9e..cd46608 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -145,6 +145,10 @@ void qemuMonitorUnlock(qemuMonitorPtr mon);
>  int qemuMonitorRef(qemuMonitorPtr mon);
>  int qemuMonitorUnref(qemuMonitorPtr mon) ATTRIBUTE_RETURN_CHECK;
> 
> +int qemuMonitorSetLink(qemuMonitorPtr mon,
> +                       const char *name,
> +                       enum virDomainNetInterfaceLinkState state) ;
> +
>  /* These APIs are for use by the internal Text/JSON monitor impl code only */
>  char *qemuMonitorNextCommandID(qemuMonitorPtr mon);
>  int qemuMonitorSend(qemuMonitorPtr mon,
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 4ceb536..c502b72 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -955,6 +955,29 @@ int qemuMonitorJSONSystemPowerdown(qemuMonitorPtr mon)
>      return ret;
>  }
> 
> +int qemuMonitorJSONSetLink(qemuMonitorPtr mon,
> +                           const char *name,
> +                           enum virDomainNetInterfaceLinkState state)
> +{
> +
> +    int ret;
> +    virJSONValuePtr reply = NULL;
> +    virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("set_link",
> +                                                     "s:name", name,
> +                                                     "b:up", state != VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN,
> +                                                     NULL);
> +
> +    if (!cmd)
> +        return -1;
> +
> +    if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) == 0)
> +        ret = qemuMonitorJSONCheckError(cmd, reply);
> +
> +    virJSONValueFree(cmd);
> +    virJSONValueFree(reply);
> +
> +    return ret;
> +}
> 
>  int qemuMonitorJSONSystemReset(qemuMonitorPtr mon)
>  {
> diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
> index 9512793..2611b07 100644
> --- a/src/qemu/qemu_monitor_json.h
> +++ b/src/qemu/qemu_monitor_json.h
> @@ -231,4 +231,8 @@ int qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
>                              virDomainBlockJobInfoPtr info,
>                              int mode);
> 
> +int qemuMonitorJSONSetLink(qemuMonitorPtr mon,
> +                           const char *name,
> +                           enum virDomainNetInterfaceLinkState state);
> +
>  #endif /* QEMU_MONITOR_JSON_H */
> diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
> index 854ee7f..0fdc223 100644
> --- a/src/qemu/qemu_monitor_text.c
> +++ b/src/qemu/qemu_monitor_text.c
> @@ -433,6 +433,52 @@ int qemuMonitorTextSystemPowerdown(qemuMonitorPtr mon) {
>      return 0;
>  }
> 
> +int qemuMonitorTextSetLink(qemuMonitorPtr mon, const char *name, enum virDomainNetInterfaceLinkState state) {
> +    char *info = NULL;
> +    char *cmd = NULL;
> +    const char *st_str = NULL;
> +
> +    /* determine state */
> +    if (state == VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN)
> +        st_str = "off";
> +    else
> +        st_str = "on";
> +
> +    if (virAsprintf(&cmd, "set_link %s %s", name, st_str) < 0) {
> +        virReportOOMError();
> +        goto error;
> +    }
> +    if (qemuMonitorHMPCommand(mon, cmd, &info) < 0) {
> +        qemuReportError(VIR_ERR_OPERATION_FAILED,
> +                        "%s", _("set_link operation failed"));
> +        goto error;
> +    }
> +
> +    /* check if set_link command is supported */
> +    if (strstr(info, "\nunknown ")) {
> +        qemuReportError(VIR_ERR_NO_SUPPORT,
> +                        "%s",
> +                        _("\'set_link\' not supported by this qemu"));
> +        goto error;
> +    }
> +
> +    /* check if qemu didn't reject device name */
> +    if (strstr(info, "\nDevice ")) {
> +        qemuReportError(VIR_ERR_OPERATION_FAILED,
> +                        "%s", _("device name rejected"));
> +        goto error;
> +    }
> +
> +    VIR_FREE(info);
> +    VIR_FREE(cmd);
> +    return 0;
> +
> +error:
> +    VIR_FREE(info);
> +    VIR_FREE(cmd);
> +
> +    return -1;
> +}
> 
>  int qemuMonitorTextSystemReset(qemuMonitorPtr mon) {
>      char *info;
> diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h
> index b250738..ddf89fe 100644
> --- a/src/qemu/qemu_monitor_text.h
> +++ b/src/qemu/qemu_monitor_text.h
> @@ -224,4 +224,8 @@ int qemuMonitorTextBlockJob(qemuMonitorPtr mon,
>                              virDomainBlockJobInfoPtr info,
>                              int mode);
> 
> +int qemuMonitorTextSetLink(qemuMonitorPtr mon,
> +                           const char *name,
> +                           enum virDomainNetInterfaceLinkState state);
> +
>  #endif /* QEMU_MONITOR_TEXT_H */
> -- 
> 1.7.3.4

  ACK, looks fine to me,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list