From: Miguel Di Ciurcio Filho <miguel.filho@gmail.com>
To: qemu-devel@nongnu.org
Cc: armbru@redhat.com, lcapitulino@redhat.com
Subject: [Qemu-devel] [PATCH v3 11/12] monitor/net: Convert do_info_network() to QObject/QMP
Date: Thu, 15 Apr 2010 11:07:06 -0300 [thread overview]
Message-ID: <1271340427-12579-12-git-send-email-miguel.filho@gmail.com> (raw)
In-Reply-To: <1271340427-12579-1-git-send-email-miguel.filho@gmail.com>
Each device is represented by a QDict. The returned QObject is a QList
of all devices.
This commit slightly changes the monitor output when 'info network' is used.
Old output:
(qemu) info network
VLAN 1 devices:
e1000.0: model=e1000,macaddr=52:54:00:12:34:56
VLAN 0 devices:
tap.0: ifname=tap0,script=/etc/kvm/kvm-ifup,downscript=/etc/qemu-ifdown
Devices not on any VLAN:
New output:
(qemu) info network
Devices on VLANs:
e1000.0: vlan=1 model=e1000 macaddr=52:54:00:12:34:56
tap.0: vlan=0 script=/etc/kvm/kvm-ifup downscript=/etc/qemu-ifdown ifname=tap0
Devices not on any VLAN:
Signed-off-by: Miguel Di Ciurcio Filho <miguel.filho@gmail.com>
---
monitor.c | 3 +-
net.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
net.h | 3 +-
3 files changed, 122 insertions(+), 11 deletions(-)
diff --git a/monitor.c b/monitor.c
index 4c6275e..34781ba 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2610,7 +2610,8 @@ static const mon_cmd_t info_cmds[] = {
.args_type = "",
.params = "",
.help = "show the network state",
- .mhandler.info = do_info_network,
+ .user_print = do_info_network_print,
+ .mhandler.info_new = do_info_network,
},
{
.name = "chardev",
diff --git a/net.c b/net.c
index 8c02f28..46e8873 100644
--- a/net.c
+++ b/net.c
@@ -35,6 +35,8 @@
#include "sysemu.h"
#include "qemu-common.h"
#include "qemu_socket.h"
+#include "qemu-objects.h"
+#include "qobject.h"
#include "qdict.h"
#include "qstring.h"
#include "hw/qdev.h"
@@ -1285,28 +1287,135 @@ void net_set_boot_mask(int net_boot_mask)
}
}
-void do_info_network(Monitor *mon)
+static void vlan_devices_iter(QObject *obj, void *opaque)
+{
+
+ Monitor *mon = opaque;
+ QDict *net_device = qobject_to_qdict(obj);
+
+ if (!qdict_haskey(net_device, "vlan"))
+ return;
+
+ monitor_printf(mon, " %s: vlan=%d ", qdict_get_str(net_device, "name"),
+ (int)qdict_get_int(net_device, "vlan"));
+ monitor_printf(mon,
+ qstring_get_str(qdict_to_qstring(qdict_get_qdict(net_device, "info"))));
+
+ monitor_printf(mon, " \n");
+}
+
+static void non_vlan_devices_iter(QObject *obj, void *opaque)
+{
+
+ Monitor *mon = opaque;
+ QDict *net_device = qobject_to_qdict(obj);
+
+ if (qdict_haskey(net_device, "vlan"))
+ return;
+
+ monitor_printf(mon, " %s: ", qdict_get_str(net_device, "name"));
+
+ if (qdict_haskey(net_device, "peer"))
+ monitor_printf(mon, "peer=%s ", qdict_get_str(net_device, "peer"));
+
+ monitor_printf(mon,
+ qstring_get_str(qdict_to_qstring(qdict_get_qdict(net_device, "info"))));
+
+ monitor_printf(mon, "\n");
+
+}
+
+void do_info_network_print(Monitor *mon, const QObject *ret_data)
+{
+ QList *qlist;
+
+ qlist = qobject_to_qlist(ret_data);
+
+ monitor_printf(mon, "Devices on VLANs:\n");
+
+ qlist_iter(qlist, vlan_devices_iter, mon);
+
+ monitor_printf(mon, "Devices not on any VLAN:\n");
+
+ qlist_iter(qlist, non_vlan_devices_iter, mon);
+
+}
+
+/**
+ * do_network_info(): Network information
+ *
+ * Each network device information is stored in a QDict and the
+ * returned QObject is a QList of all devices.
+ *
+ * The QDict contains the following:
+ *
+ * - "name": device name
+ * - "vlan": only present if the device is attached to a VLAN, it is the id
+ * of the VLAN
+ * - "info": it is a QDict that may contain any of the following, depending on
+ * the type of the device:
+ * - "model": type of the device
+ * - "macaddr": MAC address
+ * - "script": path to script used to configure the device
+ * - "downscript": path to script used to deconfigure the device
+ * - "fd": handle to the device
+ * - "ifname": name of the host device connected to the guest device
+ * - "host": IP address of a socket
+ * - "service": port of a socket
+ * - "family": Internet protocol family (IPv4 or IPv6)
+ *
+ * Example:
+ *
+ * [ { "name": "tap.0", "vlan": 0,
+ "info": { "script": "/etc/kvm/kvm-ifup", "downscript":
+"/etc/qemu-ifdown",
+ "ifname": "tap0" } },
+ { "name": "e1000.0", "vlan": 1,
+ "info": { "model": "e1000", "macaddr": "52:54:00:12:34:56" } } ]
+ */
+void do_info_network(Monitor *mon, QObject **ret_data)
{
VLANState *vlan;
VLANClientState *vc;
+ QDict *net_device;
+ QList *device_list;
+ device_list = qlist_new();
QTAILQ_FOREACH(vlan, &vlans, next) {
- monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
+ QObject *obj;
QTAILQ_FOREACH(vc, &vlan->clients, next) {
- monitor_printf(mon, " %s: %s\n", vc->name, vc->info_str);
+
+ obj = qobject_from_jsonf("{ 'vlan': %d, 'name': %s }", vlan->id,
+vc->name);
+ net_device = qobject_to_qdict(obj);
+
+ QINCREF(vc->info_dict);
+ qdict_put(net_device, "info", vc->info_dict);
+
+ qlist_append(device_list, qobject_to_qdict(obj));
+
}
}
- monitor_printf(mon, "Devices not on any VLAN:\n");
+
QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
- monitor_printf(mon, " %s: %s", vc->name, vc->info_str);
- if (vc->peer) {
- monitor_printf(mon, " peer=%s", vc->peer->name);
- }
- monitor_printf(mon, "\n");
+ QObject *obj;
+ obj = qobject_from_jsonf("{ 'name': %s }", vc->name);
+ net_device = qobject_to_qdict(obj);
+
+ QINCREF(vc->info_dict);
+ qdict_put(net_device, "info", vc->info_dict);
+
+ if (vc->peer)
+ qdict_put(net_device, "peer", qstring_from_str(vc->peer->name));
+
+ qlist_append(device_list, net_device);
}
+
+ *ret_data = QOBJECT(device_list);
}
+
int do_set_link(Monitor *mon, const QDict *qdict, QObject **ret_data)
{
VLANState *vlan;
diff --git a/net.h b/net.h
index d12276a..058420e 100644
--- a/net.h
+++ b/net.h
@@ -119,7 +119,8 @@ void qemu_check_nic_model(NICInfo *nd, const char *model);
int qemu_find_nic_model(NICInfo *nd, const char * const *models,
const char *default_model);
-void do_info_network(Monitor *mon);
+void do_info_network_print(Monitor *mon, const QObject *ret_data);
+void do_info_network(Monitor *mon, QObject **ret_data);
int do_set_link(Monitor *mon, const QDict *qdict, QObject **ret_data);
/* NIC info */
--
1.7.0.4
next prev parent reply other threads:[~2010-04-15 14:18 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-15 14:06 [Qemu-devel] [PATCH v3 00/12] Convert do_info_network() to QObject/QMP Miguel Di Ciurcio Filho
2010-04-15 14:06 ` [Qemu-devel] [PATCH v3 01/12] QObject API: add qdict_to_qstring() function Miguel Di Ciurcio Filho
2010-04-23 21:04 ` [Qemu-devel] " Luiz Capitulino
2010-04-15 14:06 ` [Qemu-devel] [PATCH v3 02/12] net: add qemu_nic_format_info_dict and VLANClientState->info_dict Miguel Di Ciurcio Filho
2010-04-23 21:05 ` [Qemu-devel] " Luiz Capitulino
2010-04-15 14:06 ` [Qemu-devel] [PATCH v3 03/12] net: eepro100: replace qemu_format_nic_info_str by qemu_format_nic_info_dict Miguel Di Ciurcio Filho
2010-04-15 15:32 ` Richard Henderson
2010-04-15 14:06 ` [Qemu-devel] [PATCH v3 04/12] net: various devices: " Miguel Di Ciurcio Filho
2010-04-15 14:07 ` [Qemu-devel] [PATCH v3 05/12] net: slirp: use info_dict instead of info_str Miguel Di Ciurcio Filho
2010-04-23 21:06 ` [Qemu-devel] " Luiz Capitulino
2010-04-15 14:07 ` [Qemu-devel] [PATCH v3 06/12] net: tap/tap-win32: " Miguel Di Ciurcio Filho
2010-04-23 21:08 ` [Qemu-devel] " Luiz Capitulino
2010-04-15 14:07 ` [Qemu-devel] [PATCH v3 07/12] net: vde: " Miguel Di Ciurcio Filho
2010-04-15 14:07 ` [Qemu-devel] [PATCH v3 08/12] net: dump: " Miguel Di Ciurcio Filho
2010-04-15 14:07 ` [Qemu-devel] [PATCH v3 09/12] net: socket: " Miguel Di Ciurcio Filho
2010-04-23 21:10 ` [Qemu-devel] " Luiz Capitulino
2010-04-15 14:07 ` [Qemu-devel] [PATCH v3 10/12] net: xen: " Miguel Di Ciurcio Filho
2010-04-15 14:07 ` Miguel Di Ciurcio Filho [this message]
2010-04-23 21:13 ` [Qemu-devel] Re: [PATCH v3 11/12] monitor/net: Convert do_info_network() to QObject/QMP Luiz Capitulino
2010-04-15 14:07 ` [Qemu-devel] [PATCH v3 12/12] net: Remove info_str from VLANClientState, not needed anymore Miguel Di Ciurcio Filho
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1271340427-12579-12-git-send-email-miguel.filho@gmail.com \
--to=miguel.filho@gmail.com \
--cc=armbru@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).