xref: /openwifi/README.md (revision 2ee67178825ee52f380c2f72b7135d15ddadca60)
10df4ca4dSimoerman# openwifi
2*2ee67178SXianjun Jiao<img src="./openwifi-arch.jpg" width="900">
3*2ee67178SXianjun Jiao
4*2ee67178SXianjun Jiao**openwifi:** Linux mac80211 compatiable full-stack Wi-Fi design based on SDR (Software Defined Radio).
5*2ee67178SXianjun Jiao
6*2ee67178SXianjun JiaoThis repository includes Linux driver and software. [openwifi-hw](https://github.ugent.be/xjiao/openwifi-hw) repository has the FPGA design. [[Detailed architecture](https://github.ugent.be/xjiao/openwifi/tree/master/doc)]
7*2ee67178SXianjun Jiao
8*2ee67178SXianjun Jiao[Demo [video](https://drive.google.com/file/d/1Qk-MEHkK_9yL_KPv--4MCJhLoGzE2N5W/view?usp=sharing)]. [openwifi [maillist](https://lists.ugent.be/wws/subscribe/openwifi)]
9*2ee67178SXianjun Jiao
10*2ee67178SXianjun JiaoOpenwifi code has dual licenses. AGPLv3 is the opensource license. For non-opensource license, please contact [email protected]. Openwifi project also leverages some 3rd party modules. It is your duty to check and follow licenses of those modules according to your purpose. You can find [an example explanation from Analog Devices](https://github.com/analogdevicesinc/hdl/blob/master/LICENSE) for this compound license conditions.
11*2ee67178SXianjun Jiao
12*2ee67178SXianjun JiaoOpenwifi was born in [ORCA project](https://www.orca-project.eu/) (EU's Horizon2020 programme under agreement number 732174).
13*2ee67178SXianjun Jiao
14*2ee67178SXianjun Jiao**Features:**
15*2ee67178SXianjun Jiao
16*2ee67178SXianjun Jiao* 802.11a/g; 802.11n MCS 0~7; 20MHz
17*2ee67178SXianjun Jiao* Mode tested: Ad-hoc; Station; AP
18*2ee67178SXianjun Jiao* DCF (CSMA/CA) low MAC layer in FPGA
19*2ee67178SXianjun Jiao* Configurable channel access priority parameters:
20*2ee67178SXianjun Jiao  * duration of RTS/CTS, CTS-to-self
21*2ee67178SXianjun Jiao  * SIFS/DIFS/xIFS/slot-time/CW/etc
22*2ee67178SXianjun Jiao* Time slicing based on MAC address
23*2ee67178SXianjun Jiao* Easy to change bandwidth and frequency:
24*2ee67178SXianjun Jiao  * 2MHz for 802.11ah in sub-GHz
25*2ee67178SXianjun Jiao  * 10MHz for 802.11p/vehicle in 5.9GHz
26*2ee67178SXianjun Jiao* On roadmap: **802.11ax**
27*2ee67178SXianjun Jiao
28*2ee67178SXianjun Jiao**Performance (AP: openwifi at channel 44, client: TL-WDN4200 N900 Wireless Dual Band USB Adapter. iperf test):**
29*2ee67178SXianjun Jiao* AP --> client: 30.6Mbps(TCP), 38.8Mbps(UDP)
30*2ee67178SXianjun Jiao* client --> AP: 17.0Mbps(TCP), 21.5Mbps(UDP)
31*2ee67178SXianjun Jiao
32*2ee67178SXianjun Jiao**Supported SDR platforms:**
33*2ee67178SXianjun Jiao
34*2ee67178SXianjun Jiao* zc706 (Xilinx) + fmcomms2 (Analog Devices)
35*2ee67178SXianjun Jiao* On roadmap: ADRV9361-Z7035/ADRV9364-Z7020 + ADRV1CRR-BOB (Analog Devices)
36*2ee67178SXianjun Jiao* On roadmap: zcu102 (Xilinx) + fmcomms2/ADRV9371 (Analog Devices)
37*2ee67178SXianjun Jiao* Don't have any boards? Or you like JTAG boot instead of SD card? Check our test bed [w-iLab.t](https://doc.ilabt.imec.be/ilabt/wilab/tutorials/openwifi.html) tutorial.
38*2ee67178SXianjun Jiao
39*2ee67178SXianjun Jiao**Quick start:** (Example instructions are verified on Ubuntu 16/18)
40*2ee67178SXianjun Jiao
41*2ee67178SXianjun Jiao* Download pre-built [openwifi Linux img file](https://users.ugent.be/~xjiao/). Burn the img file to a 16G SD card:
42*2ee67178SXianjun Jiao
43*2ee67178SXianjun Jiao```
44*2ee67178SXianjun Jiaosudo dd bs=4M if=openwifi-zc706-v000.img of=/dev/mmcblk0
45*2ee67178SXianjun Jiao(mmcblk0 is the dev name of sdcard in Linux. Make sure you use the correct one in your situation!)
46*2ee67178SXianjun Jiao(Above command takes a while)
47*2ee67178SXianjun Jiao```
48*2ee67178SXianjun Jiao* Connect RX/TX antenna to RX1A/TX2A ports of your zc706+fmcomms2 platform, and make two antennas orthogonal to each other for good isolation. Config zc706 to SD card boot mode by switches (Read zc706 board spec on internet). Insert the SD card to zc706.
49*2ee67178SXianjun Jiao
50*2ee67178SXianjun Jiao* Connect the board to PC. (PC IP address should be 192.168.10.1). Power on the board. Then from PC:
51*2ee67178SXianjun Jiao
52*2ee67178SXianjun Jiao```
53*2ee67178SXianjun Jiaossh [email protected]
54*2ee67178SXianjun Jiao(password: openwifi)
55*2ee67178SXianjun Jiaocd openwifi
56*2ee67178SXianjun Jiaoservice network-manager stop
57*2ee67178SXianjun Jiao./wgd.sh
58*2ee67178SXianjun Jiaoifconfig sdr0 up
59*2ee67178SXianjun Jiaoiwlist sdr0 scan
60*2ee67178SXianjun Jiao(you should see the Wi-Fi scan result)
61*2ee67178SXianjun Jiao```
62*2ee67178SXianjun Jiao* Setup openwifi hotspot over topology: client -- (sdr0)|zc706|(eth0) -- (***ethX***)|PC|(***ethY***) -- internet
63*2ee67178SXianjun Jiao  * Enable IPv4 IP forwarding on both zc706 and PC
64*2ee67178SXianjun Jiao  * Then, on board:
65*2ee67178SXianjun Jiao
66*2ee67178SXianjun Jiao        ifconfig sdr0 192.168.13.1
67*2ee67178SXianjun Jiao        route add default gw 192.168.10.1
68*2ee67178SXianjun Jiao        service isc-dhcp-server restart
69*2ee67178SXianjun Jiao        hostapd hostapd-openwifi.conf
70*2ee67178SXianjun Jiao  * Then, on PC:
71*2ee67178SXianjun Jiao
72*2ee67178SXianjun Jiao        sudo iptables -t nat -A POSTROUTING -o ethY -j MASQUERADE
73*2ee67178SXianjun Jiao        sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
74*2ee67178SXianjun Jiao  * Now you can connect openwifi by your devices (phone, laptop, etc)
75*2ee67178SXianjun Jiao* Connect openwifi to another hotspot. Terminate hostapd, edit wpa-connect.conf properly, then:
76*2ee67178SXianjun Jiao
77*2ee67178SXianjun Jiao        ./wgd.sh
78*2ee67178SXianjun Jiao        route del default gw 192.168.10.1
79*2ee67178SXianjun Jiao        wpa_supplicant -i sdr0 -c wpa-connect.conf
80*2ee67178SXianjun Jiao        (Wait for connection done, then open another ssh terminal)
81*2ee67178SXianjun Jiao        dhclient sdr0
82*2ee67178SXianjun Jiao        (Wait for its donw, then you should have connection)
83*2ee67178SXianjun Jiao
84*2ee67178SXianjun Jiao* ***Note***: If openwifi stops working after ~2 hours, it means the evaluation license of Xilinx Viterbi decoder has expired. You need to power cycle the board. Run this command several times on board to confirm:
85*2ee67178SXianjun Jiao
86*2ee67178SXianjun Jiao        root@analog:~/openwifi# ./sdrctl dev sdr0 get reg rx 20
87*2ee67178SXianjun Jiao        SENDaddr: 00040050
88*2ee67178SXianjun Jiao        reg  val: 34be0123
89*2ee67178SXianjun Jiao        (If the last number of reg val is always 3, that means the Viterbi decoder stops working)
90*2ee67178SXianjun Jiao* Real-time control/config via sdrctl (time slice config, etc), please find the [doc](https://github.ugent.be/xjiao/openwifi/tree/master/doc).
91*2ee67178SXianjun Jiao
92*2ee67178SXianjun Jiao**Build openwifi Linux img based on openwifi FPGA and driver:**
93*2ee67178SXianjun Jiao
94*2ee67178SXianjun Jiao* Install Vivado/SDK 2017.4.1.
95*2ee67178SXianjun Jiao* Get necessary FPGA files from openwifi-hw repository.
96*2ee67178SXianjun Jiao
97*2ee67178SXianjun Jiao```
98*2ee67178SXianjun Jiaogit submodule init openwifi-hw
99*2ee67178SXianjun Jiaogit submodule update openwifi-hw
100*2ee67178SXianjun Jiaocd openwifi-hw
101*2ee67178SXianjun Jiaogit pull
102*2ee67178SXianjun Jiao```
103*2ee67178SXianjun Jiao* Build Linux kernel and modules:
104*2ee67178SXianjun Jiao
105*2ee67178SXianjun Jiao```
106*2ee67178SXianjun Jiaoexport XILINX_DIR=your_Xilinx_directory
107*2ee67178SXianjun Jiaocd openwifi
108*2ee67178SXianjun Jiaogit submodule init adi-linux
109*2ee67178SXianjun Jiaogit submodule update adi-linux
110*2ee67178SXianjun Jiao(Will take a while)
111*2ee67178SXianjun Jiaocd adi-linux
112*2ee67178SXianjun Jiaogit reset --hard 4220d5d24c6c7589fc702db4f941f0632b5ad767
113*2ee67178SXianjun Jiaocp ../kernel_boot/kernel_config ./.config
114*2ee67178SXianjun Jiaosource $XILINX_DIR/SDK/2017.4/settings64.sh
115*2ee67178SXianjun Jiaoexport ARCH=arm
116*2ee67178SXianjun Jiaoexport CROSS_COMPILE=arm-linux-gnueabihf-
117*2ee67178SXianjun Jiaomake -j12 UIMAGE_LOADADDR=0x8000 uImage
118*2ee67178SXianjun Jiao(Answer "y" to Xilinx DMA Engines (XILINX_DMA_ENGINES) [N/y/?] (NEW))
119*2ee67178SXianjun Jiaomake modules
120*2ee67178SXianjun Jiao```
121*2ee67178SXianjun Jiao* Build openwifi Linux driver modules:
122*2ee67178SXianjun Jiao
123*2ee67178SXianjun Jiao```
124*2ee67178SXianjun Jiaoexport OPENWIFI_DIR=your_openwifi_directory
125*2ee67178SXianjun Jiaocd $OPENWIFI_DIR/driver
126*2ee67178SXianjun Jiao./make_all.sh $XILINX_DIR/SDK/2017.4/ $OPENWIFI_DIR/adi-linux/
127*2ee67178SXianjun Jiao```
128*2ee67178SXianjun Jiao* Build openwifi Linux devicetree:
129*2ee67178SXianjun Jiao
130*2ee67178SXianjun Jiao```
131*2ee67178SXianjun Jiaocd $OPENWIFI_DIR/kernel_boot
132*2ee67178SXianjun Jiaodtc -I dts -O dtb -o devicetree.dtb devicetree.dts
133*2ee67178SXianjun Jiao```
134*2ee67178SXianjun Jiao* Build openwifi BOOT.BIN based on FPGA files generated in openwifi-hw:
135*2ee67178SXianjun Jiao
136*2ee67178SXianjun Jiao```
137*2ee67178SXianjun Jiaocd $OPENWIFI_DIR/kernel_boot
138*2ee67178SXianjun Jiaosource $XILINX_DIR/Vivado/2017.4/settings64.sh
139*2ee67178SXianjun Jiao./build_boot_bin.sh ../openwifi-hw/zc706_fmcs2/sdk/system_top_hw_platform_0/system.hdf u-boot-zc70x.elf
140*2ee67178SXianjun Jiao(u-boot-zc70x.elf is included in the original Analog Devices Linux img)
141*2ee67178SXianjun Jiao```
142*2ee67178SXianjun Jiao* Download [2017_R1-2018_01_29.img.xz](http://swdownloads.analog.com/cse/2017_R1-2018_01_29.img.xz) from [Analog Devices Wiki](https://wiki.analog.com/resources/tools-software/linux-software/zynq_images). Burn it into a SD card via your PC.
143*2ee67178SXianjun Jiao* Mount SD card BOOT/rootfs partitions to SDCARD_DIR directory of your PC (If it is mounted automatically, find the directory). Then copy built files to SD card via your PC. (You can also update files over ftp/ssh after your full system runs. Please check user_space/sdcard_boot_update.sh and set your ftp root directory to openwifi repository in your PC):
144*2ee67178SXianjun Jiao
145*2ee67178SXianjun Jiao```
146*2ee67178SXianjun Jiaoexport SDCARD_DIR=sdcard_mount_point
147*2ee67178SXianjun Jiaocp $OPENWIFI_DIR/kernel_boot/devicetree.dtb $SDCARD_DIR/BOOT
148*2ee67178SXianjun Jiaocp $OPENWIFI_DIR/kernel_boot/output_boot_bin/BOOT.BIN $SDCARD_DIR/BOOT
149*2ee67178SXianjun Jiaocp $OPENWIFI_DIR/adi-linux/arch/arm/boot/uImage $SDCARD_DIR/BOOT
150*2ee67178SXianjun Jiaocd $SDCARD_DIR/BOOT
151*2ee67178SXianjun Jiaosync
152*2ee67178SXianjun Jiao
153*2ee67178SXianjun Jiaosudo mkdir $SDCARD_DIR/rootfs/root/openwifi
154*2ee67178SXianjun Jiaosudo find $OPENWIFI_DIR/driver -name \*.ko -exec cp {} $SDCARD_DIR/rootfs/root/openwifi/ \;
155*2ee67178SXianjun Jiaosudo cp $OPENWIFI_DIR/user_space/* $SDCARD_DIR/rootfs/root/openwifi/
156*2ee67178SXianjun Jiao
157*2ee67178SXianjun Jiaosudo mkdir $SDCARD_DIR/rootfs/lib/modules
158*2ee67178SXianjun Jiaosudo mkdir $SDCARD_DIR/rootfs/lib/modules/4.14.0-g4220d5d24c6c
159*2ee67178SXianjun Jiaosudo find $OPENWIFI_DIR/adi-linux -name \*.ko -exec cp {} $SDCARD_DIR/rootfs/lib/modules/4.14.0-g4220d5d24c6c/ \;
160*2ee67178SXianjun Jiaosudo rm $SDCARD_DIR/rootfs/lib/modules/4.14.0-g4220d5d24c6c/{axidmatest.ko,xilinx_dma.ko,adi_axi_hdmi.ko,ad9361_drv.ko} -f
161*2ee67178SXianjun Jiao
162*2ee67178SXianjun Jiaosudo rm $SDCARD_DIR/rootfs/etc/udev/rules.d/70-persistent-net.rules
163*2ee67178SXianjun Jiaosudo cp $OPENWIFI_DIR/kernel_boot/70-persistent-net.rules $SDCARD_DIR/rootfs/etc/udev/rules.d/
164*2ee67178SXianjun Jiao(Above rule will auto-rename wlan0 to sdr0 which is the openwifi NIC name)
165*2ee67178SXianjun Jiaocd $SDCARD_DIR/rootfs
166*2ee67178SXianjun Jiaosync
167*2ee67178SXianjun Jiao```
168*2ee67178SXianjun Jiao**Run Linux and do some post-config:**
169*2ee67178SXianjun Jiao
170*2ee67178SXianjun Jiao* Insert the SD card to the board, power on and run serial console (such as minicom) from a PC via USB-UART cable to the board. After booting completes, in the PC serial console:
171*2ee67178SXianjun Jiao
172*2ee67178SXianjun Jiao```
173*2ee67178SXianjun Jiaoln -s /lib/modules/4.14.0-g4220d5d24c6c /lib/modules/4.14.0-g4220d5d
174*2ee67178SXianjun Jiao(in case some Linux use short hash)
175*2ee67178SXianjun Jiaodepmod
176*2ee67178SXianjun Jiao(Ignore the error messages)
177*2ee67178SXianjun Jiaomodprobe mac80211
178*2ee67178SXianjun Jiaocd openwifi
179*2ee67178SXianjun Jiao./wgd.sh
180*2ee67178SXianjun Jiao(Wait for the completion)
181*2ee67178SXianjun Jiaoifconfig
182*2ee67178SXianjun Jiao(You should see sdr0 interface)
183*2ee67178SXianjun Jiaoiwlist sdr0 scan
184*2ee67178SXianjun Jiao(You should see the Wi-Fi scan results)
185*2ee67178SXianjun Jiao```
186*2ee67178SXianjun Jiao* Config ssh server and ethernet IP address of the board. In the PC serial console:
187*2ee67178SXianjun Jiao
188*2ee67178SXianjun Jiao```
189*2ee67178SXianjun Jiaopasswd
190*2ee67178SXianjun Jiao(ssh server needs a password, such as "openwifi")
191*2ee67178SXianjun JiaoAdd "UseDNS no" to /etc/ssh/sshd_config, otherwise ssh login takes too long time
192*2ee67178SXianjun JiaoSet static IP to board (If you have DHCP server on PC, you can skip this step)
193*2ee67178SXianjun JiaoAdd following content to /etc/network/interfaces
194*2ee67178SXianjun Jiao  auto lo eth0
195*2ee67178SXianjun Jiao  iface lo inet loopback
196*2ee67178SXianjun Jiao  iface eth0 inet static
197*2ee67178SXianjun Jiao          address 192.168.10.122
198*2ee67178SXianjun Jiao          netmask 255.255.255.0
199*2ee67178SXianjun JiaoAdd following content to /etc/resolv.conf
200*2ee67178SXianjun Jiao  nameserver 8.8.8.8
201*2ee67178SXianjun Jiao  nameserver 4.4.4.4
202*2ee67178SXianjun Jiao
203*2ee67178SXianjun JiaoDisable update (long time hang) on boot or ssh session:
204*2ee67178SXianjun Jiao  sudo chmod -x /etc/update-motd.d/90-updates-available
205*2ee67178SXianjun Jiao  sudo chmod -x /etc/update-motd.d/91-release-upgrade
206*2ee67178SXianjun Jiao
207*2ee67178SXianjun Jiaoreboot the board, and set proper IP of the connected PC, then from the PC:
208*2ee67178SXianjun Jiaossh [email protected]
209*2ee67178SXianjun Jiao(password: openwifi)
210*2ee67178SXianjun Jiao
211*2ee67178SXianjun JiaoAccess the board disk from PC: Ubuntu "File manager --> Connect to Server...", input: sftp://[email protected]/root
212*2ee67178SXianjun Jiao
213*2ee67178SXianjun Jiao./wgd.sh remote
214*2ee67178SXianjun Jiao(Above command updates files from your PC and brings up sdr0. Make sure set ftp root directory to openwifi repository in your PC)
215*2ee67178SXianjun Jiao```
216*2ee67178SXianjun Jiao**Compile user_space/sdrctl_src on the board** ("On the board" means that you login to the board via ssh)
217*2ee67178SXianjun Jiao
218*2ee67178SXianjun Jiao```
219*2ee67178SXianjun Jiaosudo apt-get install libnl-3-dev
220*2ee67178SXianjun Jiaosudo apt-get install libnl-genl-3-dev
221*2ee67178SXianjun Jiao(or find out .deb files by above commands and copy .deb to the board, if you do not have internet)
222*2ee67178SXianjun Jiao
223*2ee67178SXianjun Jiaocopy user_space/sdrctl_src to the board, then on the board:
224*2ee67178SXianjun Jiaocd sdrctl_src
225*2ee67178SXianjun Jiaochmod +x version.sh
226*2ee67178SXianjun Jiaomake
227*2ee67178SXianjun Jiao```
228*2ee67178SXianjun Jiao**Internet config**
229*2ee67178SXianjun Jiao
230*2ee67178SXianjun Jiao* Topology: client -- (sdr0)|zc706|(eth0) -- (***ethX***)|PC|(***ethY***) -- internet
231*2ee67178SXianjun Jiao* Enable IPv4 IP forwarding on both zc706 and PC
232*2ee67178SXianjun Jiao* On PC. After this your board should have internet via NAT through your PC.
233*2ee67178SXianjun Jiao
234*2ee67178SXianjun Jiao```
235*2ee67178SXianjun Jiaosudo iptables -t nat -A POSTROUTING -o ethY -j MASQUERADE
236*2ee67178SXianjun Jiao```
237*2ee67178SXianjun Jiao* On board: Install dhcp server preparing for serving your openwifi clients via hostapd.
238*2ee67178SXianjun Jiao
239*2ee67178SXianjun Jiao```
240*2ee67178SXianjun Jiaosudo apt-get install isc-dhcp-server
241*2ee67178SXianjun Jiaosudo apt-get install Haveged
242*2ee67178SXianjun Jiao```
243*2ee67178SXianjun Jiao* Put user_space/dhcpd.conf into (overwrite) /etc/dhcp/dhcpd.conf on board.
244*2ee67178SXianjun Jiao
245*2ee67178SXianjun Jiao* On board:
246*2ee67178SXianjun Jiao
247*2ee67178SXianjun Jiao```
248*2ee67178SXianjun Jiaocd openwifi
249*2ee67178SXianjun Jiaoservice network-manager stop
250*2ee67178SXianjun Jiao./wgd.sh
251*2ee67178SXianjun Jiaoifconfig sdr0 up
252*2ee67178SXianjun Jiaoifconfig sdr0 192.168.13.1
253*2ee67178SXianjun Jiaoroute add default gw 192.168.10.1
254*2ee67178SXianjun Jiaoservice isc-dhcp-server restart
255*2ee67178SXianjun Jiaohostapd hostapd-openwifi.conf
256*2ee67178SXianjun Jiao```
257*2ee67178SXianjun Jiao* On PC:
258*2ee67178SXianjun Jiao
259*2ee67178SXianjun Jiao```
260*2ee67178SXianjun Jiaosudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
261*2ee67178SXianjun Jiao```
262*2ee67178SXianjun Jiao* Now you can connect openwifi hotspot from your phone/laptop and access internet.
263