I really wanted the name of this article does not sound dramatically but I was not able to invent any other title … none the less the wireless/WiFi topic can be problematic on the FreeBSD land. Its a known feat of FreeBSD that is does its job best at the server room and that laptop/desktop based configurations tend to need some ‘love’ to be usable. The worst thing of that part is lack of WiFi kernel drivers at all or slower then possible speed like 802.11g on 802.11n capable chips – often as old as 11 years old Intel Ultimate-N 6300 450Mbps card that runs only at 802.11g speed on FreeBSD. The aim of this article is to show you the alternatives and possibilities when it comes to wireless and/or WiFi problems that you may encounter on FreeBSD UNIX system.
Replace Unsupported Hardware
Assuming your laptop came with WiFi card that is not supported at all by FreeBSD drivers – one of the options can be to replace the mSATA or M.2 card with the supported one. It may be difficult because of BIOS blacklisting/whitelisting so there is possibility that it may be needed to flash your laptop/system with a hacked BIOS that does not have this blacklisting/whitelisting and allows ALL possible chips to be installed into it. This may be sometimes not possible of course and it really PITA that some/many manufacturers create such blacklisting/whitelisting bullshit without any reasonable reason then money heist.
Tiny USB WiFi Dongle
If your WiFi card is not supported at all and its not possible to replace it with mSATA and/or M.2 WiFi chip then you may use some tiny USB WiFi dongle with – for example – Realtek RTL8188CUS chip – which is supported on FreeBSD. While the chip itself is 802.11n 150Mbps capable the FreeBSD drivers only support 802.11g mode on it – but its still better then none connectivity at all.
Such tiny USB dongle can be shown below.
The more in depth article about that Realtek RTL8188CUS chip is available here – Realtek RTL8188CUS – USB 802.11n WiFi Review – in one of my earlier articles.
Smartphone USB Tethering
One of the alternative possibilities is to use your smartphone with USB cable to provide the Internet connection. The main benefit of this approach is that you probably always have your smartphone with you anyway. The only additional needed/missing part is the USB cable (which is not that a problem anyway once you order it). This comes handy in more then one way. The first and obvious way is to just use that smartphone with USB cable attached to your FreeBSD to provide Internet connection no matter if that smartphone provides that connection using LTE/4G connection or WiFi connection to some WiFi hotspot. Another reason why this setup comes handy is when you have your WiFi chipset supported … and still are not able to connect to some WiFi hotspot. Recently I was at my buddy’s home where he had open WiFi network available. My phone connected to it without a problem but FreeBSD with 11 years old Intel 6300 card … was not able to connect to it no matter what. To be precise the wpa_supplicant(8) showed the CTRL-EVENT-CONNECTED status but the dhclient was not able to get the IP for some reason. This is where my smartphone came handy as it was able to connect to that open unencrypted network and FreeBSD used it by the USB tethering method. Below I will show you how to use the USB tethering on FreeBSD.
The first thing is to attach your smartphone by USB cable to your FreeBSD system. After you have done that you will need to configure your smartphone to enable USB tethering. Below you will find such configuration for Android smartphone.
After you have chosen these settings you wull see the ue0 device in your ifconfig(8) interfaces listing.
% ifconfig em0: flags=8c22<broadcast,oactive,simplex,multicast> metric 0 mtu 1500 options=481249b<rxcsum,txcsum,vlan_mtu,vlan_hwtagging,vlan_hwcsum,lro,wol_magic,vlan_hwfilter,nomap> ether f0:de:f1:68:bc:ab media: Ethernet autoselect status: no carrier nd6 options=29<performnud,ifdisabled,auto_linklocal> lo0: flags=8049<up,loopback,running,multicast> metric 0 mtu 16384 options=680003<rxcsum,txcsum,linkstate,rxcsum_ipv6,txcsum_ipv6> inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1/8 groups: lo nd6 options=21<performnud,auto_linklocal> vboxnet0: flags=8802<broadcast,simplex,multicast> metric 0 mtu 1500 ether 0a:00:27:00:00:00 media: Ethernet autoselect status: active nd6 options=29<performnud,ifdisabled,auto_linklocal> ue0: flags=8802<broadcast,simplex,multicast> metric 0 mtu 1500 ether 02:2a:71:6a:08:01 nd6 options=29<performnud,ifdisabled,auto_linklocal>
The next (and last) step is to use dhclient(8) daemon to acquire the IP address using DHCP. Here is the command I used.
# dhclient ue0 DHCPDISCOVER on ue0 to 255.255.255.255 port 67 interval 4 DHCPOFFER from 192.168.73.209 DHCPREQUEST on ue0 to 255.255.255.255 port 67 DHCPACK from 192.168.73.209 bound to 192.168.73.16 -- renewal in 1799 seconds.
You can now test your connection with ping(8) command for example.
% ping -c 1 e.pl PING e.pl (184.108.40.206): 56 data bytes 64 bytes from 220.127.116.11: icmp_seq=0 ttl=53 time=65.638 ms --- e.pl ping statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 65.638/65.638/65.638/0.000 ms
You can now see that you got the needed IP address on your ue0 interface.
% ifconfig ue0 ue0: flags=8843<up,broadcast,running,simplex,multicast> metric 0 mtu 1500 ether 02:2a:71:6a:08:01 inet 192.168.73.16/24 broadcast 192.168.73.255 nd6 options=29<performnud,ifdisabled,auto_linklocal> </performnud,ifdisabled,auto_linklocal></up,broadcast,running,simplex,multicast>
This means that your Internet connection over USB tethering is functional.
One of the additional benefits of this approach is that USB connection also provides the power to your smartphone – which means that you only need one cable for both Internet connection and power for the smartphone device.
Mobile Router with RJ45 Cable
There is also additional option available and it provides similar possibilities to USB tethering – its using some mobile wireless router what would connect to LTE/4G network or some WiFi access point and will also have RJ45 socket so you will be able to connect to it with the RJ45 port on your laptop/desktop FreeBSD system.
You can find many such devices in real cheap price such as Overmax 3G or RAVPower RP-WD03-BK to name some. They come in $15 to $30 price range which should be marked as affordable for most people. Additional bonus from these devices is that they also serve as powerbank function. Also being powered its not needed to also power them up all the time – as the often allow for whole day function on the battery itself.
The Overmax 3G device is shown below.
The RAVPower RP-WD03-BK is shown below.
Bhyve wifibox VM
There is also one additional way to get your WiFi connection – use bhyve(8) virtualization. With wifibox you will deploy Linux VM – and use Linux wireless drivers for the card that may be unsupported on FreeBSD system. It works because of bhyve(8) PCI passthrough feature. You just pass the WiFi card directly to Linux VM.
The biggest advantage of wifibox is that everything is shipped in single FreeBSD package that can be easily installed and removed. You will just have to add wifibox package with pkg(8) – the FreeBSD package manager.
It also comes with rc(8) service script that automatically starts that Linux VM upon FreeBSD boot – and stops gracefully on shutdown.
What works best? To be honest its still more convenient to use builtin WiFi chip even at slower 802.11g speeds then using any other methods described in this article. Next one is using the mobile router with RJ45 cable. The next one (and somewhat slower one) is the USB tethering method – but while slower I was able to successfully post that article using it – so its not a major drawback. At the least one is using the wifibox way. Its generally up to You – what makes less PITA for you.
I of course hope that WiFi will get some more love in the FreeBSD land and that such ‘strange’ methods would not be needed to ‘just’ connect to the Internet.