[libvirt] [PATCH] in vbox driver, interface type bridge should really be type ethernet

Daniel P. Berrange berrange at redhat.com
Wed Oct 7 20:38:38 UTC 2009


On Fri, Oct 02, 2009 at 12:37:30PM +0200, Florian Vichot wrote:
> Hey Pritesh,
> 
> > If you check http://libvirt.org/formatdomain.html#elementsNICS then it is not 
> > much clear if the type bridged is more suitable or ethernet cause the bridged 
> > section says: "This assumes there is a bridge device on the host which has one 
> > or more of the hosts physical NICs enslaved" and which is what vbox is doing 
> > if i have got the interpretation right.
> 
> Well, IIRC, it's not quite what vbox is doing. What libvirt provides
> with the bridge mode is this:
> 
>                    VM <-> tun <-> bridge
> 
> with the bridge designated by the <source bridge=''> and the tun
> designated either automatically by libvirt using a vnetN format, or by
> the user using <target dev=''>. That way, one can start a second domain,
> with the same <source bridge=''> and either specify <target dev=''> or
> let libvirt automatically create another tun, and have it added to the
> bridge, allowing communication through the bridge with the first domain
> as if they where connected through a hardware switch.
> 
> What vbox does in the other hand in its oddly named "Bridged networking"
> mode is simply this:
> 
>                     VM <-> interface
> 
> with the VM acting as if it's connected to the interface (which can be
> anything) through some kernel module magic. But no bridge is created,
> used or even necessary. So I believe type "ethernet" is more suited.
> Mostly for semantic reason really, because in this mode, there is no use
> for the <target dev=''>; and <source bridge=''> is misleading, as the
> value of the "bridge" attribute does not need to be a bridge.

I don't think there's a particularly easy answer here, since there are a
few ways to look at it.	From a POV of 'what does it do', the type=bridge
mode implements a layer-2 (ie ethernet) bridge between the guest and
the LAN.  From a POV of	'how is it done', the type=bridge network mode
could be considered to be a bridge device, with	a NIC backend (of some
type) enslaved.	For QEMU we enslave TAP	devices. Xen enslaves its custom
device.	LXC enslaves veth devices.

The type=ethernet mode in libvirt has pretty ill/un-defined semantics, it
may or may not be doing ethernet layer bridging, though the name strongly
implies	it. There is certainly no requirement that a bridge device be
involved, and the actual setup process is really hypervisor defined with
no rules. With Xen, the type=ethernet mode, could in fact be doing a
layer-3 bridge (IP layer) with proxy_arp.


As you point out, if there is no bridge	device,	or TAP device like thing
involved, then type=bridge has no info available to put in the <target>
and <source> elements. 	I don't	think this particularly	matters	for the
<target> element, since	that's always been pretty optional & not really
critical for the process. For the <source> element I think its nice that
most of	our impls use that as the bridge device	name, though you could
certainly make a reasonable argument that the physical NIC name	would be
applicable here	too if no Linux	type bridge device were	involved. I have
a feeling that Xen on Solaris does this, since I don't think they have a
Linux style bridge involved. I believe VMWare's bridging mode works in
a similar way to Virtualbox, ie not using Linux bridges/tap devs, doing
it natively inside the kernel.

So back to your original question - is the current VirtualBox bridge
impl 'correct'. If it is doing ethernet layer bridging, then I think
there is a strong argument that it is reasonably compliant. If there
is a way todo  bridging with VirtualBox + a bridge + TAP device (or 
equivalent), then that would definitely want to use type=bridge.

Thus the main question is whether to allow both modes to use type=bridge,
or to change the existing mode to use type=ethernet. If we did the former,
then one option is to add an extra attribute to the <source> device so
you can indicate whether the source is a real bridge device, or a NIC
with bridging done by magic inside the kernel.

I think I'd have a slight preference for the latter, since I like the fact
that type=bridge is explicitly about layer-2 bridging, while type=ethernet
is pretty much a generic catch-all, do-anything network mode.

It is probably best if you just go ahead and implement your idea for doing
Virtualbox bridging with a real bridge + tap device, while we consider the
XML modelling problem in parallel.

Regards,
Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list