From patchwork Mon Sep 7 12:08:08 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: 515104 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 E1E721401CB for ; Mon, 7 Sep 2015 22:10:32 +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=uRNLIJz7; dkim-atps=neutral Received: from localhost ([::1]:56285 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZYvFn-0005Sl-6C for incoming@patchwork.ozlabs.org; Mon, 07 Sep 2015 08:10:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36968) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZYvDR-0001bx-K2 for qemu-devel@nongnu.org; Mon, 07 Sep 2015 08:08:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZYvDQ-0003gz-9f for qemu-devel@nongnu.org; Mon, 07 Sep 2015 08:08:05 -0400 Received: from mail-wi0-x235.google.com ([2a00:1450:400c:c05::235]:35076) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZYvDQ-0003fo-0T for qemu-devel@nongnu.org; Mon, 07 Sep 2015 08:08:04 -0400 Received: by wicge5 with SMTP id ge5so81713880wic.0 for ; Mon, 07 Sep 2015 05:08:03 -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=ZDqH35M3k//CMLSdhr+U4YXGbh/zr16U5/8QFQdtE6g=; b=uRNLIJz7IrhXp2IxoZU0na9zy31z3zu5XLn7QycIvBV2WFmMHPLDbLbmyG9LL8yXJ1 SEYSsTDOCviVc4NGnBVCJvcQma7k9ojlYW/DyGcV/KMZF06nBTkNS64BM1W9LLAYmx3W bepVGOJ5+IqJSaN8w9QiHFsAbMmvJqgKS4n1gs1P/dyw4ZZHExZ57hycvHAOAWXs9WG8 BBrxCx70+msUI3m1ZJRX62PLQXVPhW24AfMM/ufFSDAhKAuPu1sJ6zsnBhrR4Iwil5ut GLmoi6UEL+EgQ6wer+A7yZYTQMtJwNeDwFcZ7zmxXwl7YDm02pJyFhNeb0EaflncurND AE7A== X-Received: by 10.194.11.7 with SMTP id m7mr35338867wjb.56.1441627683359; Mon, 07 Sep 2015 05:08:03 -0700 (PDT) Received: from nullptr.home.dirty-ice.org (188-143-119-255.pool.digikabel.hu. [188.143.119.255]) by smtp.gmail.com with ESMTPSA id gc8sm4806755wib.2.2015.09.07.05.08.02 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 07 Sep 2015 05:08:02 -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: Mon, 7 Sep 2015 14:08:08 +0200 Message-Id: <1308b58bb2b2d1a7f4d3f484ea4ed8d8697bb010.1441627176.git.DirtY.iCE.hu@gmail.com> X-Mailer: git-send-email 2.5.1 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::235 Cc: Jason Wang , Markus Armbruster , Stefan Hajnoczi Subject: [Qemu-devel] [PATCH 3/7] 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 9e4fe5d..d85b55b 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -2513,21 +2513,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', @@ -2535,22 +2539,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.