Now that we have the ability to easily open connections to secondary drivers, eg network:///system, it is possible to reimplement the virDomainNetResolveActualType method in terms of the public API. This avoids the need to have the network driver provide a callback for it. Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> --- src/conf/domain_conf.c | 80 ++++++++++++++++++++++++++++++++++++++++----- src/conf/domain_conf.h | 11 +------ src/network/bridge_driver.c | 76 +----------------------------------------- 3 files changed, 74 insertions(+), 93 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fb732a0c2a..4f50547580 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -28823,7 +28823,6 @@ static virDomainNetNotifyActualDeviceImpl netNotify; static virDomainNetReleaseActualDeviceImpl netRelease; static virDomainNetBandwidthChangeAllowedImpl netBandwidthChangeAllowed; static virDomainNetBandwidthUpdateImpl netBandwidthUpdate; -static virDomainNetResolveActualTypeImpl netResolveActualType; void @@ -28831,15 +28830,13 @@ virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl allocate, virDomainNetNotifyActualDeviceImpl notify, virDomainNetReleaseActualDeviceImpl release, virDomainNetBandwidthChangeAllowedImpl bandwidthChangeAllowed, - virDomainNetBandwidthUpdateImpl bandwidthUpdate, - virDomainNetResolveActualTypeImpl resolveActualType) + virDomainNetBandwidthUpdateImpl bandwidthUpdate) { netAllocate = allocate; netNotify = notify; netRelease = release; netBandwidthChangeAllowed = bandwidthChangeAllowed; netBandwidthUpdate = bandwidthUpdate; - netResolveActualType = resolveActualType; } int @@ -28908,16 +28905,83 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface, return netBandwidthUpdate(iface, newBandwidth); } +/* virDomainNetResolveActualType: + * @iface: the original NetDef from the domain + * + * Looks up the network reference by iface, and returns the actual + * type of the connection without allocating any resources. + * + * Returns 0 on success, -1 on failure. + */ int virDomainNetResolveActualType(virDomainNetDefPtr iface) { - if (!netResolveActualType) { - virReportError(VIR_ERR_NO_SUPPORT, "%s", - _("Network device resolve type not available")); + virConnectPtr conn = NULL; + virNetworkPtr net = NULL; + char *xml = NULL; + virNetworkDefPtr def = NULL; + int ret = -1; + + if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) + return iface->type; + + if (iface->data.network.actual) + return iface->data.network.actual->type; + + if (!(conn = virGetConnectNetwork())) return -1; + + if (!(net = virNetworkLookupByName(conn, iface->data.network.name))) + goto cleanup; + + if (!(xml = virNetworkGetXMLDesc(net, 0))) + goto cleanup; + + if (!(def = virNetworkDefParseString(xml))) + goto cleanup; + + if ((def->forward.type == VIR_NETWORK_FORWARD_NONE) || + (def->forward.type == VIR_NETWORK_FORWARD_NAT) || + (def->forward.type == VIR_NETWORK_FORWARD_ROUTE) || + (def->forward.type == VIR_NETWORK_FORWARD_OPEN)) { + /* for these forward types, the actual net type really *is* + * NETWORK; we just keep the info from the portgroup in + * iface->data.network.actual + */ + ret = VIR_DOMAIN_NET_TYPE_NETWORK; + + } else if ((def->forward.type == VIR_NETWORK_FORWARD_BRIDGE) && + def->bridge) { + + /* <forward type='bridge'/> <bridge name='xxx'/> + * is VIR_DOMAIN_NET_TYPE_BRIDGE + */ + + ret = VIR_DOMAIN_NET_TYPE_BRIDGE; + + } else if (def->forward.type == VIR_NETWORK_FORWARD_HOSTDEV) { + + ret = VIR_DOMAIN_NET_TYPE_HOSTDEV; + + } else if ((def->forward.type == VIR_NETWORK_FORWARD_BRIDGE) || + (def->forward.type == VIR_NETWORK_FORWARD_PRIVATE) || + (def->forward.type == VIR_NETWORK_FORWARD_VEPA) || + (def->forward.type == VIR_NETWORK_FORWARD_PASSTHROUGH)) { + + /* <forward type='bridge|private|vepa|passthrough'> are all + * VIR_DOMAIN_NET_TYPE_DIRECT. + */ + + ret = VIR_DOMAIN_NET_TYPE_DIRECT; + } - return netResolveActualType(iface); + cleanup: + virNetworkDefFree(def); + VIR_FREE(xml); + virObjectUnref(conn); + virObjectUnref(net); + return ret; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 6cd81ef2de..7b450ce8f1 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3476,17 +3476,13 @@ typedef int (*virDomainNetBandwidthUpdateImpl)(virDomainNetDefPtr iface, virNetDevBandwidthPtr newBandwidth); -typedef int -(*virDomainNetResolveActualTypeImpl)(virDomainNetDefPtr iface); - void virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl allocate, virDomainNetNotifyActualDeviceImpl notify, virDomainNetReleaseActualDeviceImpl release, virDomainNetBandwidthChangeAllowedImpl bandwidthChangeAllowed, - virDomainNetBandwidthUpdateImpl bandwidthUpdate, - virDomainNetResolveActualTypeImpl resolveActualType); + virDomainNetBandwidthUpdateImpl bandwidthUpdate); int virDomainNetAllocateActualDevice(virDomainDefPtr dom, @@ -3513,11 +3509,6 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface, virNetDevBandwidthPtr newBandwidth) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -/* XXX this is a nasty hack and should be removed. It should - * be by via public API by fetching XML and parsing it. Not - * easy right now as code paths in QEMU reying on this don't - * have a virConnectPtr handy. - */ int virDomainNetResolveActualType(virDomainNetDefPtr iface) ATTRIBUTE_NONNULL(1); diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index dd6e3402ea..898c946101 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -5146,79 +5146,6 @@ networkReleaseActualDevice(virDomainDefPtr dom, } - -/* networkResolveActualType: - * @iface: the original NetDef from the domain - * - * Looks up the network reference by iface, and returns the actual - * type of the connection without allocating any resources. - * - * Returns 0 on success, -1 on failure. - */ -static int -networkResolveActualType(virDomainNetDefPtr iface) -{ - virNetworkDriverStatePtr driver = networkGetDriver(); - virNetworkObjPtr obj = NULL; - virNetworkDefPtr netdef = NULL; - int ret = -1; - - if (!driver || iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) - return iface->type; - - if (iface->data.network.actual) - return iface->data.network.actual->type; - - obj = virNetworkObjFindByName(driver->networks, iface->data.network.name); - if (!obj) { - virReportError(VIR_ERR_NO_NETWORK, - _("no network with matching name '%s'"), - iface->data.network.name); - return -1; - } - netdef = virNetworkObjGetDef(obj); - - if ((netdef->forward.type == VIR_NETWORK_FORWARD_NONE) || - (netdef->forward.type == VIR_NETWORK_FORWARD_NAT) || - (netdef->forward.type == VIR_NETWORK_FORWARD_ROUTE) || - (netdef->forward.type == VIR_NETWORK_FORWARD_OPEN)) { - /* for these forward types, the actual net type really *is* - * NETWORK; we just keep the info from the portgroup in - * iface->data.network.actual - */ - ret = VIR_DOMAIN_NET_TYPE_NETWORK; - - } else if ((netdef->forward.type == VIR_NETWORK_FORWARD_BRIDGE) && - netdef->bridge) { - - /* <forward type='bridge'/> <bridge name='xxx'/> - * is VIR_DOMAIN_NET_TYPE_BRIDGE - */ - - ret = VIR_DOMAIN_NET_TYPE_BRIDGE; - - } else if (netdef->forward.type == VIR_NETWORK_FORWARD_HOSTDEV) { - - ret = VIR_DOMAIN_NET_TYPE_HOSTDEV; - - } else if ((netdef->forward.type == VIR_NETWORK_FORWARD_BRIDGE) || - (netdef->forward.type == VIR_NETWORK_FORWARD_PRIVATE) || - (netdef->forward.type == VIR_NETWORK_FORWARD_VEPA) || - (netdef->forward.type == VIR_NETWORK_FORWARD_PASSTHROUGH)) { - - /* <forward type='bridge|private|vepa|passthrough'> are all - * VIR_DOMAIN_NET_TYPE_DIRECT. - */ - - ret = VIR_DOMAIN_NET_TYPE_DIRECT; - - } - - virNetworkObjEndAPI(&obj); - return ret; -} - - /** * networkCheckBandwidth: * @net: network QoS @@ -5717,8 +5644,7 @@ networkRegister(void) networkNotifyActualDevice, networkReleaseActualDevice, networkBandwidthChangeAllowed, - networkBandwidthUpdate, - networkResolveActualType); + networkBandwidthUpdate); return 0; } -- 2.14.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list