1<!-- 2Author: Michael Mehari 3SPDX-FileCopyrightText: 2019 UGent 4SPDX-License-Identifier: AGPL-3.0-or-later 5--> 6 7## 802.11 packet injection 8 9The Linux wireless networking stack (i.e. driver, mac80211, cfg80211, net_dev, user app) is a robust implementation supporting a plethora of wireless devices. As robust as it is, it also has a drawback when it comes to single-layer testing. 10 11Ping and Iperf are well established performance measurement tools. However, using such tools to measure 802.11 PHY performance can be misleading, simply because they touch multiple layers in the network stack. 12 13Luckily, the mac80211 Linux subsystem provides packet injection functionality and it allows us to have finer control over physical layer testing. 14 15To this end, we have adapted a [packetspammer](https://github.com/gnychis/packetspammer) application originally written by Andy Green <[email protected]> and maintained by George Nychis <[email protected]>. 16 17### Build inject_80211 on board 18Userspace program to inject 802.11 packets through mac80211 supported (softmac) wireless devices. 19 20Login/ssh to the board and setup internet connection according to the Quick Start. Then 21``` 22apt install libpcap-dev 23cd openwifi/inject_80211 24make 25``` 26 27### Options 28 ``` 29-m/--hw_mode <hardware operation mode> (a,g,n) 30-r/--rate_index <rate/MCS index> (0,1,2,3,4,5,6,7) 31-i/--sgi_flag (0,1) 32-n/--num_packets <number of packets> 33-s/--payload_size <payload size in bytes> 34-d/--delay <delay between packets in usec> 35-h this menu 36 ``` 37 38### Example: 39``` 40iw dev wlan0 interface add mon0 type monitor && ifconfig mon0 up 41inject_80211 -m n -r 0 -n 64 -s 100 mon0 # Inject 10 802.11n packets at 6.5Mbps bitrate and 64bytes size 42``` 43 44### Link performance test 45 46To make a profound experimental analysis on the physical layer performance, we can rely on automation scripts. 47 48The following script will inject 100 802.11n packets at different bitrates and payload sizes. 49 50``` 51#!/bin/bash 52 53HW_MODE='n' 54COUNT=100 55DELAY=1000 56RATE=( 0 1 2 3 4 5 6 7 ) 57SIZE=( $(seq -s' ' 50 100 1450) ) # paload size in bytes 58IF="mon0" 59 60for (( i = 0 ; i < ${#PAYLOAD[@]} ; i++ )) do 61 for (( j = 0 ; j < ${#RATE[@]} ; j++ )) do 62 inject_80211 -m $HW_MODE -n $COUNT -d $DELAY -r ${RATE[$j]} -s ${SIZE[$i]} $IF 63 sleep 1 64 done 65done 66 67``` 68 69On the receiver side, we can use tcpdump to collect the pcap traces. 70 71``` 72iw dev wlan0 interface add mon0 type monitor && ifconfig mon0 up 73tcpdump -i mon0 -w trace.pcap 'wlan addr1 ff:ff:ff:ff:ff:ff and wlan addr2 66:55:44:33:22:11' 74``` 75 76Wlan addresses *ff:ff:ff:ff:ff:ff* and *66:55:44:33:22:11* are specific to our injector application. 77 78Next, we analyze the collected pcap traces using the analysis tool provided. 79 80``` 81analyze_80211 trace.pcap 82``` 83 84An excerpt from a sample analysis looks the following 85 86``` 87HW MODE RATE(Mbps) SGI SIZE(bytes) COUNT Duration(sec) 88======= ========== === =========== ===== ============= 89802.11n 6.5 OFF 54 100 0.11159 90802.11n 13.0 OFF 54 100 0.11264 91802.11n 19.5 OFF 54 100 0.11156 92802.11n 26.0 OFF 54 100 0.11268 93802.11n 39.0 OFF 54 100 0.11333 94802.11n 52.0 OFF 54 100 0.11149 95802.11n 58.5 OFF 54 100 0.11469 96802.11n 65.0 OFF 54 100 0.11408 97``` 98 99