From nobody Wed May 14 21:46:56 2025 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 1517415767526634.1910109960045; Wed, 31 Jan 2018 08:22:47 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E29298E714; Wed, 31 Jan 2018 16:22:45 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A284660473; Wed, 31 Jan 2018 16:22:45 +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 560CF18033E7; Wed, 31 Jan 2018 16:22:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w0VGMiH9008518 for ; Wed, 31 Jan 2018 11:22:44 -0500 Received: by smtp.corp.redhat.com (Postfix) id 1EB3A60499; Wed, 31 Jan 2018 16:22:44 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3155F17C52; Wed, 31 Jan 2018 16:22:31 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Wed, 31 Jan 2018 16:21:29 +0000 Message-Id: <20180131162137.17939-8-berrange@redhat.com> In-Reply-To: <20180131162137.17939-1-berrange@redhat.com> References: <20180131162137.17939-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 07/15] qemu: replace networkGetNetworkAddress with public API calls 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: , Content-Type: text/plain; charset="utf-8" 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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Wed, 31 Jan 2018 16:22:46 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 The QEMU driver calls into the network driver to get the first IP address of the network. This information is readily available via the formal public API by fetching the XML doc and then parsing it. Signed-off-by: Daniel P. Berrang=C3=A9 --- src/network/bridge_driver.c | 98 ----------------------------------------- src/network/bridge_driver.h | 6 --- src/qemu/qemu_process.c | 104 ++++++++++++++++++++++++++++++++++++++++= ---- 3 files changed, 96 insertions(+), 112 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index a0e45d1f65..ee200f1343 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -5104,104 +5104,6 @@ networkReleaseActualDevice(virDomainDefPtr dom, } =20 =20 -/* - * networkGetNetworkAddress: - * @netname: the name of a network - * @netaddr: string representation of IP address for that network. - * - * Attempt to return an IP address associated with the named - * network. If a libvirt virtual network, that will be provided in the - * configuration. For host bridge and direct (macvtap) networks, we - * must do an ioctl to learn the address. - * - * Note: This function returns the first IP address it finds. It might - * be useful if it was more flexible, but the current use (getting a - * listen address for qemu's vnc/spice graphics server) can only use a - * single address anyway. - * - * Returns 0 on success, and puts a string (which must be free'd by - * the caller) into *netaddr. Returns -1 on failure or -2 if - * completely unsupported. - */ -int -networkGetNetworkAddress(const char *netname, - char **netaddr) -{ - virNetworkDriverStatePtr driver =3D networkGetDriver(); - int ret =3D -1; - virNetworkObjPtr obj; - virNetworkDefPtr netdef; - virNetworkIPDefPtr ipdef; - virSocketAddr addr; - virSocketAddrPtr addrptr =3D NULL; - char *dev_name =3D NULL; - - *netaddr =3D NULL; - obj =3D virNetworkObjFindByName(driver->networks, netname); - if (!obj) { - virReportError(VIR_ERR_NO_NETWORK, - _("no network with matching name '%s'"), - netname); - goto cleanup; - } - netdef =3D virNetworkObjGetDef(obj); - - switch (netdef->forward.type) { - case VIR_NETWORK_FORWARD_NONE: - case VIR_NETWORK_FORWARD_NAT: - case VIR_NETWORK_FORWARD_ROUTE: - case VIR_NETWORK_FORWARD_OPEN: - ipdef =3D virNetworkDefGetIPByIndex(netdef, AF_UNSPEC, 0); - if (!ipdef) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("network '%s' doesn't have an IP address"), - netdef->name); - goto cleanup; - } - addrptr =3D &ipdef->address; - break; - - case VIR_NETWORK_FORWARD_BRIDGE: - if ((dev_name =3D netdef->bridge)) - break; - /* - * fall through if netdef->bridge wasn't set, since that is - * macvtap bridge mode network. - */ - ATTRIBUTE_FALLTHROUGH; - - case VIR_NETWORK_FORWARD_PRIVATE: - case VIR_NETWORK_FORWARD_VEPA: - case VIR_NETWORK_FORWARD_PASSTHROUGH: - if ((netdef->forward.nifs > 0) && netdef->forward.ifs) - dev_name =3D netdef->forward.ifs[0].device.dev; - - if (!dev_name) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("network '%s' has no associated interface or = bridge"), - netdef->name); - goto cleanup; - } - break; - } - - if (dev_name) { - if (virNetDevIPAddrGet(dev_name, &addr) < 0) - goto cleanup; - addrptr =3D &addr; - } - - if (!(addrptr && - (*netaddr =3D virSocketAddrFormat(addrptr)))) { - goto cleanup; - } - - ret =3D 0; - cleanup: - virNetworkObjEndAPI(&obj); - return ret; -} - =20 /* networkGetActualType: * @dom: domain definition that @iface belongs to diff --git a/src/network/bridge_driver.h b/src/network/bridge_driver.h index 098f9e5c5b..6fa6432d13 100644 --- a/src/network/bridge_driver.h +++ b/src/network/bridge_driver.h @@ -36,11 +36,6 @@ networkRegister(void); =20 # if WITH_NETWORK =20 -int -networkGetNetworkAddress(const char *netname, - char **netaddr) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); - int networkGetActualType(virDomainNetDefPtr iface) ATTRIBUTE_NONNULL(1); @@ -55,7 +50,6 @@ networkDnsmasqConfContents(virNetworkObjPtr obj, # else /* Define no-op replacements that don't drag in any link dependencies. */ # define networkGetActualType(iface) (iface->type) -# define networkGetNetworkAddress(netname, netaddr) (-2) # define networkDnsmasqConfContents(network, pidfile, configstr, \ dctx, caps) 0 =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index c943407b58..d9dd919fcc 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -60,7 +60,6 @@ #include "domain_audit.h" #include "domain_nwfilter.h" #include "locking/domain_lock.h" -#include "network/bridge_driver.h" #include "viruuid.h" #include "virprocess.h" #include "virtime.h" @@ -4286,9 +4285,95 @@ qemuProcessGraphicsAllocatePorts(virQEMUDriverPtr dr= iver, return 0; } =20 +static int +qemuProcessGetNetworkAddress(virConnectPtr conn, + const char *netname, + char **netaddr) +{ + int ret =3D -1; + virNetworkPtr net; + virNetworkDefPtr netdef =3D NULL; + virNetworkIPDefPtr ipdef; + virSocketAddr addr; + virSocketAddrPtr addrptr =3D NULL; + char *dev_name =3D NULL; + char *xml =3D NULL; + + *netaddr =3D NULL; + net =3D virNetworkLookupByName(conn, netname); + if (!net) + goto cleanup; + + xml =3D virNetworkGetXMLDesc(net, 0); + if (!xml) + goto cleanup; + + netdef =3D virNetworkDefParseString(xml); + if (!netdef) + goto cleanup; + + switch (netdef->forward.type) { + case VIR_NETWORK_FORWARD_NONE: + case VIR_NETWORK_FORWARD_NAT: + case VIR_NETWORK_FORWARD_ROUTE: + case VIR_NETWORK_FORWARD_OPEN: + ipdef =3D virNetworkDefGetIPByIndex(netdef, AF_UNSPEC, 0); + if (!ipdef) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("network '%s' doesn't have an IP address"), + netdef->name); + goto cleanup; + } + addrptr =3D &ipdef->address; + break; + + case VIR_NETWORK_FORWARD_BRIDGE: + if ((dev_name =3D netdef->bridge)) + break; + /* + * fall through if netdef->bridge wasn't set, since that is + * macvtap bridge mode network. + */ + ATTRIBUTE_FALLTHROUGH; + + case VIR_NETWORK_FORWARD_PRIVATE: + case VIR_NETWORK_FORWARD_VEPA: + case VIR_NETWORK_FORWARD_PASSTHROUGH: + if ((netdef->forward.nifs > 0) && netdef->forward.ifs) + dev_name =3D netdef->forward.ifs[0].device.dev; + + if (!dev_name) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("network '%s' has no associated interface or = bridge"), + netdef->name); + goto cleanup; + } + break; + } + + if (dev_name) { + if (virNetDevIPAddrGet(dev_name, &addr) < 0) + goto cleanup; + addrptr =3D &addr; + } + + if (!(addrptr && + (*netaddr =3D virSocketAddrFormat(addrptr)))) { + goto cleanup; + } + + ret =3D 0; + cleanup: + virNetworkDefFree(netdef); + virObjectUnref(net); + VIR_FREE(xml); + return ret; +} + =20 static int -qemuProcessGraphicsSetupNetworkAddress(virDomainGraphicsListenDefPtr glist= en, +qemuProcessGraphicsSetupNetworkAddress(virConnectPtr conn, + virDomainGraphicsListenDefPtr glist= en, const char *listenAddr) { int rc; @@ -4300,7 +4385,7 @@ qemuProcessGraphicsSetupNetworkAddress(virDomainGraph= icsListenDefPtr glisten, return 0; } =20 - rc =3D networkGetNetworkAddress(glisten->network, &glisten->address); + rc =3D qemuProcessGetNetworkAddress(conn, glisten->network, &glisten->= address); if (rc <=3D -2) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("network-based listen isn't possible, " @@ -4315,7 +4400,8 @@ qemuProcessGraphicsSetupNetworkAddress(virDomainGraph= icsListenDefPtr glisten, =20 =20 static int -qemuProcessGraphicsSetupListen(virQEMUDriverPtr driver, +qemuProcessGraphicsSetupListen(virConnectPtr conn, + virQEMUDriverPtr driver, virDomainGraphicsDefPtr graphics, virDomainObjPtr vm) { @@ -4373,7 +4459,8 @@ qemuProcessGraphicsSetupListen(virQEMUDriverPtr drive= r, if (glisten->address || !listenAddr) continue; =20 - if (qemuProcessGraphicsSetupNetworkAddress(glisten, + if (qemuProcessGraphicsSetupNetworkAddress(conn, + glisten, listenAddr) < 0) goto cleanup; break; @@ -4402,7 +4489,8 @@ qemuProcessGraphicsSetupListen(virQEMUDriverPtr drive= r, =20 =20 static int -qemuProcessSetupGraphics(virQEMUDriverPtr driver, +qemuProcessSetupGraphics(virConnectPtr conn, + virQEMUDriverPtr driver, virDomainObjPtr vm, unsigned int flags) { @@ -4414,7 +4502,7 @@ qemuProcessSetupGraphics(virQEMUDriverPtr driver, for (i =3D 0; i < vm->def->ngraphics; i++) { graphics =3D vm->def->graphics[i]; =20 - if (qemuProcessGraphicsSetupListen(driver, graphics, vm) < 0) + if (qemuProcessGraphicsSetupListen(conn, driver, graphics, vm) < 0) goto cleanup; } =20 @@ -5570,7 +5658,7 @@ qemuProcessPrepareDomain(virConnectPtr conn, goto cleanup; =20 VIR_DEBUG("Setting graphics devices"); - if (qemuProcessSetupGraphics(driver, vm, flags) < 0) + if (qemuProcessSetupGraphics(conn, driver, vm, flags) < 0) goto cleanup; =20 VIR_DEBUG("Create domain masterKey"); --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list