[libvirt] [PATCH V2 1/2] libxl: support interface type=network
Jim Fehlig
jfehlig at suse.com
Thu Jun 19 21:41:00 UTC 2014
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 at 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
More information about the libvir-list
mailing list