xref: /openwifi/doc/app_notes/packet-iq-self-loopback-test.md (revision dbcf06d18f2fbd5c8842b569db896ecd4d1e96cf)
1529690b6SJiao Xianjun<!--
2529690b6SJiao XianjunAuthor: Xianjun Jiao
3529690b6SJiao XianjunSPDX-FileCopyrightText: 2022 UGent
4529690b6SJiao XianjunSPDX-License-Identifier: AGPL-3.0-or-later
5529690b6SJiao Xianjun-->
6529690b6SJiao Xianjun
7529690b6SJiao XianjunOne super power of the openwifi platform is "**Full Duplex**" which means that openwifi baseband can receive its own TX signal.
8529690b6SJiao XianjunThis makes the IQ sample and WiFi packet self loopback test possible. Reading the normal IQ sample capture [app note](iq.md) will help if you have issue or
9529690b6SJiao Xianjunwant to understand openwifi side channel (for IQ and CSI) deeper.
10529690b6SJiao Xianjun![](./openwifi-loopback-principle.jpg)
11529690b6SJiao Xianjun
12529690b6SJiao Xianjun[[IQ self loopback quick start](#IQ-self-loopback-quick-start)]
13529690b6SJiao Xianjun[[Check the packet loopback on board](#Check-the-packet-loopback-on-board)]
14529690b6SJiao Xianjun[[Self loopback config](#Self-loopback-config)]
15529690b6SJiao Xianjun
16529690b6SJiao Xianjun## IQ self loopback quick start
17529690b6SJiao Xianjun(Please replace the IQ length **8187** by **4095** if you use low end FPGA board: zedboard/adrv9464z7020/antsdr/zc702)
18529690b6SJiao Xianjun- Power on the SDR board.
19529690b6SJiao Xianjun- Put the Tx and Rx antenna as close as possible.
20529690b6SJiao Xianjun- Connect a computer to the SDR board via Ethernet cable. The computer should have static IP 192.168.10.1. Open a terminal on the computer, and then in the terminal:
21529690b6SJiao Xianjun  ```
22529690b6SJiao Xianjun  ssh [email protected]
23529690b6SJiao Xianjun  (password: openwifi)
24529690b6SJiao Xianjun  cd openwifi
25529690b6SJiao Xianjun  ./wgd.sh
26529690b6SJiao Xianjun  (Bring up the openwifi NIC sdr0)
27529690b6SJiao Xianjun  ./monitor_ch.sh sdr0 44
28529690b6SJiao Xianjun  (Setup monitor mode in WiFi channel 44. You should find a channel as clean as possible in your location)
29529690b6SJiao Xianjun  insmod side_ch.ko iq_len_init=8187
30529690b6SJiao Xianjun  ./side_ch_ctl wh11d0
31529690b6SJiao Xianjun  (Set 0 to register 11. It means the pre trigger length is 0, so we only capture IQ after trigger condition is met)
32529690b6SJiao Xianjun  ./side_ch_ctl wh8d16
33529690b6SJiao Xianjun  (Set 16 to register 8 -- set trigger condition to phy_tx_started signal from openofdm tx core)
34529690b6SJiao Xianjun  ./sdrctl dev sdr0 set reg xpu 1 1
35529690b6SJiao Xianjun  (Unmute the baseband self-receiving to receive openwifi own TX signal/packet -- important for self loopback!)
36*dbcf06d1SJiao Xianjun  ./side_ch_ctl wh5h0
37*dbcf06d1SJiao Xianjun  (Set the loopback mode to over-the-air)
38529690b6SJiao Xianjun  ./side_ch_ctl g0
39*dbcf06d1SJiao Xianjun  (Relay the FPGA IQ capture to the host computer that will show the captured IQ later on)
40529690b6SJiao Xianjun  ```
41529690b6SJiao Xianjun  You should see on outputs like:
42529690b6SJiao Xianjun  ```
43529690b6SJiao Xianjun  loop 22848 side info count 0
44529690b6SJiao Xianjun  loop 22912 side info count 0
45529690b6SJiao Xianjun  ...
46529690b6SJiao Xianjun  ```
47529690b6SJiao Xianjun  Now the count is always 0, because we haven't instructed openwifi to send packet for loopback test.
48529690b6SJiao Xianjun
49529690b6SJiao Xianjun- Leave above ssh session untouched. Open a new ssh session to the board from your computer. Then run on board:
50529690b6SJiao Xianjun  ```
51529690b6SJiao Xianjun  cd openwifi/inject_80211/
52529690b6SJiao Xianjun  make
53529690b6SJiao Xianjun  (Build our example packet injection program)
54529690b6SJiao Xianjun  ./inject_80211 -m n -r 5 -n 1 sdr0
55529690b6SJiao Xianjun  (Inject one packet to openwifi sdr0 NIC)
56529690b6SJiao Xianjun  ```
57529690b6SJiao Xianjun  Normally in the previous ssh session, the count becomes 1. It means one packet (of IQ sample) is sent and captured via loopback over the air.
58529690b6SJiao Xianjun
59529690b6SJiao Xianjun- On your computer (NOT ssh onboard!), run:
60529690b6SJiao Xianjun  ```
61529690b6SJiao Xianjun  cd openwifi/user_space/side_ch_ctl_src
62529690b6SJiao Xianjun  python3 iq_capture.py 8187
63529690b6SJiao Xianjun  ```
64529690b6SJiao Xianjun  You might need to install beforehand: "sudo apt install python3-numpy", and "sudo apt install python3-matplotlib".
65529690b6SJiao Xianjun
66529690b6SJiao Xianjun- Leave the above host session untouched. Let's go to the second ssh session (packet injection), and do single packet Tx again:
67529690b6SJiao Xianjun  ```
68529690b6SJiao Xianjun  ./inject_80211 -m n -r 5 -n 1 sdr0
69529690b6SJiao Xianjun  ```
70529690b6SJiao Xianjun  Normally in the 1st ssh session, the count becomes 2. You should also see IQ sample capture figures like this:
71529690b6SJiao Xianjun  ![](./openwifi-iq-loopback.jpg)
72529690b6SJiao Xianjun
73529690b6SJiao Xianjun- Stop the python3 script, which plots above, in the host session. A file **iq.txt** is generated. You can use the Matlab script test_iq_file_display.m
74529690b6SJiao Xianjunto do further offline analysis, or feed the IQ sample to the openwifi receiver simulation, etc.
75529690b6SJiao Xianjun
76529690b6SJiao Xianjun## Check the packet loopback on board
77529690b6SJiao Xianjun
78529690b6SJiao Xianjun- While signal/packet is looped back, you can capture it on board via normal sniffer program for further check/analysis on the packet (bit/byte level instead of IQ level), such as tcpdump or tshark.
79529690b6SJiao Xianjun  A new ssh session to the board should be opened to do this before running the packet injection:
80529690b6SJiao Xianjun  ```
81529690b6SJiao Xianjun  tcpdump -i sdr0
82529690b6SJiao Xianjun  ```
83*dbcf06d1SJiao Xianjun  Run the packet injection "./inject_80211 -m n -r 5 -n 1 sdr0" in another session, you should see the packet information printed by tcpdump from self over-the-air loopback.
84529690b6SJiao Xianjun
85529690b6SJiao Xianjun- You can also see the openwifi printk message of Rx packet (self Tx looped back) while the packet comes to the openwifi Rx interrupt.
86529690b6SJiao Xianjun  A new ssh session to the board should be opened to do this before running the packet injection:
87529690b6SJiao Xianjun  ```
88529690b6SJiao Xianjun  cd openwifi
89529690b6SJiao Xianjun  ./sdrctl dev sdr0 set reg drv_rx 7 7
90*dbcf06d1SJiao Xianjun  ./sdrctl dev sdr0 set reg drv_tx 7 7
91*dbcf06d1SJiao Xianjun  (Turn on the openwifi Tx/Rx printk logging)
92529690b6SJiao Xianjun  ```
93*dbcf06d1SJiao Xianjun  Stop the "./side_ch_ctl g0" in the very first ssh session. Run the packet injection, then check the printk message:
94529690b6SJiao Xianjun  ```
95*dbcf06d1SJiao Xianjun  ./inject_80211/inject_80211 -m n -r 5 -n 1 sdr0
96529690b6SJiao Xianjun  dmesg
97529690b6SJiao Xianjun  ```
98*dbcf06d1SJiao Xianjun  You should see the printk message of packet Tx and Rx from the openwifi driver (sdr.c).
99529690b6SJiao Xianjun
100529690b6SJiao Xianjun## Self loopback config
101529690b6SJiao Xianjun
102529690b6SJiao Xianjun- By default, the loopback is via the air (from Tx antenna to Rx antenna). FPGA inernal loopback option is offered to have IQ sample and packet without
103*dbcf06d1SJiao Xianjun  any interference. To have FPGA internal loopback, replace the "./side_ch_ctl wh5h0" during setup (the very 1st ssh session) by:
104529690b6SJiao Xianjun  ```
105529690b6SJiao Xianjun  ./side_ch_ctl wh5h4
106529690b6SJiao Xianjun  ```
107529690b6SJiao Xianjun- Lots of packet injection parameters can be set: number of packet, type (data/control/management), MCS/rate, size, interval, etc. Please run the packet injection
108529690b6SJiao Xianjun  program without any arguments to see the help.
109529690b6SJiao Xianjun
110529690b6SJiao Xianjun- Besides the packet Tx via injection over monitor mode for loopback test, normal WiFi mode (AP/Client/ad-hoc) can also run together with self loopback.
111529690b6SJiao Xianjun  For instance, run **fosdem.sh** instead of **wgd.sh** to setup an openwifi AP that will transmit beacons. The wgd.sh can also be replaced with other scenario
112529690b6SJiao Xianjun  setup scripts. Please check [Application notes](README.md)
113529690b6SJiao Xianjun
114529690b6SJiao Xianjun- To understand deeper of all above commands/settings, please refer to [Capture IQ sample, AGC gain, RSSI with many types of trigger condition](iq.md) and
115529690b6SJiao Xianjun  [Capture dual antenna TX/RX IQ for multi-purpose (capture collision)](iq_2ant.md)
116