How to setup Wifibox on FreeSBD

How to Setup Wifibox on FreeBSD to Help Fix Slow Wifi

(work in progress).

The built-in intel wifi drivers whilst they do work, are pretty slow. I was getting a maximum throughput of 12Mbps, after implementing wifibox I was getting much more usable speeds.

What is Wifibox?

Wifibox deploys a Linux guest (based in alpine Linux) to drive a wireless networking card on the FreeBSD host system with the help of PCI pass-through.

This guide has been tested on FreeBSD 13.1

Installing Wifibox

Ensure operating system is and packages are up-to-date

Update operating system:

$ doas freebsd-update fetch install

Update packages:

$ doas pkg update
$ doas pkg upgrade

Install Wifibox from packages

$ doas pkg install wifibox

Configure Wifibox

Configure bhyve passthrough for wireless adapter

In order to configure bhyve wifibox we need to configure PCI pass through for the wifi adapter, it can also be helpful to enable the console.

We need to get he address of the wirelss adapter to pass through:

$ pciconf -lv | grep -B2 -i wireless

Which will give output similar to:

iwm0@pci0:2:0:0:        class=0x028000 rev=0x59 hdr=0x00 vendor=0x8086 device=0x095a subvendor=0x8086 subdevice=0x5410
    vendor     = 'Intel Corporation'
    device     = 'Wireless 7265'

We can see from the above output in our example, the address of our card is pci0:2:0:0:, so the address we need for the pci card is 2/0/0

Edit the file /usr/local/etc/wifbox/bhyve.conf and update the passthru parametre:

console=yes
passthru=2/0/0

Where the 2/0/0 in our case is the output from the previous command.

Configure WPA Supplicant

In order for wifibox it needs access to a wpa_supplicant.conf file know which networks to connect to, for this we’re going to link our existing /etc/wpa_supplicant.conf:

$ cd /usr/local/etc/wifibox/wpa_supplicant
$ doas mv wpa_supplicant.conf wpa_supplicant.bak
$ doas ln /etc/wpa_supplicant.conf ./

Edit /etc/rc.conf and add:

### prevent intel wireless drivers loading
devmatch_enable="YES"
devmatch_blocklist="if_iwm if_iwlwifi"

### start wifibox and configure interfaces
wifibox_enable="YES"
ifconfig_wifibox0="SYNCDHCP"
background_dhclient_wifibox0="YES"
defaultroute_delay="0"

For some reason on reboot the the wifibox0 interface fails to get an IP from DHCP, seems to be because the interface doesn’t exist before the bhyve VM is started, work around until I find a solution:

Edit `/etc/rc.local’:

/sbin/dhclient wifibox0

Reboot, all should be good

Almost ok, try running another virtual machine or a jail.

I got jails to work utilizing bastille, and using the NAT configuration. But with bhyve + vm-bhyve , creating the default switch is problematic to say the least.

I’ve avoided the tap0 recreation by enforcing another tap#. But the problem comes when trying to bind the wifibox0 interface because it is a bridge type.

Now I have been trying a few things to try and get from the default switch to some virtual NAT that will eventually talk to the internet.

It is great that we can (better) use these cards that have limited support (or none) under FreeBSD.

Iwlwifi devices run significantly better under wifi box.