xref: /openwifi/doc/app_notes/packet-iq-self-loopback-test.md (revision 529690b6c13bac1ace4a4b39d024c22611c84db0)
1<!--
2Author: Xianjun Jiao
3SPDX-FileCopyrightText: 2022 UGent
4SPDX-License-Identifier: AGPL-3.0-or-later
5-->
6
7One super power of the openwifi platform is "**Full Duplex**" which means that openwifi baseband can receive its own TX signal.
8This 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
9want to understand openwifi side channel (for IQ and CSI) deeper.
10![](./openwifi-loopback-principle.jpg)
11
12[[IQ self loopback quick start](#IQ-self-loopback-quick-start)]
13[[Check the packet loopback on board](#Check-the-packet-loopback-on-board)]
14[[Self loopback config](#Self-loopback-config)]
15
16## IQ self loopback quick start
17(Please replace the IQ length **8187** by **4095** if you use low end FPGA board: zedboard/adrv9464z7020/antsdr/zc702)
18- Power on the SDR board.
19- Put the Tx and Rx antenna as close as possible.
20- 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:
21  ```
22  ssh [email protected]
23  (password: openwifi)
24  cd openwifi
25  ./wgd.sh
26  (Bring up the openwifi NIC sdr0)
27  ./monitor_ch.sh sdr0 44
28  (Setup monitor mode in WiFi channel 44. You should find a channel as clean as possible in your location)
29  insmod side_ch.ko iq_len_init=8187
30  ./side_ch_ctl wh11d0
31  (Set 0 to register 11. It means the pre trigger length is 0, so we only capture IQ after trigger condition is met)
32  ./side_ch_ctl wh8d16
33  (Set 16 to register 8 -- set trigger condition to phy_tx_started signal from openofdm tx core)
34  ./sdrctl dev sdr0 set reg xpu 1 1
35  (Unmute the baseband self-receiving to receive openwifi own TX signal/packet -- important for self loopback!)
36  ./side_ch_ctl g0
37  ```
38  You should see on outputs like:
39  ```
40  loop 22848 side info count 0
41  loop 22912 side info count 0
42  ...
43  ```
44  Now the count is always 0, because we haven't instructed openwifi to send packet for loopback test.
45
46- Leave above ssh session untouched. Open a new ssh session to the board from your computer. Then run on board:
47  ```
48  cd openwifi/inject_80211/
49  make
50  (Build our example packet injection program)
51  ./inject_80211 -m n -r 5 -n 1 sdr0
52  (Inject one packet to openwifi sdr0 NIC)
53  ```
54  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.
55
56- On your computer (NOT ssh onboard!), run:
57  ```
58  cd openwifi/user_space/side_ch_ctl_src
59  python3 iq_capture.py 8187
60  ```
61  You might need to install beforehand: "sudo apt install python3-numpy", and "sudo apt install python3-matplotlib".
62
63- Leave the above host session untouched. Let's go to the second ssh session (packet injection), and do single packet Tx again:
64  ```
65  ./inject_80211 -m n -r 5 -n 1 sdr0
66  ```
67  Normally in the 1st ssh session, the count becomes 2. You should also see IQ sample capture figures like this:
68  ![](./openwifi-iq-loopback.jpg)
69
70- 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
71to do further offline analysis, or feed the IQ sample to the openwifi receiver simulation, etc.
72
73## Check the packet loopback on board
74
75- 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.
76  A new ssh session to the board should be opened to do this before running the packet injection:
77  ```
78  tcpdump -i sdr0
79  ```
80  After the packet injection, you should see the packet information printed by tcpdump from self over-the-air loopback.
81
82- You can also see the openwifi printk message of Rx packet (self Tx looped back) while the packet comes to the openwifi Rx interrupt.
83  A new ssh session to the board should be opened to do this before running the packet injection:
84  ```
85  cd openwifi
86  ./sdrctl dev sdr0 set reg drv_rx 7 7
87  (Turn on the openwifi Rx printk logging)
88  ```
89  After the packet injection, in the same ssh session run:
90  ```
91  dmesg
92  ```
93  You should see the printk message from openwifi_rx_interrupt() function in the openwifi driver (sdr.c).
94
95## Self loopback config
96
97- 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
98  any interference. To have FPGA internal loopback, run before the packet injection:
99  ```
100  ./side_ch_ctl wh5h4
101  ```
102  To change back to loopback over the air, run:
103  ```
104  ./side_ch_ctl wh5h0
105  ```
106- 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
107  program without any arguments to see the help.
108
109- 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.
110  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
111  setup scripts. Please check [Application notes](README.md)
112
113- 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
114  [Capture dual antenna TX/RX IQ for multi-purpose (capture collision)](iq_2ant.md)
115