16dfa79bdSJiao XianjunWe extend the **CSI** (Channel State Information) to **CSI** (Chip State Information)! 26dfa79bdSJiao Xianjun 322dd0cc4SXianjun Jiao## Quick start 422dd0cc4SXianjun Jiao- Power on the SDR board. 522dd0cc4SXianjun Jiao- 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: 622dd0cc4SXianjun Jiao ``` 722dd0cc4SXianjun Jiao ssh [email protected] 822dd0cc4SXianjun Jiao (password: openwifi) 922dd0cc4SXianjun Jiao cd openwifi 1022dd0cc4SXianjun Jiao ./wgd.sh 1122dd0cc4SXianjun Jiao (Wait for the script completed) 1222dd0cc4SXianjun Jiao ./monitor_ch.sh sdr0 11 1322dd0cc4SXianjun Jiao (Monitor on channel 11. You can change 11 to other channel that is busy) 1422dd0cc4SXianjun Jiao insmod side_ch.ko 1522dd0cc4SXianjun Jiao ./side_ch_ctl g 1622dd0cc4SXianjun Jiao ``` 1722dd0cc4SXianjun Jiao You should see on board outputs like: 1822dd0cc4SXianjun Jiao ``` 1922dd0cc4SXianjun Jiao loop 64 side info count 61 2022dd0cc4SXianjun Jiao loop 128 side info count 99 2122dd0cc4SXianjun Jiao ... 2222dd0cc4SXianjun Jiao ``` 2322dd0cc4SXianjun Jiao If the second number (61, 99, ...) is not zero and keeps increasing, that means the CSI (Chip State Information) is going to the computer smoothly. 2422dd0cc4SXianjun Jiao 2522dd0cc4SXianjun Jiao- Open another terminal on the computer, and run: 2622dd0cc4SXianjun Jiao ``` 2722dd0cc4SXianjun Jiao cd openwifi/user_space/side_ch_ctl_src 2822dd0cc4SXianjun Jiao python3 side_info_display.py 2922dd0cc4SXianjun Jiao ``` 3022dd0cc4SXianjun Jiao The python script needs "matplotlib.pyplot" and "numpy" packages installed. Now you should see 3 figures showing run-time **frequency offset**, **channel state/response** and **constellation form equalizer**. Meanwhile the python script prints the **timestamp**. 3122dd0cc4SXianjun Jiao 32d37eefc6SJiao Xianjun While running, all informations are also stored into a file **side_info.txt**. A matlab script **test_side_info_file_display.m** is offered to help you do analysis on the Chip State Information offline. 3322dd0cc4SXianjun Jiao 34*1f919d9fSJiao Xianjun## Understand CSI feature 35*1f919d9fSJiao Xianjun The CSI information is extracted via the openwifi **side channel** infrastructure. This figure explains the related modules (also related source code file name) and how the information goes from the SDR board to the computer. 36*1f919d9fSJiao Xianjun  37*1f919d9fSJiao Xianjun 38*1f919d9fSJiao Xianjun The CSI information format is shown in this figure. 39*1f919d9fSJiao Xianjun  40*1f919d9fSJiao Xianjun 41*1f919d9fSJiao Xianjun For each element, the actual size is 64bit. 42*1f919d9fSJiao Xianjun - timestamp: 64bit TSF timer value, which is the same timestamp value shown by other sniffer software, like tcpdump, wireshark or openwifi printing in dmesg. 43*1f919d9fSJiao Xianjun - freq_offset: Only the 1st 16bit is used. 44*1f919d9fSJiao Xianjun - csi (channel state/response) and equalizer: Only the first two 16bit are used for I/Q of channel response and equalizer output. The remaining two 16bit are reserved for future multi-antenna cases. 45*1f919d9fSJiao Xianjun 46*1f919d9fSJiao Xianjun The python and Matlab scripts are recommended for you to understand the CSI packet format precisely. 47*1f919d9fSJiao Xianjun 4822dd0cc4SXianjun Jiao## Config the capture condition and interval 49d37eefc6SJiao Xianjun The quick start guide will monitor all CSI informations of all packets decoded by the WiFi ofdm receiver. To monitor only specific packets that match the specific conditions: FC (Frame Control), addr1 (target MAC address), addr2 (source MAC address), configuration command should be issued before executing "**side_ch_ctl g**". The configuration command is realized by feeding a different parameter to "**side_ch_ctl**". 5022dd0cc4SXianjun Jiao 5122dd0cc4SXianjun Jiao A quick example: Capture only CSI of those packets from the device with MAC address 56:5b:01:ec:e2:8f 5222dd0cc4SXianjun Jiao ``` 5322dd0cc4SXianjun Jiao ./side_ch_ctl wh1h4001 5422dd0cc4SXianjun Jiao ./side_ch_ctl wh7h01ece28f 5522dd0cc4SXianjun Jiao ./side_ch_ctl g 5622dd0cc4SXianjun Jiao ``` 5722dd0cc4SXianjun Jiao The parameter string format is explained in detail: 5822dd0cc4SXianjun Jiao ``` 5922dd0cc4SXianjun Jiao whXhY 6022dd0cc4SXianjun Jiao ``` 6122dd0cc4SXianjun Jiao The X is the register index, and the Y is the value in hex format. The remaining "w", "h" and "h" should be kept untouched. 6222dd0cc4SXianjun Jiao - To turn on conditional capture, X should be 1. For Y: bit11~bit0 should be 001(hex), bit12: on/off of FC match, bit13: on/off of addr1 match, bit14 : on/off of addr2 match. Examples: 6322dd0cc4SXianjun Jiao ``` 64d37eefc6SJiao Xianjun Turn on FC only match: 6522dd0cc4SXianjun Jiao ./side_ch_ctl wh1h1001 6622dd0cc4SXianjun Jiao 67d37eefc6SJiao Xianjun Turn on addr2 (source address) only match: 6822dd0cc4SXianjun Jiao ./side_ch_ctl wh1h4001 6922dd0cc4SXianjun Jiao 70d37eefc6SJiao Xianjun Turn on both FC and addr1 (target address) match: 7122dd0cc4SXianjun Jiao ./side_ch_ctl wh1h3001 7222dd0cc4SXianjun Jiao 7322dd0cc4SXianjun Jiao Turn off conditional capture (all packets will be captured): 7422dd0cc4SXianjun Jiao ./side_ch_ctl wh1h0001 7522dd0cc4SXianjun Jiao ``` 76d37eefc6SJiao Xianjun - To specify the condition matching target (when that type of match is turned on by above command): 7722dd0cc4SXianjun Jiao ``` 7822dd0cc4SXianjun Jiao Specify the FC matching target: 7922dd0cc4SXianjun Jiao ./side_ch_ctl wh5hY 8022dd0cc4SXianjun Jiao 8122dd0cc4SXianjun Jiao Specify the addr1 (target address) matching target: 8222dd0cc4SXianjun Jiao ./side_ch_ctl wh6hY 8322dd0cc4SXianjun Jiao 8422dd0cc4SXianjun Jiao Specify the addr2 (source address) matching target: 8522dd0cc4SXianjun Jiao ./side_ch_ctl wh7hY 8622dd0cc4SXianjun Jiao ``` 8722dd0cc4SXianjun Jiao The command "**side_ch_ctl g**" will perform CSI capture every 100ms until you press ctrl+C. To use a different capture interval: 8822dd0cc4SXianjun Jiao ``` 8922dd0cc4SXianjun Jiao side_ch_ctl gN 9022dd0cc4SXianjun Jiao ``` 9122dd0cc4SXianjun Jiao The interval will become N*100ms 9222dd0cc4SXianjun Jiao 9322dd0cc4SXianjun Jiao## Config the num_eq 9422dd0cc4SXianjun Jiao The num_eq (number of equalizer output) is configurable in case you don't need so many equalizer informations. The valid value is 0~8. You should align the num_eq value at the side_ch.ko, side_info_display.py and test_side_info_file_display.m. 9522dd0cc4SXianjun Jiao - When insert the kernel module, use: 9622dd0cc4SXianjun Jiao ``` 9722dd0cc4SXianjun Jiao insmod side_ch.ko num_eq_init=3 9822dd0cc4SXianjun Jiao ``` 9922dd0cc4SXianjun Jiao You can replace 3 by number 0~8. (8 is the default value. You don't need to specify it like in the Quick start section) 10022dd0cc4SXianjun Jiao - When launch the python script, use: 10122dd0cc4SXianjun Jiao ``` 10222dd0cc4SXianjun Jiao side_info_display.py 3 10322dd0cc4SXianjun Jiao ``` 10422dd0cc4SXianjun Jiao - When use the Matlab script, please change the num_eq variable in the script to 3 (3 is just an example). 10522dd0cc4SXianjun Jiao 10622dd0cc4SXianjun Jiao## Run CSI together with mode other than monitor 107d37eefc6SJiao Xianjun The openwifi CSI feature could run with not only monitor mode but also other modes, such as AP-Client or ad-hoc mode. After the communication functionality is fully up in those modes, you can start CSI feature from "**insmod side_ch.ko**" and "**./side_ch_ctl g**" on board as described in the previous sections to extract CSI to your computer. 10822dd0cc4SXianjun Jiao 10922dd0cc4SXianjun Jiao## Map the CSI information to the WiFi packet 110d37eefc6SJiao Xianjun If you want to relate the CSI information to the WiFi packet, you need to capture WiFi packets (tcpdump/wireshark/etc) while capturing CSI. Then you can match the timestamp (TSF timer value) between WiFi packet and CSI information, because this is the unique same identity of a Wifi packet and related CSI information. 11122dd0cc4SXianjun Jiao 112d37eefc6SJiao Xianjun Please learn the python and Matlab script to extract CSI information per packet according to your requirement. 113