From nobody Mon Feb 9 13:57:18 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1530848264503913.6686210981322; Thu, 5 Jul 2018 20:37:44 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C924A307CF2D; Fri, 6 Jul 2018 03:37:36 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 433B67A51B; Fri, 6 Jul 2018 03:37:35 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 15B3A4A460; Fri, 6 Jul 2018 03:37:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w663bTRI032735 for ; Thu, 5 Jul 2018 23:37:29 -0400 Received: by smtp.corp.redhat.com (Postfix) id 985DE7A48F; Fri, 6 Jul 2018 03:37:29 +0000 (UTC) Received: from mx1.redhat.com (ext-mx13.extmail.prod.ext.phx2.redhat.com [10.5.110.42]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8BFCA7A4E0 for ; Fri, 6 Jul 2018 03:37:11 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E58963082155 for ; Fri, 6 Jul 2018 03:37:09 +0000 (UTC) Received: from localhost.localdomain ([58.56.27.130]) by mail.gmx.com (mrgmx101 [212.227.17.174]) with ESMTPSA (Nemesis) id 0LeiJ8-1ftHp62uf0-00qRZY; Fri, 06 Jul 2018 05:37:07 +0200 From: Shi Lei To: libvir-list@redhat.com Date: Fri, 6 Jul 2018 11:36:46 +0800 Message-Id: <1530848207-20731-3-git-send-email-shilei.massclouds@gmx.com> In-Reply-To: <1530848207-20731-1-git-send-email-shilei.massclouds@gmx.com> References: <1530848207-20731-1-git-send-email-shilei.massclouds@gmx.com> X-Provags-ID: V03:K1:f0sCB4Vuw8gXziUJaMzzyjRsQpldh8y1meydpwNHjmo0saMyri0 xpufAS7X+ugidppxKjsusgq09xXruM1vLsvPJYVvIn/JvrT/O+HdGEhdNx7a6VlJjpHXYqJ Oe6BjslDL36atO9C6C+7YZ+l1uoimybr8w9PxPEzPyjbLYEjpDjrl6f7lu+O7dKO05fQqXU 02JGuPwzcBS4ZlAtpNx0Q== X-UI-Out-Filterresults: notjunk:1;V01:K0:q/cNNMAqtDA=:TSvH2ngEHnV8qi+myGHjel Abq9vMQKrSXVb8O7/gt3PssVPweV0w/C3KBI0rK7FigqSPg/mihVEA2bsPyrVdRtyFuG/BQbE s+4OV0oROHoBDD1az+AIYlUM+346ZjTJ0bytoG60I1TdzDz2DKJtMzLR4DPNpiUGq0Jjd4+ww ELH+ts4bBnk1qhmydBuVtRkIUZWH37CRJ2ULB/QyYkcSUDlxaGKjZVfnBpn0ay+qcoPsaboNH 2qFikan3D/L6jbl5J9VRRHZBUrxiQFr8XBT8nOdqkWn4/ia2vkl3QJZEKXxJzuKXZcE/F6ML8 E7hmoOD7hO+JPOX25e5nCDTb+j4UDqpSOUg1Wh+lg1L85O1622sIyJIJu6GveykjIjxylf6jN hWx/Yvr9GpssqgX+vC521iR92NTQUXvU7s86Xzxsb+ij0qVth7ThSqv4jf1PmGMV+oo0w98LU P2v17OX7zyPN6wAw+XU1c54vNj66BeqqvnsOy37/6veZU8nzXGzQrXY9ZDBauSQrgjLJiRLk8 WZuKOpK1+a+DZ3VbtX3Wdj9iJ7Do2fCqbBqIfdyFiHB++rlnPnm2x4RrQI8qjcIw5no3+n/WQ XAwp1dAYiIHeUYAKUmn7pX6twqqnFrFqi9jDWkeOV8xdyxnmu9hlSJSnEsJ9vXaUtVNKKyrU7 Me8y1LbIhJoMFDWAuPaHGzJTWJwiLwDX51TaPstjKay2aOVOfAaAAttmSDTFsBpZ0TJJKX/zK 3ppzpeHzlwXR9JRu0QVBJL0zFKhEjMAD6s6aL9KFscclIWRV0RCuDgNOBv4= X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.42]); Fri, 06 Jul 2018 03:37:10 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.42]); Fri, 06 Jul 2018 03:37:10 +0000 (UTC) for IP:'212.227.17.20' DOMAIN:'mout.gmx.net' HELO:'mout.gmx.net' FROM:'shilei.massclouds@gmx.com' RCPT:'' X-RedHat-Spam-Score: -0.7 (FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS) 212.227.17.20 mout.gmx.net 212.227.17.20 mout.gmx.net X-Scanned-By: MIMEDefang 2.84 on 10.5.110.42 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Cc: Shi Lei Subject: [libvirt] [PATCH 2/3] support new forward mode of vlan for virtual network X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Fri, 06 Jul 2018 03:37:40 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 12 ++++--- src/conf/network_conf.h | 1 + src/network/bridge_driver.c | 80 +++++++++++++++++++++++++++++++++++++++++= ---- 3 files changed, 82 insertions(+), 11 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 630a87f..6e1de6c 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -50,7 +50,7 @@ VIR_ENUM_IMPL(virNetworkForward, VIR_NETWORK_FORWARD_LAST, "none", "nat", "route", "open", "bridge", "private", "vepa", "passthrough", - "hostdev") + "hostdev", "vlan") =20 VIR_ENUM_IMPL(virNetworkBridgeMACTableManager, VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LAST, @@ -1876,6 +1876,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) */ switch (def->forward.type) { case VIR_NETWORK_FORWARD_NONE: + case VIR_NETWORK_FORWARD_VLAN: break; =20 case VIR_NETWORK_FORWARD_ROUTE: @@ -1963,9 +1964,10 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) (def->forward.type !=3D VIR_NETWORK_FORWARD_NONE && def->forward.type !=3D VIR_NETWORK_FORWARD_NAT && def->forward.type !=3D VIR_NETWORK_FORWARD_ROUTE && - def->forward.type !=3D VIR_NETWORK_FORWARD_OPEN)) { + def->forward.type !=3D VIR_NETWORK_FORWARD_OPEN && + def->forward.type !=3D VIR_NETWORK_FORWARD_VLAN)) { virReportError(VIR_ERR_XML_ERROR, - _("mtu size only allowed in open, route, nat, " + _("mtu size only allowed in open, route, nat, vlan " "and isolated mode, not in %s (network '%s')"), virNetworkForwardTypeToString(def->forward.type), def->name); @@ -2474,6 +2476,7 @@ virNetworkDefFormatBuf(virBufferPtr buf, def->forward.type =3D=3D VIR_NETWORK_FORWARD_NAT || def->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE || def->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN || + def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN || def->bridge || def->macTableManager) { =20 virBufferAddLit(buf, "forward.type =3D=3D VIR_NETWORK_FORWARD_NONE || def->forward.type =3D=3D VIR_NETWORK_FORWARD_NAT || def->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE || - def->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN) { + def->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN || + def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN) { virBufferAsprintf(buf, " stp=3D'%s' delay=3D'%ld'", def->stp ? "on" : "off", def->delay); } diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 54c8ed1..47bb83e 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -53,6 +53,7 @@ typedef enum { VIR_NETWORK_FORWARD_VEPA, VIR_NETWORK_FORWARD_PASSTHROUGH, VIR_NETWORK_FORWARD_HOSTDEV, + VIR_NETWORK_FORWARD_VLAN, =20 VIR_NETWORK_FORWARD_LAST, } virNetworkForwardType; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index da3c32e..314f78c 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -451,6 +451,7 @@ networkUpdateState(virNetworkObjPtr obj, case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: case VIR_NETWORK_FORWARD_OPEN: + case VIR_NETWORK_FORWARD_VLAN: /* If bridge doesn't exist, then mark it inactive */ if (!(def->bridge && virNetDevExists(def->bridge) =3D=3D 1)) virNetworkObjSetActive(obj, false); @@ -2092,7 +2093,8 @@ networkRefreshDaemonsHelper(virNetworkObjPtr obj, ((def->forward.type =3D=3D VIR_NETWORK_FORWARD_NONE) || (def->forward.type =3D=3D VIR_NETWORK_FORWARD_NAT) || (def->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE) || - (def->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN))) { + (def->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN) || + (def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN))) { /* Only the three L3 network types that are configured by * libvirt will have a dnsmasq or radvd daemon associated * with them. Here we send a SIGHUP to an existing @@ -2131,7 +2133,8 @@ networkReloadFirewallRulesHelper(virNetworkObjPtr obj, if (virNetworkObjIsActive(obj) && ((def->forward.type =3D=3D VIR_NETWORK_FORWARD_NONE) || (def->forward.type =3D=3D VIR_NETWORK_FORWARD_NAT) || - (def->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE))) { + (def->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE) || + (def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN))) { /* Only three of the L3 network types that are configured by * libvirt need to have iptables rules reloaded. The 4th L3 * network type, forward=3D'open', doesn't need this because it @@ -2513,6 +2516,27 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr = driver, if (virNetDevBandwidthSet(def->bridge, def->bandwidth, true, true) < 0) goto err5; =20 + if (def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN) { + char vlanDevName[IFNAMSIZ]; + /* ifs[0].device.dev and vlan.tag[0] have been validated in networ= kValidate() */ + if (virNetDevCreateVLanDev(def->forward.ifs[0].device.dev, def->vl= an.tag[0], + vlanDevName, sizeof(vlanDevName)) < 0) + goto err5; + + if (virNetDevBridgeAddPort(def->bridge, vlanDevName) < 0) { + ignore_value(virNetDevDestroyVLanDev(def->forward.ifs[0].devic= e.dev, + def->vlan.tag[0])); + goto err5; + } + + if (virNetDevSetOnline(vlanDevName, true) < 0) { + ignore_value(virNetDevBridgeRemovePort(def->bridge, vlanDevNam= e)); + ignore_value(virNetDevDestroyVLanDev(def->forward.ifs[0].devic= e.dev, + def->vlan.tag[0])); + goto err5; + } + } + VIR_FREE(macTapIfName); VIR_FREE(macMapFile); =20 @@ -2576,6 +2600,18 @@ networkShutdownNetworkVirtual(virNetworkDriverStateP= tr driver, pid_t radvdPid; pid_t dnsmasqPid; =20 + if (def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN) { + char vlanDevName[IFNAMSIZ]; + ignore_value(virNetDevGetVLanDevName(def->forward.ifs[0].device.de= v, + def->vlan.tag[0], + vlanDevName, sizeof(vlanDevNa= me))); + + ignore_value(virNetDevSetOnline(vlanDevName, false)); + ignore_value(virNetDevBridgeRemovePort(def->bridge, vlanDevName)); + ignore_value(virNetDevDestroyVLanDev(def->forward.ifs[0].device.de= v, + def->vlan.tag[0])); + } + if (def->bandwidth) virNetDevBandwidthClear(def->bridge); =20 @@ -2719,6 +2755,7 @@ networkCreateInterfacePool(virNetworkDefPtr netdef) case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: case VIR_NETWORK_FORWARD_OPEN: + case VIR_NETWORK_FORWARD_VLAN: case VIR_NETWORK_FORWARD_LAST: /* by definition these will never be encountered here */ break; @@ -2817,6 +2854,7 @@ networkStartNetwork(virNetworkDriverStatePtr driver, case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: case VIR_NETWORK_FORWARD_OPEN: + case VIR_NETWORK_FORWARD_VLAN: if (networkStartNetworkVirtual(driver, obj) < 0) goto cleanup; break; @@ -2899,6 +2937,7 @@ networkShutdownNetwork(virNetworkDriverStatePtr drive= r, case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: case VIR_NETWORK_FORWARD_OPEN: + case VIR_NETWORK_FORWARD_VLAN: ret =3D networkShutdownNetworkVirtual(driver, obj); break; =20 @@ -3276,7 +3315,8 @@ networkValidate(virNetworkDriverStatePtr driver, if (def->forward.type =3D=3D VIR_NETWORK_FORWARD_NONE || def->forward.type =3D=3D VIR_NETWORK_FORWARD_NAT || def->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE || - def->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN) { + def->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN || + def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN) { =20 /* if no bridge name was given in the config, find a name * unused by any other libvirt networks and assign it. @@ -3447,7 +3487,8 @@ networkValidate(virNetworkDriverStatePtr driver, * a pool, and those using an Open vSwitch bridge. */ =20 - vlanAllowed =3D (def->forward.type =3D=3D VIR_NETWORK_FORWARD_HOSTDEV = || + vlanAllowed =3D (def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN || + def->forward.type =3D=3D VIR_NETWORK_FORWARD_HOSTDEV || def->forward.type =3D=3D VIR_NETWORK_FORWARD_PASSTHROUG= H || (def->forward.type =3D=3D VIR_NETWORK_FORWARD_BRIDGE && def->virtPortProfile && @@ -3530,6 +3571,28 @@ networkValidate(virNetworkDriverStatePtr driver, } } } + + if (def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN) { + if (virNetDevLoad8021Q() < 0) + return -1; + + if (def->forward.nifs !=3D 1 || + strlen(def->forward.ifs[0].device.dev) =3D=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid dev in " + "of network '%s' with forward mode=3D'%s'"), + def->name, virNetworkForwardTypeToString(def->f= orward.type)); + return -1; + } + if (def->vlan.nTags !=3D 1 || def->vlan.tag[0] >=3D 4096) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported vlan config. check " + "of network '%s' with forward mode=3D'%s'"), + def->name, virNetworkForwardTypeToString(def->f= orward.type)); + return -1; + } + } + return 0; } =20 @@ -3757,7 +3820,8 @@ networkUpdate(virNetworkPtr net, */ if (def->forward.type =3D=3D VIR_NETWORK_FORWARD_NONE || def->forward.type =3D=3D VIR_NETWORK_FORWARD_NAT || - def->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE) { + def->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE || + def->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN) { switch (section) { case VIR_NETWORK_SECTION_FORWARD: case VIR_NETWORK_SECTION_FORWARD_INTERFACE: @@ -4443,7 +4507,8 @@ networkAllocateActualDevice(virDomainDefPtr dom, if ((netdef->forward.type =3D=3D VIR_NETWORK_FORWARD_NONE) || (netdef->forward.type =3D=3D VIR_NETWORK_FORWARD_NAT) || (netdef->forward.type =3D=3D VIR_NETWORK_FORWARD_ROUTE) || - (netdef->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN)) { + (netdef->forward.type =3D=3D VIR_NETWORK_FORWARD_OPEN) || + (netdef->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN)) { /* for these forward types, the actual net type really *is* * NETWORK; we just keep the info from the portgroup in * iface->data.network.actual @@ -4701,7 +4766,8 @@ networkAllocateActualDevice(virDomainDefPtr dom, * mode) and openvswitch bridges. Otherwise log an error and * fail */ - if (!(actualType =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV || + if (!(netdef->forward.type =3D=3D VIR_NETWORK_FORWARD_VLAN || + actualType =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV || (actualType =3D=3D VIR_DOMAIN_NET_TYPE_DIRECT && virDomainNetGetActualDirectMode(iface) =3D=3D VIR_NETDEV_MACVLAN_MODE_PASSTHRU) || --=20 2.7.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list