qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 22/22] monitor/net: Convert do_info_network() to QOb


From: Miguel Di Ciurcio Filho
Subject: [Qemu-devel] [PATCH 22/22] monitor/net: Convert do_info_network() to QObject/QMP
Date: Thu, 8 Apr 2010 17:16:39 -0300

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.

Signed-off-by: Miguel Di Ciurcio Filho <address@hidden>
---
 monitor.c |    3 +-
 net.c     |  133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
 net.h     |    6 ++-
 3 files changed, 126 insertions(+), 16 deletions(-)

diff --git a/monitor.c b/monitor.c
index 822dc27..0b3fdfc 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2604,7 +2604,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 ad01732..c59ae5b 100644
--- a/net.c
+++ b/net.c
@@ -33,10 +33,10 @@
 #include "net/util.h"
 #include "monitor.h"
 #include "sysemu.h"
+#include "qstring.h"
 #include "qemu-common.h"
 #include "qemu_socket.h"
-#include "qdict.h"
-#include "qstring.h"
+#include "qemu-objects.h"
 #include "hw/qdev.h"
 
 static QTAILQ_HEAD(, VLANState) vlans;
@@ -174,7 +174,7 @@ void qemu_format_nic_info_dict(VLANClientState *vc, uint8_t 
macaddr[6])
     snprintf(mac, 18, "%02x:%02x:%02x:%02x:%02x:%02x",
              macaddr[0], macaddr[1], macaddr[2],
              macaddr[3], macaddr[4], macaddr[5]);
-
+            
     qdict_put(vc->info_dict, "macaddr", qstring_from_str(mac));
     qdict_put(vc->info_dict, "model", qstring_from_str(vc->model));
 }
@@ -1224,26 +1224,131 @@ void net_set_boot_mask(int net_boot_mask)
     }
 }
 
-void do_info_network(Monitor *mon)
+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");
+}
+
+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 containing any of the following: 
+ *          - "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
+ *          - "mcast": multicast address
+ *          - "cloned": true if the device is multicast clone
+ *          - "connection_from": IP/port pair of an incomming connection
+ *          - "connect_to": IP/port pair of an outgoing connection
+ *
+ * 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);
 }
 
 void do_set_link(Monitor *mon, const QDict *qdict)
diff --git a/net.h b/net.h
index b744294..d1cf6ab 100644
--- a/net.h
+++ b/net.h
@@ -6,6 +6,7 @@
 #include "qemu-common.h"
 #include "qdict.h"
 #include "qemu-option.h"
+#include "qobject.h"
 #include "net/queue.h"
 
 struct MACAddr {
@@ -117,7 +118,10 @@ 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 vlan_devices_iter(QObject *obj, void *opaque);
+void non_vlan_devices_iter(QObject *obj, void *opaque);
+void do_info_network_print(Monitor *mon, const QObject *ret_data);
+void do_info_network(Monitor *mon, QObject **ret_data);
 void do_set_link(Monitor *mon, const QDict *qdict);
 
 /* NIC info */
-- 
1.7.0.3





reply via email to

[Prev in Thread] Current Thread [Next in Thread]