
Laine Stump wrote:
On 06/11/2014 12:25 AM, Jim Fehlig wrote:
Add support for <interface type='network'> in the libxl driver.
Signed-off-by: Jim Fehlig <jfehlig@suse.com> ---
V2: Support both libvirt's traditional managed networks and libvirt networks that use an existing host bridge.
src/libxl/libxl_conf.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index cec37d6..9c453d8 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -874,6 +874,7 @@ libxlMakeNic(virDomainDefPtr def, libxl_device_nic *x_nic) { bool ioemu_nic = STREQ(def->os.type, "hvm"); + virDomainNetType actual_type = virDomainNetGetActualType(l_nic);
/* TODO: Where is mtu stored? * @@ -899,16 +900,60 @@ libxlMakeNic(virDomainDefPtr def, if (VIR_STRDUP(x_nic->ifname, l_nic->ifname) < 0) return -1;
- switch (l_nic->type) { + switch (actual_type) { case VIR_DOMAIN_NET_TYPE_BRIDGE: - if (VIR_STRDUP(x_nic->bridge, l_nic->data.bridge.brname) < 0) + if (VIR_STRDUP(x_nic->bridge, + virDomainNetGetActualBridgeName(l_nic)) < 0) return -1; /* fallthrough */ case VIR_DOMAIN_NET_TYPE_ETHERNET: if (VIR_STRDUP(x_nic->script, l_nic->script) < 0) return -1; break; - default: + case VIR_DOMAIN_NET_TYPE_NETWORK: + { + bool fail = false; + char *brname = NULL; + virNetworkPtr network; + virConnectPtr conn; + virErrorPtr errobj; + + if (!(conn = virConnectOpen("xen:///system"))) + return -1;
(The conn is necessary in order to call the functions that retrieve the bridge device name for the network)
One difference in the way that qemu deals with this is that in most cases the higher level function already has a conn ptr, and that is passed down the call stack to the user. There is one case where this doesn't happen - the autostart of a domain. In that case, qemu calls virConnectOpen(cfg->uri) to get a conn.
Right, and that depends on whether running privileged or not. From qemu_conf.c, virQEMUDriverConfigNew: cfg->uri = privileged ? "qemu:///system" : "qemu:///session";
In this case, you are always creating a new conn, even when one may already exist a few layers up the call stack,
I originally looked into passing conn to libxlMakeNic, but it is actually quite a bit of code refactoring. I think that should be done in conjunction with decomposing libxlDomainStart a bit. Currently that function builds the domain config and handles the details of starting the domain. I'd like to pull the build part out, allowing a cleaner approach to passing conn where needed. E.g. I could see conn being used in libxlMakeDisk some day.
and the conn you create is using the hardcoded "xen:///system" rather than taking something from config.
As long as this is okay with you, it's okay with me. I just wonder about two things:
I think it is okay.
1) does xen support non-privileged libvirt, and if so what would happen in this case (I suppose it would just fail due to lack of authorization).
Only supports privileged.
2) is the uri configurable anywhere, as it is for libvirt?
Do you mean s/libvirt/the qemu driver/ ? As mentioned above, cfg->uri depends on privileged in the qemu driver? For the libxl driver, privileged is always true.
+ + if (!(network = + virNetworkLookupByName(conn, l_nic->data.network.name))) { + virObjectUnref(conn); + return -1; + } + + if ((brname = virNetworkGetBridgeName(network))) { + if (VIR_STRDUP(x_nic->bridge, brname) < 0) + fail = true; + } else { + fail = true; + } + + VIR_FREE(brname); + + /* Preserve any previous failure */ + errobj = virSaveLastError(); + virNetworkFree(network); + virSetError(errobj); + virFreeError(errobj); + virObjectUnref(conn); + if (fail) + return -1; + break; + } + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_DIRECT: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("libxenlight does not support network device type %s"), virDomainNetTypeToString(l_nic->type));
ACK, pending the answers to the above questions.
Thanks for asking the questions, which made me rethink this and feel confident it is okay :-). I'll push this, along with 2/2. Regards, Jim