xref: /openwifi/README.md (revision b73660ad79a69a37f3fe788f4f09f51e1255bab5)
10df4ca4dSimoerman# openwifi
22ee67178SXianjun Jiao<img src="./openwifi-arch.jpg" width="900">
32ee67178SXianjun Jiao
438f76c01SJiao Xianjun**openwifi:** Linux mac80211 compatible full-stack IEEE802.11/Wi-Fi design based on SDR (Software Defined Radio).
52ee67178SXianjun Jiao
6db5fcd35SJiao XianjunThis repository includes Linux driver and software. [openwifi-hw](https://github.com/open-sdr/openwifi-hw) repository has the FPGA design. [[Project document](https://github.com/open-sdr/openwifi/tree/master/doc)]
72ee67178SXianjun Jiao
8*b73660adSXianjun Jiao[Demo [video](https://youtu.be/NpjEaszd5u4) and video [download](https://users.ugent.be/~xjiao/openwifi-low-aac.mp4)]   [openwifi [maillist](https://lists.ugent.be/wws/subscribe/openwifi)] [[Cite openwifi project](#Cite-openwifi-project)]
92ee67178SXianjun Jiao
102c8fb6e0SJiao XianjunOpenwifi 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 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](https://github.com/analogdevicesinc/hdl/blob/master/LICENSE) for this compound license conditions. [[How to contribute]](https://github.com/open-sdr/openwifi/blob/master/CONTRIBUTING.md).
112ee67178SXianjun Jiao
122ee67178SXianjun Jiao**Features:**
132ee67178SXianjun Jiao
14*b73660adSXianjun Jiao- 802.11a/g
15*b73660adSXianjun Jiao- 802.11n MCS 0~7 (Only PHY rx for now. Full system support of 802.11n will come soon)
16*b73660adSXianjun Jiao- 20MHz bandwidth; 70 MHz to 6 GHz frequency range
17*b73660adSXianjun Jiao- Mode tested: Ad-hoc; Station; AP, Monitor
18*b73660adSXianjun Jiao- DCF (CSMA/CA) low MAC layer in FPGA (10us SIFS is achieved)
19*b73660adSXianjun Jiao- Configurable channel access priority parameters:
20*b73660adSXianjun Jiao  - duration of RTS/CTS, CTS-to-self
21*b73660adSXianjun Jiao  - SIFS/DIFS/xIFS/slot-time/CW/etc
22*b73660adSXianjun Jiao- Time slicing based on MAC address
23*b73660adSXianjun Jiao- Easy to change bandwidth and frequency:
24*b73660adSXianjun Jiao  - 2MHz for 802.11ah in sub-GHz
25*b73660adSXianjun Jiao  - 10MHz for 802.11p/vehicle in 5.9GHz
26*b73660adSXianjun Jiao- On roadmap: **802.11ax**
272ee67178SXianjun Jiao
28*b73660adSXianjun Jiao**Performance (AP: openwifi at channel 44, client: TL-WDN4200 N900 USB Dongle):**
29*b73660adSXianjun Jiao- AP --> client: 30.6Mbps(TCP), 38.8Mbps(UDP)
30*b73660adSXianjun Jiao- client --> AP: 17.0Mbps(TCP), 21.5Mbps(UDP)
312ee67178SXianjun Jiao
32*b73660adSXianjun Jiao**Supported SDR platforms:** (Check [Porting guide](#Porting-guide) for your new board if it isn't in the list)
332ee67178SXianjun Jiao
34*b73660adSXianjun Jiaoboard_name|board combination|status
359e696164SXianjun Jiao-------|-------|----
36821084f4SJiao Xianjunzc706_fmcs2|Xilinx ZC706 dev board + FMCOMMS2/3/4|Done
37*b73660adSXianjun Jiaozed_fmcs2|Xilinx zed board + FMCOMMS2/3/4|Done
38*b73660adSXianjun Jiaoadrv9364z7020|ADRV9364Z7020 SOM + ADRV1CRR-BOB carrier board|Done
39*b73660adSXianjun Jiaoadrv9361z7035|ADRV9361Z7035 SOM + ADRV1CRR-BOB carrier board|Done
40*b73660adSXianjun Jiaoadrv9361z7035_fmc|ADRV9361Z7035 SOM + ADRV1CRR-FMC carrier board|Done
41*b73660adSXianjun Jiaozc702_fmcs2|Xilinx ZC702 dev board + FMCOMMS2/3/4|Done
42821084f4SJiao Xianjunzcu102_fmcs2|Xilinx ZCU102 dev board + FMCOMMS2/3/4|Future
43821084f4SJiao Xianjunzcu102_9371|Xilinx ZCU102 dev board + ADRV9371|Future
449e696164SXianjun Jiao
45*b73660adSXianjun Jiao- board_name is used to identify FPGA design in openwifi-hw/boards/
46*b73660adSXianjun 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.
472ee67178SXianjun Jiao
48*b73660adSXianjun Jiao[[Quick start](#Quick-start)]
49*b73660adSXianjun Jiao[[Basic operations](#Basic-operations)]
50*b73660adSXianjun Jiao[[Update FPGA](#Update-FPGA)]
51*b73660adSXianjun Jiao[[Update Driver](#Update-Driver)]
52*b73660adSXianjun Jiao[[Update sdrctl](#Update-sdrctl)]
53*b73660adSXianjun Jiao[[Easy Access and etc](#Easy-Access-and-etc)]
542ee67178SXianjun Jiao
55*b73660adSXianjun Jiao[[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)]
56*b73660adSXianjun Jiao[[Special note for 11b](#Special-note-for-11b)]
57*b73660adSXianjun Jiao[[Porting guide](#Porting-guide)]
58*b73660adSXianjun Jiao[[Cite openwifi project](#Cite-openwifi-project)]
592ee67178SXianjun Jiao
60*b73660adSXianjun Jiao## Quick start
61*b73660adSXianjun Jiao- Burn [openwifi image](https://users.ugent.be/~xjiao/openwifi-1.1.0-taiyuan.img.xz) into a SD card (Double clikc in Ubuntu or "Open With Disk Image Writer"). You can see two partitions (BOOT and rootfs) when you insert the SD card to your PC. You need to use **correct files in the BOOT partition** according to the **platform you have**. Just **overwrite** the files in the base directory with the files in **board_name** directory of BOOT partiton.
62*b73660adSXianjun Jiao- Connect two antennas to RXA/TXA ports. Config the board to SD card boot mode (check your board manual). Insert the SD card to the board.
63*b73660adSXianjun Jiao- Power on. login to the board from your PC (PC Ethernet should have IP 192.168.10.1) with one time password **analog**.
642ee67178SXianjun Jiao  ```
652ee67178SXianjun Jiao  ssh [email protected]
662ee67178SXianjun Jiao  ```
67*b73660adSXianjun Jiao- Setup routing/NAT **on the PC** for the board -- this is **important** for post installation/config.
68*b73660adSXianjun Jiao  ```
69*b73660adSXianjun Jiao  sudo sysctl -w net.ipv4.ip_forward=1
702ee67178SXianjun Jiao  sudo iptables -t nat -A POSTROUTING -o ethY -j MASQUERADE
712ee67178SXianjun Jiao  sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
72*b73660adSXianjun Jiao  ```
73*b73660adSXianjun Jiao  **ethX** is the PC NIC name connecting the board. **ethY** is the PC NIC name connecting internet.
742ee67178SXianjun Jiao
75*b73660adSXianjun Jiao  If you want, uncommenting "net.ipv4.ip_forward=1" in /etc/sysctl.conf to make IP forwarding persistent on PC.
76*b73660adSXianjun Jiao- Run **one time** script on board to complete post installation/config (After this, password becomes **openwifi**)
77*b73660adSXianjun Jiao  ```
78*b73660adSXianjun Jiao  cd ~/openwifi && ./post_config.sh
79*b73660adSXianjun Jiao  ```
80*b73660adSXianjun Jiao- Run openwifi AP together with the on board webserver
81*b73660adSXianjun Jiao  ```
82*b73660adSXianjun Jiao  ~/openwifi/fosdem.sh
83*b73660adSXianjun Jiao  ```
84*b73660adSXianjun Jiao- After you see the "openwifi" SSID on your device (Phone/Laptop/etc), connect it. Browser to 192.168.13.1 on your deivce, you should see the webpage hosted by the webserver on board.
85*b73660adSXianjun Jiao  - Note 1: If your device doesn't support 5GHz (ch44), please change the **hostapd-openwifi.conf** on board and re-run fosdem.sh.
86*b73660adSXianjun Jiao  - Note 2: After ~2 hours, the Viterbi decoder will halt (Xilinx Evaluation License). Just power cycle the board if it happens.
87*b73660adSXianjun Jiao
88*b73660adSXianjun Jiao## Basic operations
89*b73660adSXianjun JiaoThe 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.
90*b73660adSXianjun Jiao- Bring up the openwifi NIC sdr0:
91*b73660adSXianjun Jiao  ```
92*b73660adSXianjun Jiao  cd ~/openwifi && ./wgd.sh
93*b73660adSXianjun Jiao  ```
94*b73660adSXianjun Jiao- Use openwifi as client to connect other AP (Change wpa-connect.conf on board firstly):
95*b73660adSXianjun Jiao  ```
962ee67178SXianjun Jiao  route del default gw 192.168.10.1
97*b73660adSXianjun Jiao  wpa_supplicant -i sdr0 -c wpa-connect.conf &
982ee67178SXianjun Jiao  dhclient sdr0
992ee67178SXianjun Jiao  ```
100*b73660adSXianjun Jiao- Use openwifi in ad-hoc mode: Please check **sdr-ad-hoc-up.sh** and **sdr-ad-hoc-join.sh**.
101*b73660adSXianjun Jiao- Use openwifi in monitor mode: Please check **monitor_ch.sh**.
102*b73660adSXianjun Jiao- The Linux native Wi-Fi tools/Apps (iwconfig/ifconfig/iwlist/iw/hostapd/wpa_supplicant/etc) can run over openwifi NIC in the same way as commercial Wi-Fi chip.
103*b73660adSXianjun Jiao- **sdrctl** is a dedicated tool to access openwifi driver/FPGA, please check doc directory for more information.
104*b73660adSXianjun Jiao
105*b73660adSXianjun Jiao## Update FPGA
106*b73660adSXianjun Jiao
107*b73660adSXianjun JiaoSince the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to udpate the fpga bitstream on board.
108*b73660adSXianjun Jiao
109*b73660adSXianjun Jiao- Install Vivado/SDK 2017.4.1 (If you don't need to generate new FPGA bitstream, WebPack version without license is enough)
110*b73660adSXianjun Jiao- Setup environment variables (use absolute path):
1112ee67178SXianjun Jiao  ```
1122ee67178SXianjun Jiao  export XILINX_DIR=your_Xilinx_directory
1132ee67178SXianjun Jiao  export OPENWIFI_DIR=your_openwifi_directory
114*b73660adSXianjun Jiao  export BOARD_NAME=your_board_name
1152ee67178SXianjun Jiao  ```
116*b73660adSXianjun Jiao- Get the latest FPGA bitstream from openwifi-hw, generate BOOT.BIN and transfer it on board via ssh channel:
1172ee67178SXianjun Jiao  ```
118*b73660adSXianjun Jiao  $OPENWIFI_DIR/user_space/get_fpga.sh $OPENWIFI_DIR
119*b73660adSXianjun Jiao  $OPENWIFI_DIR/user_space/boot_bin_gen.sh $OPENWIFI_DIR $XILINX_DIR $BOARD_NAME
120*b73660adSXianjun Jiao  scp $OPENWIFI_DIR/kernel_boot/boards/$BOARD_NAME/output_boot_bin/BOOT.BIN [email protected]:
1212ee67178SXianjun Jiao  ```
122*b73660adSXianjun Jiao- On board: Put the BOOT.BIN into the BOOT partition.
1232ee67178SXianjun Jiao  ```
124*b73660adSXianjun Jiao  mount /dev/mmcblk0p1 /mnt
125*b73660adSXianjun Jiao  cp ~/BOOT.BIN /mnt
126*b73660adSXianjun Jiao  umount /mnt
12789e3e0fbSXianjun Jiao  ```
128*b73660adSXianjun Jiao  **Power cycle** the board to load new FPGA bitstream.
1292ee67178SXianjun Jiao
130*b73660adSXianjun Jiao## Update Driver
1312ee67178SXianjun Jiao
132*b73660adSXianjun JiaoSince the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to udpate the driver on board.
133*b73660adSXianjun Jiao- Prepare Analog Devices Linux kernel source code (only need to run once):
1342ee67178SXianjun Jiao  ```
135*b73660adSXianjun Jiao  $OPENWIFI_DIR/user_space/prepare_kernel_src.sh $OPENWIFI_DIR $XILINX_DIR
1362ee67178SXianjun Jiao  ```
137*b73660adSXianjun Jiao- Compile the latest openwifi driver
1382ee67178SXianjun Jiao  ```
139*b73660adSXianjun Jiao  $OPENWIFI_DIR/driver/make_all.sh $OPENWIFI_DIR $XILINX_DIR
1402ee67178SXianjun Jiao  ```
141*b73660adSXianjun Jiao- Copy the driver files to the board via ssh channel
1422ee67178SXianjun Jiao  ```
143*b73660adSXianjun Jiao  scp `find $OPENWIFI_DIR/driver/ -name \*.ko` [email protected]:openwifi/
144*b73660adSXianjun Jiao  ```
145*b73660adSXianjun Jiao  Now you can use **wgd.sh** on board to load the new openwifi driver.
1469e8d5e4aSJiao Xianjun
147*b73660adSXianjun Jiao## Update sdrctl
148*b73660adSXianjun Jiao- Copy the sdrctl source files to the board via ssh channel
149*b73660adSXianjun Jiao  ```
150*b73660adSXianjun Jiao  scp `find $OPENWIFI_DIR/user_space/sdrctl_src/ -name \*.*` [email protected]:openwifi/sdrctl_src/
151*b73660adSXianjun Jiao  ```
152*b73660adSXianjun Jiao- Compile the sdrctl **on board**:
153*b73660adSXianjun Jiao  ```
154*b73660adSXianjun Jiao  cd ~/openwifi/sdrctl_src/ && make && cp sdrctl ../ && cd ..
155*b73660adSXianjun Jiao  ```
156*b73660adSXianjun Jiao## Easy Access and etc
1579e8d5e4aSJiao Xianjun
158*b73660adSXianjun Jiao- FPGA and driver on board update scripts
159*b73660adSXianjun Jiao  - Setup [ftp server](https://help.ubuntu.com/lts/serverguide/ftp-server.html) on PC, allow anonymous and change ftp root directory to $OPENWIFI_DIR.
160*b73660adSXianjun Jiao  - On board:
161*b73660adSXianjun Jiao  ```
162*b73660adSXianjun Jiao  ./sdcard_boot_update.sh $BOARD_NAME
1639e8d5e4aSJiao Xianjun  (Above command downloads uImage, BOOT.BIN and devicetree.dtb, then copy them into boot partition. Remember to power cycle)
1649e8d5e4aSJiao Xianjun  ./wgd.sh remote
1659e8d5e4aSJiao Xianjun  (Above command downloads driver files, and brings up sdr0)
166*b73660adSXianjun Jiao  ```
167*b73660adSXianjun Jiao- Access the board disk/rootfs like a disk:
168*b73660adSXianjun Jiao   - On PC: "File manager --> Connect to Server...", input: sftp://[email protected]/root
169*b73660adSXianjun Jiao   - Input password "openwifi"
1709e8d5e4aSJiao Xianjun
171*b73660adSXianjun Jiao## Build openwifi Linux img from scratch
172*b73660adSXianjun 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 to a SD card.
173*b73660adSXianjun Jiao- Insert the SD card to your Linux PC. Find out the mount point (that has two sub directories BOOT and rootfs), and setup environment variables (use absolute path):
1742ee67178SXianjun Jiao  ```
175*b73660adSXianjun Jiao  export SDCARD_DIR=sdcard_mount_point
176*b73660adSXianjun Jiao  export XILINX_DIR=your_Xilinx_directory
177*b73660adSXianjun Jiao  export OPENWIFI_DIR=your_openwifi_directory
178*b73660adSXianjun Jiao  export BOARD_NAME=your_board_name
179*b73660adSXianjun Jiao  ```
180*b73660adSXianjun Jiao- Run script to update SD card:
181*b73660adSXianjun Jiao  ```
182*b73660adSXianjun Jiao  $OPENWIFI_DIR/user_space/update_sdcard.sh $OPENWIFI_DIR $XILINX_DIR $BOARD_NAME $SDCARD_DIR
183*b73660adSXianjun Jiao  ```
184*b73660adSXianjun Jiao- Now you can start from [Quick start](#Quick-start)
1852ee67178SXianjun Jiao
186*b73660adSXianjun Jiao## Special note for 11b
187e17fdc17Smmehari
188e17fdc17SmmehariOpenwifi 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.
189e17fdc17Smmehari
190e17fdc17SmmehariAs a solution to this problem, openwifi can be fully controlled only if communicating with APs/clients instantiated using hostapd/wpa_supplicant userspace programs respectively.
191e17fdc17Smmehari
192e17fdc17SmmehariFor 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.
193e17fdc17Smmehari
194e17fdc17SmmehariOn 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.
195e17fdc17Smmehari```
196*b73660adSXianjun Jiao$OPENWIFI_DIR/user_space/build_wpa_supplicant_wo11b.sh $OPENWIFI_DIR
197e17fdc17Smmehari```
198*b73660adSXianjun Jiao## Porting guide
199e17fdc17Smmehari
200*b73660adSXianjun JiaoThis section explains the porting work by showing the differences between openwifi and Analog Devices reference design. We use **2018_r1** of [HDL Reference Designs](https://github.com/analogdevicesinc/hdl).
201*b73660adSXianjun Jiao- Open the fmcomms2 + zc706 reference design at hdl/projects/fmcomms2/zc706 (Please read Analog Devices help)
202*b73660adSXianjun Jiao- Open the openwifi design zc706_fmcs2 at openwifi-hw/boards/zc706_fmcs2 (Please read openwifi-hw repository)
203*b73660adSXianjun Jiao- "Open Block Design", you will see the differences between openwifi and the reference design. Both in "diagram" and in "Address Editor".
204*b73660adSXianjun Jiao- The address/interrupts of FPGA blocks hooked to the ARM bus should be put/aligned to the devicetree file openwifi/kernel_boot/boards/zc706_fmcs2/devicetree.dts. Linux will parse the devicetree.dtb when booting to know information of attached deivce (FPGA blocks in our case).
205*b73660adSXianjun Jiao- We use dtc command to get devicetree.dts converted from devicetree.dtb in [Analog Devices Linux image](https://wiki.analog.com/resources/tools-software/linux-software/zynq_images), then do modification according to what we have added/modified to the reference design.
206*b73660adSXianjun Jiao- Please learn the script in [[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)] to understand how we generate devicetree.dtb, BOOT.BIN and Linux kernel uImage and put them together to build the full SD card image.
207*b73660adSXianjun Jiao
208*b73660adSXianjun Jiao## Cite openwifi project
20944dff4bdSJiao Xianjun
21044dff4bdSJiao XianjunAny use of openwifi project which results in a publication should include a citation via (bibtex example):
21144dff4bdSJiao Xianjun```
21244dff4bdSJiao Xianjun@electronic{openwifigithub,
21344dff4bdSJiao Xianjun            author = {Xianjun, Jiao and Wei, Liu and Michael, Mehari},
21444dff4bdSJiao Xianjun            title = {open-source IEEE802.11/Wi-Fi baseband chip/FPGA design},
21544dff4bdSJiao Xianjun            url = {https://github.com/open-sdr/openwifi},
21644dff4bdSJiao Xianjun            year = {2019},
21744dff4bdSJiao Xianjun}
21844dff4bdSJiao Xianjun```
219*b73660adSXianjun JiaoOpenwifi was born in [ORCA project](https://www.orca-project.eu/) (EU's Horizon2020 programme under agreement number 732174).
220