[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