Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 Aug 2009 20:00:29 +0200
From:      Fredrik Lindberg <fli@shapeshifter.se>
To:        Robert Watson <rwatson@FreeBSD.org>
Cc:        freebsd-emulation@freebsd.org
Subject:   Re: VirtualBox bridged adapter (vboxnetflt)
Message-ID:  <4A9426BD.1050503@shapeshifter.se>
In-Reply-To: <alpine.BSF.2.00.0908251732270.61512@fledge.watson.org>
References:  <4A8EB3D2.7010109@shapeshifter.se> <alpine.BSF.2.00.0908251732270.61512@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Robert Watson wrote:
> 
> On Fri, 21 Aug 2009, Fredrik Lindberg wrote:
> 
>> I've started working on the missing bits of the FreeBSD network 
>> implementation in VirtualBox.
>>
>> I now have a working vboxnetflt.ko driver that allows automatic 
>> bridged networking in VirtualBox (probably what most people want). 
>> This allows guests to automatically bridge with your existing network 
>> adapter providing seamless network access.
>>
>> Work on host-only adapter mode is in progress (this should not be 
>> confused with host-interface in previous vbox 2.x releases).
> 
> Hi Fredrik:
> 
> The technical approach you've taken here is a bit unusual and 
> potentially quite fragile -- replacing the method pointers on struct 
> ifnet's maintained by other drivers and "borrowing" spare fields is 
> likely going to prove problematic in the future (and, in fact, already).
> 
> It looks like a lot of what the driver is trying to accomplish can 
> already be done entirely from userspace using bpf(4): taking a tee of 
> incoming frames arriving at the NIC, perhaps selecting down to ones to 
> specific ethernet addresses, taking the card into and out of promiscuous 
> mode, and injecting frames into the output path, are exactly what BPF is 
> designed to support.  I was wondering if you'd looked at this approach 
> as an alternative to a custom kernel driver?
> 
> Robert
> 

That's why I ended my mail by saying it's "hackish" (which usually mean
fragile) :)

vboxnetflt is a driver that exists for all operating systems
capable of running in virtualbox host mode. It consists of both
operating system independent code and operating system dependent code.
This together forms a kernel module (on all host OS) which in turn
depend on symbols in the other kernel support driver (vboxdrv.ko).

So, unless we re-write a lot of the generic code in VBox, this
have to be done in the kernel (disclaimer, I haven't really
looked on what would have to be changed, but it's not very
attractive to start messing with their generic code).

I've actually looked at BPF..but didn't find a clean API from the
kernel (maybe I just don't know where to look). (Opening /dev/bpf
from the kernel seemed just as fragile as the current approach if it's 
even possible).

The third approach is to add vbox glue to ifnet and ether_output,
but that is just as bad (accounting for third party software in
the kernel is just ugly).

At least Darwin seems to have a "filtering" mechanism that allows
you to manipulate mbufs before they are sent to the interface.
Linux seems to have a similar mechanism, but not as flexible as
the one in Darwin.

I was thinking along the same lines for FreeBSD. Implementing generic
hooks in the input/output path that could be used for vbox, if_bridge,
carp, etc, instead of the current hard coded calls in
ether_{output,input}. This could also have the effect of removing module 
specific glue from struct ifnet.
Anything worth pursuing ?

Fredrik Lindberg




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4A9426BD.1050503>