From patchwork Fri Aug 21 15:37:00 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?UTF-8?B?Wm9sdMOhbiBLxZF2w6Fnw7M=?= X-Patchwork-Id: 509525 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4E3F61402A9 for ; Sat, 22 Aug 2015 01:41:02 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=XWfz9dtd; dkim-atps=neutral Received: from localhost ([::1]:42168 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZSoRA-0007As-5h for incoming@patchwork.ozlabs.org; Fri, 21 Aug 2015 11:41:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50585) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZSoO1-00026b-Sz for qemu-devel@nongnu.org; Fri, 21 Aug 2015 11:37:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZSoO0-0001zd-81 for qemu-devel@nongnu.org; Fri, 21 Aug 2015 11:37:45 -0400 Received: from mail-wi0-x236.google.com ([2a00:1450:400c:c05::236]:37594) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZSoNz-0001zU-TA for qemu-devel@nongnu.org; Fri, 21 Aug 2015 11:37:44 -0400 Received: by widdq5 with SMTP id dq5so19211091wid.0 for ; Fri, 21 Aug 2015 08:37:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=fdRR4AZKOkk+di/6xKCAnUg0udviWBNfIbsnEhe0c9M=; b=XWfz9dtdyEPMV7mxhno5ggq52zhGjIkyuK1XHSWGg5JmgGIOyein1XoscsuPknzB6u BHQ1WthaaodRyI4PUuy336kC+eIDYj/e7v3YKwlFtw8SGnO1lQPLA8JEHeHqRJVHIwbk UpZLb5E778EcopJN2uyT3O3vuVkpgHA51FfBgQGuXxwiVKYQjJqaB40pzn9F+TNSeRCd hcbdVw/FeIHmb4jMeamuXH96hwa/6+phEFz5y2YwPXXJ6N1x2N/fxse50C2sh+9D5cNw mY21B0fmhm1qfS23bPmuPmnLzKdgSon+Gyo0yLogXH7F67wrCa66vd3ORYnKrfNleWTl WcFQ== X-Received: by 10.180.74.141 with SMTP id t13mr6633427wiv.71.1440171463275; Fri, 21 Aug 2015 08:37:43 -0700 (PDT) Received: from nullptr.home.dirty-ice.org (178-164-172-216.pool.digikabel.hu. [178.164.172.216]) by smtp.gmail.com with ESMTPSA id v8sm10479895wjr.15.2015.08.21.08.37.42 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 21 Aug 2015 08:37:42 -0700 (PDT) From: "=?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?=" X-Google-Original-From: =?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?= To: qemu-devel@nongnu.org Date: Fri, 21 Aug 2015 17:37:00 +0200 Message-Id: X-Mailer: git-send-email 2.5.0 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c05::236 Cc: Jason Wang , Gerd Hoffmann , Stefan Hajnoczi , Markus Armbruster Subject: [Qemu-devel] [PATCH v2 04/49] net: remove NetLegacy struct X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- 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 28a5597..10fbaca 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 999faa3..8253d0a 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -2499,21 +2499,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.5 +# @vlan, @name - since 2.5 ## -{ 'struct': 'NetLegacy', +{ 'struct': 'Netdev', 'data': { '*vlan': 'int32', '*id': 'str', @@ -2521,22 +2525,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.