1a6085186SLina Ceballos<!-- 23b4065baSJiao XianjunAuthor: Xianjun jiao, Michael Mehari, Wei Liu 3f1d0fee3SJiao XianjunSPDX-FileCopyrightText: 2019 UGent 4a6085186SLina CeballosSPDX-License-Identifier: AGPL-3.0-or-later 5a6085186SLina Ceballos--> 6a6085186SLina Ceballos 70df4ca4dSimoerman# openwifi 82ee67178SXianjun Jiao<img src="./openwifi-arch.jpg" width="900"> 92ee67178SXianjun Jiao 1038f76c01SJiao Xianjun**openwifi:** Linux mac80211 compatible full-stack IEEE802.11/Wi-Fi design based on SDR (Software Defined Radio). 112ee67178SXianjun Jiao 12f4c9b072SXianjun JiaoThis 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. 13525f977bSJiao Xianjun 14a2ffb301SXianjun Jiao[[Quick start](#Quick-start)] 15a2ffb301SXianjun Jiao[[Project document](doc/README.md)] 16a2ffb301SXianjun Jiao[[Application notes](doc/app_notes/README.md)] 17dc7c18bfSJiao Xianjun[[Videos](doc/videos.md)] 184046c688SJiao Xianjun[[Publications and How to Cite](doc/publications.md)] 19a2ffb301SXianjun Jiao[[maillist](https://lists.ugent.be/wws/subscribe/openwifi)] 202ee67178SXianjun Jiao 211ee5906aSJiao XianjunOpenwifi code has dual licenses. [AGPLv3](https://github.com/open-sdr/openwifi/blob/master/LICENSE) is the opensource license. For non-opensource and advanced feature 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). 222ee67178SXianjun Jiao 232ee67178SXianjun Jiao**Features:** 242ee67178SXianjun Jiao 2594c4a85fSJiao Xianjun- 802.11a/g/n [[IEEE 802.11n (Wi-Fi 4)](doc/app_notes/ieee80211n.md)] 26*81493bdcSJiao Xianjun- 20MHz bandwidth; [70 MHz to 6 GHz frequency range](doc/README.md#let-openwifi-work-at-arbitrary-frequency) 27*81493bdcSJiao Xianjun- Mode tested: [Ad-hoc](doc/app_notes/ad-hoc-two-sdr.md); [Station; AP](doc/app_notes/ap-client-two-sdr.md), Monitor 28*81493bdcSJiao Xianjun- [DCF (CSMA/CA) low MAC layer in FPGA (10us SIFS is achieved)](doc/app_notes/frequent_trick.md) 29a2ffb301SXianjun Jiao- [802.11 packet injection and fuzzing](doc/app_notes/inject_80211.md) 30d14d06e5SXianjun Jiao- [CSI](doc/app_notes/csi.md): Channel State Information, freq offset, equalizer to computer 31b49db4c5SXianjun Jiao- [CSI fuzzer](doc/app_notes/csi_fuzzer.md): Create artificial channel response in WiFi transmitter 32*81493bdcSJiao Xianjun- [CSI radar](doc/app_notes/radar-self-csi.md) 33d14d06e5SXianjun Jiao- [[IQ capture](doc/app_notes/iq.md)]: real-time AGC, RSSI, IQ sample to computer. [[Dual antenna version](doc/app_notes/iq_2ant.md)] 34*81493bdcSJiao Xianjun- [Configurable channel access priority parameters](doc/app_notes/frequent_trick.md): 35*81493bdcSJiao Xianjun - CCA threshold, receiver sensitivity, etc 36b73660adSXianjun Jiao - duration of RTS/CTS, CTS-to-self 37b73660adSXianjun Jiao - SIFS/DIFS/xIFS/slot-time/CW/etc 38*81493bdcSJiao Xianjun- [Time slicing based on MAC address (time gated/scheduled FPGA queues)](https://doc.ilabt.imec.be/ilabt/wilab/tutorials/openwifi.html#sdr-tx-time-slicing) 39*81493bdcSJiao Xianjun- Easy to change bandwidth and [frequency](doc/README.md#let-openwifi-work-at-arbitrary-frequency): 40b73660adSXianjun Jiao - 2MHz for 802.11ah in sub-GHz 41b73660adSXianjun Jiao - 10MHz for 802.11p/vehicle in 5.9GHz 42a2ffb301SXianjun Jiao- **802.11ax** under development 432ee67178SXianjun Jiao 44b73660adSXianjun Jiao**Performance (AP: openwifi at channel 44, client: TL-WDN4200 N900 USB Dongle):** 45b73660adSXianjun Jiao- AP --> client: 30.6Mbps(TCP), 38.8Mbps(UDP) 46b73660adSXianjun Jiao- client --> AP: 17.0Mbps(TCP), 21.5Mbps(UDP) 472ee67178SXianjun Jiao 48b73660adSXianjun Jiao**Supported SDR platforms:** (Check [Porting guide](#Porting-guide) for your new board if it isn't in the list) 492ee67178SXianjun Jiao 50a2ffb301SXianjun Jiaoboard_name|board combination|status|SD card img|Vivado license 51a2ffb301SXianjun Jiao-------|-------|----|----|----- 521b00373fSJiao Xianjunzc706_fmcs2|[Xilinx ZC706 board](https://www.xilinx.com/products/boards-and-kits/ek-z7-zc706-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.0-wilsele-32bit.img.xz)|Need 531b00373fSJiao Xianjunzed_fmcs2|[Xilinx zed board](https://www.xilinx.com/products/boards-and-kits/1-8dyf-11.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.0-wilsele-32bit.img.xz)|**NO** need 541b00373fSJiao Xianjunadrv9364z7020|[ADRV9364-Z7020 + ADRV1CRR-BOB](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/adrv9364-z7020.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.0-wilsele-32bit.img.xz)|**NO** need 551b00373fSJiao Xianjunadrv9361z7035|[ADRV9361-Z7035 + ADRV1CRR-BOB/FMC](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/ADRV9361-Z7035.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.0-wilsele-32bit.img.xz)|Need 561b00373fSJiao Xianjunzc702_fmcs2|[Xilinx ZC702 board](https://www.xilinx.com/products/boards-and-kits/ek-z7-zc702-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.0-wilsele-32bit.img.xz)|**NO** need 571b00373fSJiao Xianjunantsdr|[MicroPhase](https://github.com/MicroPhase/) enhanced ADALM-PLUTO [Notes](kernel_boot/boards/antsdr/notes.md)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.0-wilsele-32bit.img.xz)|**NO** need 58d5242439SJiao Xianjunzcu102_fmcs2|[Xilinx ZCU102 board](https://www.xilinx.com/products/boards-and-kits/ek-u1-zcu102-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Done|[64bit img](https://users.ugent.be/~xjiao/openwifi-1.3.0-wilsele-64bit.img.xz)|Need 59f65d9fc8SJiao Xianjunzcu102_9371|[Xilinx ZCU102 board](https://www.xilinx.com/products/boards-and-kits/ek-u1-zcu102-g.html) + [ADRV9371](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-adrv9371.html)|Future|Future|Need 609e696164SXianjun Jiao 61b73660adSXianjun Jiao- board_name is used to identify FPGA design in openwifi-hw/boards/ 62b73660adSXianjun 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. 632ee67178SXianjun Jiao 64b73660adSXianjun Jiao[[Quick start](#Quick-start)] 65b73660adSXianjun Jiao[[Basic operations](#Basic-operations)] 66b73660adSXianjun Jiao[[Update FPGA](#Update-FPGA)] 67b73660adSXianjun Jiao[[Update Driver](#Update-Driver)] 68b73660adSXianjun Jiao[[Update sdrctl](#Update-sdrctl)] 69b73660adSXianjun Jiao[[Easy Access and etc](#Easy-Access-and-etc)] 702ee67178SXianjun Jiao 71b73660adSXianjun Jiao[[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)] 72b73660adSXianjun Jiao[[Special note for 11b](#Special-note-for-11b)] 73b73660adSXianjun Jiao[[Porting guide](#Porting-guide)] 74d9e94a69SJiao Xianjun[[Project document](doc/README.md)] 7575890522SJiao Xianjun[[Application notes](doc/app_notes/README.md)] 762ee67178SXianjun Jiao 77b73660adSXianjun Jiao## Quick start 781f288d27SJiao Xianjun- Restore openwifi board specific img file (from the table) into a SD card. To do this, program "Disks" in Ubuntu can be used (Install: "sudo apt install gnome-disk-utility"). After restoring, the SD card should have two partitions: BOOT and rootfs. You need to config the **correct files in the BOOT partition** according to the **board you have** by operation on your computer: 79b1dd94e3Sluz paz - Copy files in **openwifi/board_name** to the base directory of BOOT partition. 80b1dd94e3Sluz paz - Copy **openwifi/zynqmp-common/Image** (zcu102 board) or **openwifi/zynq-common/uImage** (other boards) to the base directory of BOOT partition 819d56afc0SJiao Xianjun- Connect two antennas to RXA/TXA ports. Config the board to SD card boot mode (check the board manual). Insert the SD card to the board. Power on. 829d56afc0SJiao Xianjun- Login to the board from your PC (PC Ethernet should have IP 192.168.10.1) with password **openwifi**. 832ee67178SXianjun Jiao ``` 842ee67178SXianjun Jiao ssh [email protected] 852ee67178SXianjun Jiao ``` 869d56afc0SJiao Xianjun- On board, run openwifi AP and the on board webserver 879d56afc0SJiao Xianjun ``` 88f4c9b072SXianjun Jiao ~/openwifi/fosdem.sh 89f4c9b072SXianjun Jiao (Use "./fosdem.sh 1" to enable experimental AMPDU aggregation on top of 11n) 90f4c9b072SXianjun Jiao (Use "./fosdem-11ag.sh" to force 11a/g mode) 919d56afc0SJiao Xianjun ``` 920fae09a8SJiao Xianjun **NOTE** adrv9361z7035 has ultra low TX power in 5GHz. Move **CLOSER** when you use that board in 5GHz!!! 93b1dd94e3Sluz paz- After you see the "openwifi" SSID on your device (Phone/Laptop/etc), connect it. Browser to 192.168.13.1 on your device, you should see the webpage hosted by the webserver on board. 949d56afc0SJiao Xianjun - Note 1: If your device doesn't support 5GHz (ch44), please change the **hostapd-openwifi.conf** on board and re-run fosdem.sh. 959d56afc0SJiao Xianjun - Note 2: After ~2 hours, the Viterbi decoder will halt (Xilinx Evaluation License). Just power cycle the board if it happens. (If output of "./sdrctl dev sdr0 get reg rx 20" is always the same, it means the decoder halts) 960a9ca3b0SDaniel Bovensiepen Li- To give the Wi-Fi client internet access, configure routing/NAT **on the PC**: 97b73660adSXianjun Jiao ``` 98b73660adSXianjun Jiao sudo sysctl -w net.ipv4.ip_forward=1 99a2ffb301SXianjun Jiao sudo iptables -t nat -A POSTROUTING -o NICY -j MASQUERADE 1002ee67178SXianjun Jiao sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX 101b73660adSXianjun Jiao ``` 102a2ffb301SXianjun Jiao **ethX** is the PC NIC name connecting the board ethernet. **NICY** is the PC NIC name connecting internet (WiFi or another ethernet). 1032ee67178SXianjun Jiao 104b73660adSXianjun Jiao If you want, uncommenting "net.ipv4.ip_forward=1" in /etc/sysctl.conf to make IP forwarding persistent on PC. 10522dd0cc4SXianjun Jiao- To monitor **real-time CSI (Chip State Information)**, such as timestamp, frequency offset, channel state, equalizer, please refer to [[CSI notes](doc/app_notes/csi.md)]. 106b73660adSXianjun Jiao 107b73660adSXianjun Jiao## Basic operations 108b73660adSXianjun 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. 109b73660adSXianjun Jiao- Bring up the openwifi NIC sdr0: 110b73660adSXianjun Jiao ``` 111b73660adSXianjun Jiao cd ~/openwifi && ./wgd.sh 112f4c9b072SXianjun Jiao (Use "./wgd.sh 1" to enable experimental AMPDU aggregation) 113b73660adSXianjun Jiao ``` 114b73660adSXianjun Jiao- Use openwifi as client to connect other AP (Change wpa-connect.conf on board firstly): 115b73660adSXianjun Jiao ``` 1162ee67178SXianjun Jiao route del default gw 192.168.10.1 117b73660adSXianjun Jiao wpa_supplicant -i sdr0 -c wpa-connect.conf & 1182ee67178SXianjun Jiao dhclient sdr0 1192ee67178SXianjun Jiao ``` 120b73660adSXianjun Jiao- Use openwifi in ad-hoc mode: Please check **sdr-ad-hoc-up.sh** and **sdr-ad-hoc-join.sh**. 121b73660adSXianjun Jiao- Use openwifi in monitor mode: Please check **monitor_ch.sh**. 122b73660adSXianjun 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. 123b73660adSXianjun Jiao- **sdrctl** is a dedicated tool to access openwifi driver/FPGA, please check doc directory for more information. 124b73660adSXianjun Jiao 125b73660adSXianjun Jiao## Update FPGA 126b73660adSXianjun Jiao 127b1dd94e3Sluz pazSince the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to update the fpga bitstream on board. 128b73660adSXianjun Jiao 12920dd8379SJiao Xianjun- Install Vivado/SDK 2018.3 (Vivado Design Suite - HLx Editions - 2018.3 Full Product Installation. If you don't need to generate new FPGA bitstream, WebPack version without license is enough) 130b73660adSXianjun Jiao- Setup environment variables (use absolute path): 1312ee67178SXianjun Jiao ``` 13220dd8379SJiao Xianjun export XILINX_DIR=your_Xilinx_install_directory 13320dd8379SJiao Xianjun (Example: export XILINX_DIR=/opt/Xilinx. The Xilinx directory should include sth like: Downloads, SDK, Vivado, xic) 134abdb610fSJiao Xianjun export OPENWIFI_HW_DIR=your_openwifi-hw_directory 13520dd8379SJiao Xianjun (The directory where you store the open-sdr/openwifi-hw repo via git clone) 136b73660adSXianjun Jiao export BOARD_NAME=your_board_name 1372ee67178SXianjun Jiao ``` 138abdb610fSJiao Xianjun- Pick the FPGA bitstream from openwifi-hw, and generate BOOT.BIN and transfer it on board via ssh channel: 1392ee67178SXianjun Jiao ``` 140febc5adfSXianjun Jiao For Zynq 7000: 141abdb610fSJiao Xianjun 142abdb610fSJiao Xianjun cd openwifi/user_space; ./boot_bin_gen.sh $OPENWIFI_HW_DIR $XILINX_DIR $BOARD_NAME 143febc5adfSXianjun Jiao 144febc5adfSXianjun Jiao For Zynq MPSoC (like zcu102 board): 145abdb610fSJiao Xianjun cd openwifi/user_space; ./boot_bin_gen_zynqmp.sh $OPENWIFI_HW_DIR $XILINX_DIR $BOARD_NAME 146febc5adfSXianjun Jiao 147abdb610fSJiao Xianjun cd openwifi/kernel_boot/boards/$BOARD_NAME/output_boot_bin; scp ./BOOT.BIN [email protected]: 1482ee67178SXianjun Jiao ``` 149b73660adSXianjun Jiao- On board: Put the BOOT.BIN into the BOOT partition. 1502ee67178SXianjun Jiao ``` 151b73660adSXianjun Jiao mount /dev/mmcblk0p1 /mnt 152b73660adSXianjun Jiao cp ~/BOOT.BIN /mnt 153f4c9b072SXianjun Jiao cd /mnt 154f4c9b072SXianjun Jiao sync 155f4c9b072SXianjun Jiao cd ~ 156b73660adSXianjun Jiao umount /mnt 15789e3e0fbSXianjun Jiao ``` 158b73660adSXianjun Jiao **Power cycle** the board to load new FPGA bitstream. 1592ee67178SXianjun Jiao 160b73660adSXianjun Jiao## Update Driver 1612ee67178SXianjun Jiao 162b1dd94e3Sluz pazSince the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to update the driver on board. 163b73660adSXianjun Jiao- Prepare Analog Devices Linux kernel source code (only need to run once): 1642ee67178SXianjun Jiao ``` 165abdb610fSJiao Xianjun cd openwifi/user_space; ./prepare_kernel.sh $XILINX_DIR ARCH_BIT build 166febc5adfSXianjun Jiao (For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64) 1672ee67178SXianjun Jiao ``` 168f773d8deSJiao Xianjun **Note**: In Ubuntu, gcc-10 might have issue ('yylloc' error), so use gcc-9 if you encounter error. 169b73660adSXianjun Jiao- Compile the latest openwifi driver 1702ee67178SXianjun Jiao ``` 171abdb610fSJiao Xianjun cd openwifi/driver; ./make_all.sh $XILINX_DIR ARCH_BIT 172febc5adfSXianjun Jiao (For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64) 1732ee67178SXianjun Jiao ``` 174b73660adSXianjun Jiao- Copy the driver files to the board via ssh channel 1752ee67178SXianjun Jiao ``` 176abdb610fSJiao Xianjun cd openwifi/driver; scp `find ./ -name \*.ko` [email protected]:openwifi/ 177b73660adSXianjun Jiao ``` 178b73660adSXianjun Jiao Now you can use **wgd.sh** on board to load the new openwifi driver. 17919bec082SJiao Xianjun **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 to follow [[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)] to generate your new SD card image. 1809e8d5e4aSJiao Xianjun 181b73660adSXianjun Jiao## Update sdrctl 182b73660adSXianjun Jiao- Copy the sdrctl source files to the board via ssh channel 183b73660adSXianjun Jiao ``` 184abdb610fSJiao Xianjun cd openwifi/user_space/sdrctl_src; scp `find ./ -name \*` [email protected]:openwifi/sdrctl_src/ 185b73660adSXianjun Jiao ``` 186b73660adSXianjun Jiao- Compile the sdrctl **on board**: 187b73660adSXianjun Jiao ``` 188b73660adSXianjun Jiao cd ~/openwifi/sdrctl_src/ && make && cp sdrctl ../ && cd .. 189b73660adSXianjun Jiao ``` 190b73660adSXianjun Jiao## Easy Access and etc 1919e8d5e4aSJiao Xianjun 192b73660adSXianjun Jiao- FPGA and driver on board update scripts 193981758c0SXianjun Jiao - Setup [ftp server](https://ubuntu.com/server/docs/service-ftp) on PC, allow anonymous and change ftp root directory to the openwifi directory. 194b73660adSXianjun Jiao - On board: 195b73660adSXianjun Jiao ``` 196b73660adSXianjun Jiao ./sdcard_boot_update.sh $BOARD_NAME 1979e8d5e4aSJiao Xianjun (Above command downloads uImage, BOOT.BIN and devicetree.dtb, then copy them into boot partition. Remember to power cycle) 1989e8d5e4aSJiao Xianjun ./wgd.sh remote 1999e8d5e4aSJiao Xianjun (Above command downloads driver files, and brings up sdr0) 200b73660adSXianjun Jiao ``` 201b73660adSXianjun Jiao- Access the board disk/rootfs like a disk: 202b73660adSXianjun Jiao - On PC: "File manager --> Connect to Server...", input: sftp://[email protected]/root 203b73660adSXianjun Jiao - Input password "openwifi" 2049e8d5e4aSJiao Xianjun 205b73660adSXianjun Jiao## Build openwifi Linux img from scratch 206f4c9b072SXianjun Jiao- Install the devicetree compiler -- dtc. (For Ubuntu: sudo apt install device-tree-compiler) 207f4c9b072SXianjun Jiao- Install the mkimage tool. (For Ubuntu: sudo apt install u-boot-tools) 208f4c9b072SXianjun Jiao- Download [2019_R1-2020_06_22.img.xz](http://swdownloads.analog.com/cse/2019_R1-2020_06_22.img.xz) from [Analog Devices Wiki](https://wiki.analog.com/resources/tools-software/linux-software/zynq_images). Burn it to a SD card. 209b73660adSXianjun 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): 2102ee67178SXianjun Jiao ``` 211b73660adSXianjun Jiao export SDCARD_DIR=sdcard_mount_point 21220dd8379SJiao Xianjun export XILINX_DIR=your_Xilinx_install_directory 213abdb610fSJiao Xianjun export OPENWIFI_HW_DIR=your_openwifi-hw_directory 214b73660adSXianjun Jiao export BOARD_NAME=your_board_name 215b73660adSXianjun Jiao ``` 216b73660adSXianjun Jiao- Run script to update SD card: 217b73660adSXianjun Jiao ``` 218abdb610fSJiao Xianjun cd openwifi/user_space; ./update_sdcard.sh $OPENWIFI_HW_DIR $XILINX_DIR $BOARD_NAME $SDCARD_DIR 219b73660adSXianjun Jiao ``` 2209d56afc0SJiao Xianjun- Config your board to SD card boot mode (check the board manual). Insert the SD card to the board. Power on. 2219d56afc0SJiao Xianjun- Login to the board from your PC (PC Ethernet should have IP 192.168.10.1) with one time password **analog**. 2229d56afc0SJiao Xianjun ``` 2239d56afc0SJiao Xianjun ssh [email protected] 2249d56afc0SJiao Xianjun ``` 2259d56afc0SJiao Xianjun- Setup routing/NAT **on the PC** for your board -- this internet connection is **important** for post installation/config. 2269d56afc0SJiao Xianjun ``` 2279d56afc0SJiao Xianjun sudo sysctl -w net.ipv4.ip_forward=1 228a2ffb301SXianjun Jiao sudo iptables -t nat -A POSTROUTING -o NICY -j MASQUERADE 2299d56afc0SJiao Xianjun sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX 2309d56afc0SJiao Xianjun ``` 231a2ffb301SXianjun Jiao **ethX** is the PC NIC name connecting the board ethernet. **NICY** is the PC NIC name connecting internet (WiFi or another ethernet). 2329d56afc0SJiao Xianjun 2339d56afc0SJiao Xianjun If you want, uncommenting "net.ipv4.ip_forward=1" in /etc/sysctl.conf to make IP forwarding persistent on PC. 2349d56afc0SJiao Xianjun- Run **one time** script on board to complete post installation/config (After this, password becomes **openwifi**) 2359d56afc0SJiao Xianjun ``` 2369d56afc0SJiao Xianjun cd ~/openwifi && ./post_config.sh 2379d56afc0SJiao Xianjun ``` 2389d56afc0SJiao Xianjun- Now you can start from [Quick start](#Quick-start) (Skip the image download and burn step) 2392ee67178SXianjun Jiao 240b73660adSXianjun Jiao## Special note for 11b 241e17fdc17Smmehari 242e17fdc17SmmehariOpenwifi 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. 243e17fdc17Smmehari 244e17fdc17SmmehariAs a solution to this problem, openwifi can be fully controlled only if communicating with APs/clients instantiated using hostapd/wpa_supplicant userspace programs respectively. 245e17fdc17Smmehari 246e17fdc17SmmehariFor 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. 247e17fdc17Smmehari 248e17fdc17SmmehariOn 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. 249e17fdc17Smmehari``` 250b1633ad3SJiao Xianjunsudo apt-get install libssl1.0-dev 251abdb610fSJiao Xianjuncd openwifi/user_space; ./build_wpa_supplicant_wo11b.sh 252e17fdc17Smmehari``` 253b73660adSXianjun Jiao## Porting guide 254e17fdc17Smmehari 255fbcc0b46SJiao XianjunThis section explains the porting work by showing the differences between openwifi and Analog Devices reference design. openwifi is based on 2019_R1 of [HDL Reference Designs](https://github.com/analogdevicesinc/hdl). 256b73660adSXianjun Jiao- Open the fmcomms2 + zc706 reference design at hdl/projects/fmcomms2/zc706 (Please read Analog Devices help) 257b73660adSXianjun Jiao- Open the openwifi design zc706_fmcs2 at openwifi-hw/boards/zc706_fmcs2 (Please read openwifi-hw repository) 258b73660adSXianjun Jiao- "Open Block Design", you will see the differences between openwifi and the reference design. Both in "diagram" and in "Address Editor". 259b1dd94e3Sluz paz- 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 device (FPGA blocks in our case). 260b73660adSXianjun 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. 261b73660adSXianjun 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. 262b73660adSXianjun Jiao 2636aae74b0SLina Ceballos## License 2646aae74b0SLina Ceballos 2656aae74b0SLina CeballosThis 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. 266