[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 3/6] net: remove NetLegacy struct
From: |
Kővágó, Zoltán |
Subject: |
[Qemu-devel] [PATCH v2 3/6] net: remove NetLegacy struct |
Date: |
Fri, 3 Jul 2015 15:45:48 +0200 |
NetLegacy is just Netdev with some extra fields (name, vlan) and an
optional id. This patch merges the two structs, and net_client_init1
got some extra checks to make sure only accept valid -netdev command
lines. This is some extra work, but allows us to uniformly manage both
legacy -net and non-legacy -netdev in code.
Signed-off-by: Kővágó, Zoltán <address@hidden>
---
net/net.c | 42 +++++++++++++++++++++---------------------
qapi-schema.json | 30 +++++++++---------------------
2 files changed, 30 insertions(+), 42 deletions(-)
diff --git a/net/net.c b/net/net.c
index 6ff7fec..10e7672 100644
--- a/net/net.c
+++ b/net/net.c
@@ -911,17 +911,29 @@ static int (* const
net_client_init_fun[NET_CLIENT_OPTIONS_KIND_MAX])(
};
-static int net_client_init1(const void *object, int is_netdev, Error **errp)
+static int net_client_init1(const Netdev *netdev, int is_netdev, Error **errp)
{
- const NetClientOptions *opts;
+ const NetClientOptions *opts = netdev->opts;
const char *name;
NetClientState *peer = NULL;
if (is_netdev) {
- const Netdev *netdev = object;
- opts = netdev->opts;
name = netdev->id;
+ /* validate -netdev option: has id, no vlan or name */
+ if (!netdev->has_id) {
+ error_setg(errp, QERR_MISSING_PARAMETER, "id");
+ return -1;
+ }
+ if (netdev->has_name) {
+ error_setg(errp, QERR_INVALID_PARAMETER, "name");
+ return -1;
+ }
+ if (netdev->has_vlan) {
+ error_setg(errp, QERR_INVALID_PARAMETER, "vlan");
+ return -1;
+ }
+
if (opts->kind == NET_CLIENT_OPTIONS_KIND_DUMP ||
opts->kind == NET_CLIENT_OPTIONS_KIND_NIC ||
!net_client_init_fun[opts->kind]) {
@@ -930,10 +942,8 @@ static int net_client_init1(const void *object, int
is_netdev, Error **errp)
return -1;
}
} else {
- const NetLegacy *net = object;
- opts = net->opts;
/* missing optional values have been initialized to "all bits zero" */
- name = net->has_id ? net->id : net->name;
+ name = netdev->has_id ? netdev->id : netdev->name;
if (opts->kind == NET_CLIENT_OPTIONS_KIND_NONE) {
return 0; /* nothing to do */
@@ -954,7 +964,7 @@ static int net_client_init1(const void *object, int
is_netdev, Error **errp)
/* Do not add to a vlan if it's a nic with a netdev= parameter. */
if (opts->kind != NET_CLIENT_OPTIONS_KIND_NIC ||
!opts->nic->has_netdev) {
- peer = net_hub_add_port(net->has_vlan ? net->vlan : 0, NULL);
+ peer = net_hub_add_port(netdev->has_vlan ? netdev->vlan : 0, NULL);
}
}
@@ -970,26 +980,16 @@ static int net_client_init1(const void *object, int
is_netdev, Error **errp)
}
-static void net_visit(Visitor *v, int is_netdev, void **object, Error **errp)
-{
- if (is_netdev) {
- visit_type_Netdev(v, (Netdev **)object, NULL, errp);
- } else {
- visit_type_NetLegacy(v, (NetLegacy **)object, NULL, errp);
- }
-}
-
-
int net_client_init(QemuOpts *opts, int is_netdev, Error **errp)
{
- void *object = NULL;
+ Netdev *object = NULL;
Error *err = NULL;
int ret = -1;
{
OptsVisitor *ov = opts_visitor_new(opts);
- net_visit(opts_get_visitor(ov), is_netdev, &object, &err);
+ visit_type_Netdev(opts_get_visitor(ov), &object, NULL, &err);
opts_visitor_cleanup(ov);
}
@@ -1000,7 +1000,7 @@ int net_client_init(QemuOpts *opts, int is_netdev, Error
**errp)
if (object) {
QapiDeallocVisitor *dv = qapi_dealloc_visitor_new();
- net_visit(qapi_dealloc_get_visitor(dv), is_netdev, &object, NULL);
+ visit_type_Netdev(qapi_dealloc_get_visitor(dv), &object, NULL, NULL);
qapi_dealloc_visitor_cleanup(dv);
}
diff --git a/qapi-schema.json b/qapi-schema.json
index 7ebf99e..08e376b 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2500,21 +2500,25 @@
'vhost-user': 'NetdevVhostUserOptions' } }
##
-# @NetLegacy
+# @Netdev
#
-# Captures the configuration of a network device; legacy.
+# Captures the configuration of a network device.
#
-# @vlan: #optional vlan number
+# @vlan: #optional vlan number (legacy, forbidden with -netdev)
#
-# @id: #optional identifier for monitor commands
+# @id: #optional identifier for monitor commands (required with -netdev)
#
# @name: #optional identifier for monitor commands, ignored if @id is present
+# (legacy, forbidden with -netdev)
#
# @opts: device type specific properties (legacy)
#
# Since 1.2
+#
+# @id #optional - since 2.4
+# @vlan, @name - since 2.4
##
-{ 'struct': 'NetLegacy',
+{ 'struct': 'Netdev',
'data': {
'*vlan': 'int32',
'*id': 'str',
@@ -2522,22 +2526,6 @@
'opts': 'NetClientOptions' } }
##
-# @Netdev
-#
-# Captures the configuration of a network device.
-#
-# @id: identifier for monitor commands.
-#
-# @opts: device type specific properties
-#
-# Since 1.2
-##
-{ 'struct': 'Netdev',
- 'data': {
- 'id': 'str',
- 'opts': 'NetClientOptions' } }
-
-##
# @InetSocketAddress
#
# Captures a socket address or address range in the Internet namespace.
--
2.4.5
- [Qemu-devel] [PATCH v2 0/6] qapi flattening, Kővágó, Zoltán, 2015/07/03
- [Qemu-devel] [PATCH v2 1/6] qapi: support implicit structs in OptsVisitor, Kővágó, Zoltán, 2015/07/03
- [Qemu-devel] [PATCH v2 2/6] qapi: convert NumaOptions into a flat union, Kővágó, Zoltán, 2015/07/03
- [Qemu-devel] [PATCH v2 3/6] net: remove NetLegacy struct,
Kővágó, Zoltán <=
- [Qemu-devel] [PATCH v2 4/6] net: use Netdev instead of NetClientOptions in client init, Kővágó, Zoltán, 2015/07/03
- [Qemu-devel] [PATCH v2 6/6] qapi: reorder NetdevBase and Netdev, Kővágó, Zoltán, 2015/07/03
- [Qemu-devel] [PATCH v2 5/6] qapi: change Netdev into a flat union, Kővágó, Zoltán, 2015/07/03