qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Mark McLoughlin <markmc@redhat.com>
To: qemu-devel@nongnu.org
Cc: Mark McLoughlin <markmc@redhat.com>,
	kraxel@redhat.com, quintela@redhat.com
Subject: [Qemu-devel] [PATCH 2/7] qdev: add "net-client" property
Date: Thu, 12 Nov 2009 20:28:57 +0000	[thread overview]
Message-ID: <1258057742-18699-3-git-send-email-markmc@redhat.com> (raw)
In-Reply-To: <1258057742-18699-1-git-send-email-markmc@redhat.com>

Rather than having each NIC create it's own client, let's create the
client early and pass it down to the NIC.

One advantage is that we can add parameters which only the client
knows about, without having the NIC know anything about it - e.g. NICs
shouldn't know about netdev vs. vlan.

Another advantage is that we can easily get the client associated with
a qdev.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
 hw/qdev-properties.c |   25 +++++++++++++++++++++++++
 hw/qdev.h            |    5 +++++
 net.h                |    8 +++++---
 3 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
index bda6699..8ce0de7 100644
--- a/hw/qdev-properties.c
+++ b/hw/qdev-properties.c
@@ -279,6 +279,26 @@ PropertyInfo qdev_prop_chr = {
     .print = print_chr,
 };
 
+/* --- network client object --- */
+
+static int print_net_client(DeviceState *dev, Property *prop, char *dest, size_t len)
+{
+    VLANClientState **ptr = qdev_get_prop_ptr(dev, prop);
+
+    if (*ptr && (*ptr)->name) {
+        return snprintf(dest, len, "%s", (*ptr)->name);
+    } else {
+        return snprintf(dest, len, "<null>");
+    }
+}
+
+PropertyInfo qdev_prop_net_client = {
+    .name  = "net-client",
+    .type  = PROP_TYPE_NET_CLIENT,
+    .size  = sizeof(VLANClientState*),
+    .print = print_net_client,
+};
+
 /* --- netdev device --- */
 
 static int parse_netdev(DeviceState *dev, Property *prop, const char *str)
@@ -558,6 +578,11 @@ void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *valu
     qdev_prop_set(dev, name, &value, PROP_TYPE_CHR);
 }
 
+void qdev_prop_set_net_client(DeviceState *dev, const char *name, VLANClientState *value)
+{
+    qdev_prop_set(dev, name, &value, PROP_TYPE_NET_CLIENT);
+}
+
 void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value)
 {
     qdev_prop_set(dev, name, &value, PROP_TYPE_NETDEV);
diff --git a/hw/qdev.h b/hw/qdev.h
index 41642ee..3e1510f 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -79,6 +79,7 @@ enum PropertyType {
     PROP_TYPE_DRIVE,
     PROP_TYPE_CHR,
     PROP_TYPE_STRING,
+    PROP_TYPE_NET_CLIENT,
     PROP_TYPE_NETDEV,
     PROP_TYPE_VLAN,
     PROP_TYPE_PTR,
@@ -194,6 +195,7 @@ extern PropertyInfo qdev_prop_chr;
 extern PropertyInfo qdev_prop_ptr;
 extern PropertyInfo qdev_prop_macaddr;
 extern PropertyInfo qdev_prop_drive;
+extern PropertyInfo qdev_prop_net_client;
 extern PropertyInfo qdev_prop_netdev;
 extern PropertyInfo qdev_prop_vlan;
 extern PropertyInfo qdev_prop_pci_devfn;
@@ -235,6 +237,8 @@ extern PropertyInfo qdev_prop_pci_devfn;
     DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*)
 #define DEFINE_PROP_STRING(_n, _s, _f)             \
     DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
+#define DEFINE_PROP_NET_CLIENT(_n, _s, _f)         \
+    DEFINE_PROP(_n, _s, _f, qdev_prop_net_client, VLANClientState *)
 #define DEFINE_PROP_NETDEV(_n, _s, _f)             \
     DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, VLANClientState*)
 #define DEFINE_PROP_VLAN(_n, _s, _f)             \
@@ -258,6 +262,7 @@ void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value);
 void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value);
 void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value);
 void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value);
+void qdev_prop_set_net_client(DeviceState *dev, const char *name, VLANClientState *value);
 void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value);
 void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value);
 void qdev_prop_set_drive(DeviceState *dev, const char *name, DriveInfo *value);
diff --git a/net.h b/net.h
index aa4b78a..d7235bb 100644
--- a/net.h
+++ b/net.h
@@ -14,15 +14,17 @@ struct MACAddr {
 /* qdev nic properties */
 
 typedef struct NICConf {
+    VLANClientState *client;
     MACAddr macaddr;
     VLANState *vlan;
     VLANClientState *peer;
 } NICConf;
 
 #define DEFINE_NIC_PROPERTIES(_state, _conf)                            \
-    DEFINE_PROP_MACADDR("mac",   _state, _conf.macaddr),                \
-    DEFINE_PROP_VLAN("vlan",     _state, _conf.vlan),                   \
-    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer)
+    DEFINE_PROP_NET_CLIENT("net-client", _state, _conf.client),         \
+    DEFINE_PROP_MACADDR("mac",           _state, _conf.macaddr),        \
+    DEFINE_PROP_VLAN("vlan",             _state, _conf.vlan),           \
+    DEFINE_PROP_NETDEV("netdev",         _state, _conf.peer)
 
 /* VLANs support */
 
-- 
1.6.2.5

  parent reply	other threads:[~2009-11-12 20:31 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-12 20:28 [Qemu-devel] [RFC PATCH 0/7] Fix qemu_announce_self() properly Mark McLoughlin
2009-11-12 20:28 ` [Qemu-devel] [PATCH 1/7] net: remove NICInfo::vc Mark McLoughlin
2009-11-12 20:28 ` Mark McLoughlin [this message]
2009-11-16  9:03   ` [Qemu-devel] Re: [PATCH 2/7] qdev: add "net-client" property Gerd Hoffmann
2009-11-12 20:28 ` [Qemu-devel] [PATCH 3/7] net: create the VLANClientState for NICs early Mark McLoughlin
2009-11-16  9:26   ` [Qemu-devel] " Gerd Hoffmann
2009-11-12 20:28 ` [Qemu-devel] [PATCH 4/7] net: kill off NICInfo/NICConf::vlan/netdev Mark McLoughlin
2009-11-12 20:29 ` [Qemu-devel] [PATCH 5/7] qdev: add qdev_foreach() Mark McLoughlin
2009-11-16  9:28   ` [Qemu-devel] " Gerd Hoffmann
2009-11-20 14:20     ` Mark McLoughlin
2009-11-23  9:55       ` Gerd Hoffmann
2009-11-12 20:29 ` [Qemu-devel] [PATCH 6/7] qdev: add qdev_prop_get_{macaddr, net_client}() Mark McLoughlin
2009-11-12 20:29 ` [Qemu-devel] [PATCH 7/7] net: fix qemu_announce_self() Mark McLoughlin
2009-11-13  7:41   ` Mark McLoughlin
2009-11-13  8:14   ` Markus Armbruster

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=1258057742-18699-3-git-send-email-markmc@redhat.com \
    --to=markmc@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /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).