openwifi: Linux mac80211 compatible full-stack IEEE802.11/Wi-Fi design based on SDR (Software Defined Radio).
[Download img and Quick start] [Tips for Windows users]
This repository includes Linux driver and software. openwifi-hw repository has the FPGA design. It is YOUR RESPONSIBILITY to follow your LOCAL SPECTRUM REGULATION or use CABLE to avoid potential interference over the air.
[Project document] [Application notes] [Videos] [Publications and How to Cite] [maillist]
Openwifi code has dual licenses. AGPLv3 is the opensource license. For non-opensource and advanced feature license, please contact Filip.Louagie@UGent.be. Openwifi project also leverages some 3rd party modules. It is user's duty to check and follow licenses of those modules according to the purpose/usage. You can find an example explanation from Analog Devices for this compound license conditions. [How to contribute].
Features:
Performance (best case: aggregation/AMPDU on):
Supported SDR platforms:
board_name | Description | Vivado license |
---|---|---|
zc706_fmcs2 | Xilinx ZC706 board + FMCOMMS2/3/4 | Need |
zed_fmcs2 | Xilinx zed board + FMCOMMS2/3/4 | NO need |
adrv9364z7020 | ADRV9364-Z7020 + ADRV1CRR-BOB | NO need |
adrv9361z7035 | ADRV9361-Z7035 + ADRV1CRR-BOB/FMC | Need |
zc702_fmcs2 | Xilinx ZC702 board + FMCOMMS2/3/4 | NO need |
antsdr | MicroPhase enhanced ADALM-PLUTO Notes | NO need |
e310v2 | MicroPhase new antsdr Notes | NO need |
antsdr_e200 | MicroPhase enhanced ADALM-PLUTO (smaller/cheaper) Notes | NO need |
sdrpi | HexSDR SDR in Raspberry Pi size Notes | NO need |
zcu102_fmcs2 | Xilinx ZCU102 board + FMCOMMS2/3/4 | Need |
neptunesdr | Low cost Zynq 7020 + AD9361 board | NO need |
[Download img and Quick start] [Basic operations] [Update FPGA] [Update Driver] [Update sdrctl] [Easy Access and etc]
[Build openwifi Linux img from scratch] [Special note for 11b] [Porting guide] [Project document] [Application notes]
sudo dd bs=512 count=31116288 if=openwifi-xyz.img of=/dev/your_sdcard_dev
(To have correct count value, better to check the .img file actual situation by "fdisk -l img_filename")
ssh root@192.168.10.122
raspi-config --expand-rootfs (Only needed when your SD card > 16GB. Run and reboot)
./openwifi/setup_once.sh (Reboot the board. Only need to run once for new board)
cd openwifi
./wgd.sh
./fosdem.sh
(Use "./wgd.sh 1" to enable experimental AMPDU aggregation on top of 11n)
(Use "./fosdem-11ag.sh" to force 11a/g mode)
NOTE adrv9361z7035 has ultra low TX power in 5GHz. Move CLOSER when you use that board in 5GHz!!!
To give the Wi-Fi client internet access, configure routing/NAT on the PC:
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o NICY -j MASQUERADE
sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
ethX is the PC NIC name connecting the board ethernet. NICY is the PC NIC name connecting internet (WiFi or another ethernet).
If you want, uncommenting "net.ipv4.ip_forward=1" in /etc/sysctl.conf to make IP forwarding persistent on PC.
The board actually is an Linux/Ubuntu computer which is running hostapd to offer Wi-Fi AP functionality over the Wi-Fi Network Interface (NIC). The NIC is implemented by openwifi-hw FPGA design. We use the term "On board" to indicate that the commands should be executed after ssh login to the board. "On PC" means the commands should run on PC.
cd ~/openwifi && ./wgd.sh
(Use "./wgd.sh 1" to enable experimental AMPDU aggregation)
route del default gw 192.168.10.1
wpa_supplicant -i sdr0 -c wpa-connect.conf &
dhclient sdr0
Since the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to always copy the latest files in the user_space directory on to the board. Then update the FPGA&Driver according to the Quick start of this app note. Following instructions are doing the same thing with extra info for environment setup.
(Check Driver and FPGA dynamic reloading app note for better understanding of updating FPGA and driver files without rebooting/power-cycle)
export XILINX_DIR=your_Xilinx_install_directory
(Example: export XILINX_DIR=/opt/Xilinx. The Xilinx directory should include sth like: Downloads, Vitis, etc.)
export OPENWIFI_HW_IMG_DIR=your_openwifi-hw-img_directory
(The directory where you get the open-sdr/openwifi-hw-img repo via git clone)
export BOARD_NAME=your_board_name
cd openwifi/user_space; ./boot_bin_gen.sh $XILINX_DIR $BOARD_NAME $OPENWIFI_HW_IMG_DIR/boards/$BOARD_NAME/sdk/system_top.xsa
scp ./system_top.bit.bin root@192.168.10.122:openwifi/
Since the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to always copy the latest files in the user_space directory on to the board. Then update the FPGA&Driver according to the Quick start of this app note. Following instructions are doing the same thing with extra info for environment setup.
(Check Driver and FPGA dynamic reloading app note for better understanding of updating FPGA and driver files without rebooting/power-cycle)
sudo apt install flex bison libssl-dev device-tree-compiler u-boot-tools -y
cd openwifi/user_space; ./prepare_kernel.sh $XILINX_DIR ARCH_BIT
(For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
cd openwifi/driver; ./make_all.sh $XILINX_DIR ARCH_BIT
(For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
(More arguments (max 5) beyond above two will be converted to "#define argument" in pre_def.h for conditional compiling)
Copy the driver files to the board via ssh channel
cd openwifi/driver; scp `find ./ -name \*.ko` root@192.168.10.122:openwifi/
Now you can use wgd.sh on board to load the new openwifi driver. wgd.sh also tries to reload FPGA img if system_top.bit.bin presents in the same directory. Find more information in Driver and FPGA dynamic reloading app note.
Note: If you have symbol or version error while loadng the driver, it could be because the kernel in the SD card image is too old. In this case, you need put the linux kernel image generated by prepare_kernel.sh (check [Update Driver]) to the BOOT partition of SD card. The kernel image file name: adi-linux/arch/arm/boot/uImage (32bit); adi-linux-64/arch/arm64/boot/Image (64bit).
Copy the sdrctl source files to the board via ssh channel
cd openwifi/user_space/sdrctl_src; scp `find ./ -name \*` root@192.168.10.122:openwifi/sdrctl_src/
Compile the sdrctl on board:
cd ~/openwifi/sdrctl_src/ && make clean && make && cp sdrctl ../ && cd ..
Check Driver and FPGA dynamic reloading app note for more convenient way of updating FPGA and driver files without rebooting/power-cycle.
FPGA and driver on board update scripts
./sdcard_boot_update.sh $BOARD_NAME
(Above command downloads uImage, BOOT.BIN and devicetree.dtb, then copy them into boot partition. Remember to power cycle)
./wgd.sh remote
(Above command downloads driver files, and brings up sdr0)
Access the board disk/rootfs like a disk:
Openwifi only applies OFDM as its modulation scheme and as a result, it is not backward compatible with 802.11b clients or modes of operation. This is usually the case during beacon transmission, connection establishment, and robust communication.
As a solution to this problem, openwifi can be fully controlled only if communicating with APs/clients instantiated using hostapd/wpa_supplicant userspace programs respectively.
For hostapd program, 802.11b rates can be suppressed using configuration commands (i.e. supported_rates, basic_rates) and an example configuration file is provided (i.e. hostapd-openwifi.conf). One small caveat to this one comes from fullMAC Wi-Fi cards as they must implement the NL80211_TXRATE_LEGACY NetLink handler at the device driver level.
On the other hand, the wpa_supplicant program on the client side (commercial Wi-Fi dongle/board) cannot suppress 802.11b rates out of the box in 2.4GHz band, so there will be an issue when connecting openwifi (OFDM only). A patched wpa_supplicant should be used at the client side.
sudo apt-get install libssl1.0-dev
cd openwifi/user_space; ./build_wpa_supplicant_wo11b.sh
This section explains the porting work by showing the differences between openwifi and Analog Devices reference design. openwifi is based on 2021_r1 of HDL Reference Designs.
This project is available as open source under the terms of the AGPL 3.0 Or later. However, some elements are being licensed under GPL 2-0 or later and BSD 3 license . For accurate information, please check individual files.