1*621120a2SAndroid Build Coastguard Worker# Introduction 2*621120a2SAndroid Build Coastguard Worker 3*621120a2SAndroid Build Coastguard WorkerThis is a wireless medium simulation tool for Linux, based on the netlink API 4*621120a2SAndroid Build Coastguard Workerimplemented in the `mac80211_hwsim` kernel driver. Unlike the default in-kernel 5*621120a2SAndroid Build Coastguard Workerforwarding mode of `mac80211_hwsim`, wmediumd allows simulating frame loss and 6*621120a2SAndroid Build Coastguard Workerdelay. 7*621120a2SAndroid Build Coastguard Worker 8*621120a2SAndroid Build Coastguard WorkerThis version is forked from an earlier version, hosted here: 9*621120a2SAndroid Build Coastguard Worker 10*621120a2SAndroid Build Coastguard Worker https://github.com/cozybit/wmediumd 11*621120a2SAndroid Build Coastguard Worker 12*621120a2SAndroid Build Coastguard Worker# Prerequisites 13*621120a2SAndroid Build Coastguard Worker 14*621120a2SAndroid Build Coastguard WorkerFirst, you need a recent Linux kernel with the `mac80211_hwsim` module 15*621120a2SAndroid Build Coastguard Workeravailable. If you do not have this module, you may be able to build it using 16*621120a2SAndroid Build Coastguard Workerthe [backports project](https://backports.wiki.kernel.org/index.php/Main_Page). 17*621120a2SAndroid Build Coastguard Worker 18*621120a2SAndroid Build Coastguard WorkerWmediumd requires libnl3.0. 19*621120a2SAndroid Build Coastguard Worker 20*621120a2SAndroid Build Coastguard Worker# Building 21*621120a2SAndroid Build Coastguard Worker``` 22*621120a2SAndroid Build Coastguard Workercd wmediumd && make 23*621120a2SAndroid Build Coastguard Worker``` 24*621120a2SAndroid Build Coastguard Worker 25*621120a2SAndroid Build Coastguard Worker# Using Wmediumd 26*621120a2SAndroid Build Coastguard Worker 27*621120a2SAndroid Build Coastguard WorkerStarting wmediumd with an appropriate config file is enough to make frames 28*621120a2SAndroid Build Coastguard Workerpass through wmediumd: 29*621120a2SAndroid Build Coastguard Worker``` 30*621120a2SAndroid Build Coastguard Workersudo modprobe mac80211_hwsim radios=2 31*621120a2SAndroid Build Coastguard Workersudo ./wmediumd/wmediumd -c tests/2node.cfg & 32*621120a2SAndroid Build Coastguard Worker# run some hwsim test 33*621120a2SAndroid Build Coastguard Worker``` 34*621120a2SAndroid Build Coastguard WorkerHowever, please see the next section on some potential pitfalls. 35*621120a2SAndroid Build Coastguard Worker 36*621120a2SAndroid Build Coastguard WorkerA complete example using network namespaces is given at the end of 37*621120a2SAndroid Build Coastguard Workerthis document. 38*621120a2SAndroid Build Coastguard Worker 39*621120a2SAndroid Build Coastguard Worker# Configuration 40*621120a2SAndroid Build Coastguard Worker 41*621120a2SAndroid Build Coastguard WorkerWmediumd supports multiple ways of configuring the wireless medium. 42*621120a2SAndroid Build Coastguard Worker 43*621120a2SAndroid Build Coastguard Worker## Perfect medium 44*621120a2SAndroid Build Coastguard Worker 45*621120a2SAndroid Build Coastguard WorkerWith this configuration, all traffic flows between the configured interfaces, identified by their mac address: 46*621120a2SAndroid Build Coastguard Worker 47*621120a2SAndroid Build Coastguard Worker``` 48*621120a2SAndroid Build Coastguard Workerifaces : 49*621120a2SAndroid Build Coastguard Worker{ 50*621120a2SAndroid Build Coastguard Worker ids = [ 51*621120a2SAndroid Build Coastguard Worker "02:00:00:00:00:00", 52*621120a2SAndroid Build Coastguard Worker "02:00:00:00:01:00", 53*621120a2SAndroid Build Coastguard Worker "02:00:00:00:02:00", 54*621120a2SAndroid Build Coastguard Worker "02:00:00:00:03:00" 55*621120a2SAndroid Build Coastguard Worker ]; 56*621120a2SAndroid Build Coastguard Worker}; 57*621120a2SAndroid Build Coastguard Worker``` 58*621120a2SAndroid Build Coastguard Worker 59*621120a2SAndroid Build Coastguard Worker## Per-link loss probability model 60*621120a2SAndroid Build Coastguard Worker 61*621120a2SAndroid Build Coastguard WorkerYou can simulate a slightly more realistic channel by assigning fixed error 62*621120a2SAndroid Build Coastguard Workerprobabilities to each link. 63*621120a2SAndroid Build Coastguard Worker 64*621120a2SAndroid Build Coastguard Worker``` 65*621120a2SAndroid Build Coastguard Workerifaces : 66*621120a2SAndroid Build Coastguard Worker{ 67*621120a2SAndroid Build Coastguard Worker ids = [ 68*621120a2SAndroid Build Coastguard Worker "02:00:00:00:00:00", 69*621120a2SAndroid Build Coastguard Worker "02:00:00:00:01:00", 70*621120a2SAndroid Build Coastguard Worker "02:00:00:00:02:00", 71*621120a2SAndroid Build Coastguard Worker "02:00:00:00:03:00" 72*621120a2SAndroid Build Coastguard Worker ]; 73*621120a2SAndroid Build Coastguard Worker}; 74*621120a2SAndroid Build Coastguard Worker 75*621120a2SAndroid Build Coastguard Workermodel: 76*621120a2SAndroid Build Coastguard Worker{ 77*621120a2SAndroid Build Coastguard Worker type = "prob"; 78*621120a2SAndroid Build Coastguard Worker 79*621120a2SAndroid Build Coastguard Worker default_prob = 1.0; 80*621120a2SAndroid Build Coastguard Worker links = ( 81*621120a2SAndroid Build Coastguard Worker (0, 2, 0.000000), 82*621120a2SAndroid Build Coastguard Worker (2, 3, 0.000000) 83*621120a2SAndroid Build Coastguard Worker ); 84*621120a2SAndroid Build Coastguard Worker}; 85*621120a2SAndroid Build Coastguard Worker``` 86*621120a2SAndroid Build Coastguard Worker 87*621120a2SAndroid Build Coastguard WorkerThe above configuration would assign 0% loss probability (perfect medium) to 88*621120a2SAndroid Build Coastguard Workerall frames flowing between nodes 0 and 2, and 100% loss probability to all 89*621120a2SAndroid Build Coastguard Workerother links. Unless both directions of a link are configured, the loss 90*621120a2SAndroid Build Coastguard Workerprobability will be symmetric. 91*621120a2SAndroid Build Coastguard Worker 92*621120a2SAndroid Build Coastguard WorkerThis is a very simplistic model that does not take into account that losses 93*621120a2SAndroid Build Coastguard Workerdepend on transmission rates and signal-to-noise ratio. For that, keep reading. 94*621120a2SAndroid Build Coastguard Worker 95*621120a2SAndroid Build Coastguard Worker## Per-link signal-to-noise ratio (SNR) model 96*621120a2SAndroid Build Coastguard Worker 97*621120a2SAndroid Build Coastguard WorkerYou can model different signal-to-noise ratios for each link by including a 98*621120a2SAndroid Build Coastguard Workerlist of link tuples in the form of (sta1, sta2, snr). 99*621120a2SAndroid Build Coastguard Worker 100*621120a2SAndroid Build Coastguard Worker``` 101*621120a2SAndroid Build Coastguard Workerifaces : 102*621120a2SAndroid Build Coastguard Worker{ 103*621120a2SAndroid Build Coastguard Worker ids = [ 104*621120a2SAndroid Build Coastguard Worker "02:00:00:00:00:00", 105*621120a2SAndroid Build Coastguard Worker "02:00:00:00:01:00", 106*621120a2SAndroid Build Coastguard Worker "02:00:00:00:02:00", 107*621120a2SAndroid Build Coastguard Worker "02:00:00:00:03:00" 108*621120a2SAndroid Build Coastguard Worker ]; 109*621120a2SAndroid Build Coastguard Worker 110*621120a2SAndroid Build Coastguard Worker links = ( 111*621120a2SAndroid Build Coastguard Worker (0, 1, 0), 112*621120a2SAndroid Build Coastguard Worker (0, 2, 0), 113*621120a2SAndroid Build Coastguard Worker (2, 0, 10), 114*621120a2SAndroid Build Coastguard Worker (0, 3, 0), 115*621120a2SAndroid Build Coastguard Worker (1, 2, 30), 116*621120a2SAndroid Build Coastguard Worker (1, 3, 10), 117*621120a2SAndroid Build Coastguard Worker (2, 3, 20) 118*621120a2SAndroid Build Coastguard Worker ); 119*621120a2SAndroid Build Coastguard Worker}; 120*621120a2SAndroid Build Coastguard Worker``` 121*621120a2SAndroid Build Coastguard WorkerThe snr will affect the maximum data rates that are successfully transmitted 122*621120a2SAndroid Build Coastguard Workerover the link. 123*621120a2SAndroid Build Coastguard Worker 124*621120a2SAndroid Build Coastguard WorkerIf only one direction of a link is configured, then the link will be 125*621120a2SAndroid Build Coastguard Workersymmetric. For asymmetric links, configure both directions, as in the 126*621120a2SAndroid Build Coastguard Workerabove example where the path between 0 and 2 is usable in only one 127*621120a2SAndroid Build Coastguard Workerdirection. 128*621120a2SAndroid Build Coastguard Worker 129*621120a2SAndroid Build Coastguard WorkerThe packet loss error probabilities are derived from this snr. See function 130*621120a2SAndroid Build Coastguard Worker`get_error_prob_from_snr()`. Or you can provide a packet-error-rate table like 131*621120a2SAndroid Build Coastguard Workerthe one in `tests/signal_table_ieee80211ax` 132*621120a2SAndroid Build Coastguard Worker 133*621120a2SAndroid Build Coastguard Worker## Path loss model 134*621120a2SAndroid Build Coastguard Worker 135*621120a2SAndroid Build Coastguard WorkerThe path loss model derives signal-to-noise and probabilities from the 136*621120a2SAndroid Build Coastguard Workercoordinates of each node. This is an example configuration file for it. 137*621120a2SAndroid Build Coastguard Worker 138*621120a2SAndroid Build Coastguard Worker``` 139*621120a2SAndroid Build Coastguard Workerifaces : {...}; 140*621120a2SAndroid Build Coastguard Workermodel : 141*621120a2SAndroid Build Coastguard Worker{ 142*621120a2SAndroid Build Coastguard Worker type = "path_loss"; 143*621120a2SAndroid Build Coastguard Worker positions = ( 144*621120a2SAndroid Build Coastguard Worker (-50.0, 0.0), 145*621120a2SAndroid Build Coastguard Worker ( 0.0, 40.0), 146*621120a2SAndroid Build Coastguard Worker ( 0.0, -70.0), 147*621120a2SAndroid Build Coastguard Worker ( 50.0, 0.0) 148*621120a2SAndroid Build Coastguard Worker ); 149*621120a2SAndroid Build Coastguard Worker directions = ( 150*621120a2SAndroid Build Coastguard Worker ( 0.0, 0.0), 151*621120a2SAndroid Build Coastguard Worker ( 0.0, 10.0), 152*621120a2SAndroid Build Coastguard Worker ( 0.0, 10.0), 153*621120a2SAndroid Build Coastguard Worker ( 0.0, 0.0) 154*621120a2SAndroid Build Coastguard Worker ); 155*621120a2SAndroid Build Coastguard Worker tx_powers = (15.0, 15.0, 15.0, 15.0); 156*621120a2SAndroid Build Coastguard Worker 157*621120a2SAndroid Build Coastguard Worker model_name = "log_distance"; 158*621120a2SAndroid Build Coastguard Worker path_loss_exp = 3.5; 159*621120a2SAndroid Build Coastguard Worker xg = 0.0; 160*621120a2SAndroid Build Coastguard Worker}; 161*621120a2SAndroid Build Coastguard Worker``` 162*621120a2SAndroid Build Coastguard Worker 163*621120a2SAndroid Build Coastguard Worker## Gotchas 164*621120a2SAndroid Build Coastguard Worker 165*621120a2SAndroid Build Coastguard Worker### Allowable MAC addresses 166*621120a2SAndroid Build Coastguard Worker 167*621120a2SAndroid Build Coastguard WorkerThe kernel only allows wmediumd to work on the second available hardware 168*621120a2SAndroid Build Coastguard Workeraddress, which has bit 6 set in the most significant octet 169*621120a2SAndroid Build Coastguard Worker(i.e. 42:00:00:xx:xx:xx, not 02:00:00:xx:xx:xx). Set this appropriately 170*621120a2SAndroid Build Coastguard Workerusing 'ip link set address'. 171*621120a2SAndroid Build Coastguard Worker 172*621120a2SAndroid Build Coastguard WorkerThis issue was fixed in commit cd37a90b2a417e5882414e19954eeed174aa4d29 173*621120a2SAndroid Build Coastguard Workerin Linux, released in kernel 4.1.0. 174*621120a2SAndroid Build Coastguard Worker 175*621120a2SAndroid Build Coastguard Worker### Rates 176*621120a2SAndroid Build Coastguard Worker 177*621120a2SAndroid Build Coastguard Workerwmediumd's rate table is currently hardcoded to 802.11a OFDM rates. 178*621120a2SAndroid Build Coastguard WorkerTherefore, either operate wmediumd networks in 5 GHz channels, or supply 179*621120a2SAndroid Build Coastguard Workera rateset for the BSS with no CCK rates. 180*621120a2SAndroid Build Coastguard Worker 181*621120a2SAndroid Build Coastguard Worker### Send-to-self 182*621120a2SAndroid Build Coastguard Worker 183*621120a2SAndroid Build Coastguard WorkerBy default, traffic between local devices in Linux will not go over 184*621120a2SAndroid Build Coastguard Workerthe wire / wireless medium. This is true of vanilla hwsim as well. 185*621120a2SAndroid Build Coastguard WorkerIn order to make this happen, you need to either run the hwsim interfaces 186*621120a2SAndroid Build Coastguard Workerin separate network namespaces, or you need to set up routing rules with 187*621120a2SAndroid Build Coastguard Workerthe hwsim devices at a higher priority than local forwarding. 188*621120a2SAndroid Build Coastguard Worker 189*621120a2SAndroid Build Coastguard Worker`tests/test-001.sh` contains an example of the latter setup. 190*621120a2SAndroid Build Coastguard Worker 191*621120a2SAndroid Build Coastguard Worker# Example session 192*621120a2SAndroid Build Coastguard Worker 193*621120a2SAndroid Build Coastguard WorkerThe following sequence of commands establishes a two-node mesh using network 194*621120a2SAndroid Build Coastguard Workernamespaces. 195*621120a2SAndroid Build Coastguard Worker``` 196*621120a2SAndroid Build Coastguard Workersudo modprobe -r mac80211_hwsim 197*621120a2SAndroid Build Coastguard Workersudo modprobe mac80211_hwsim 198*621120a2SAndroid Build Coastguard Workersudo ./wmediumd/wmediumd -c ./tests/2node.cfg 199*621120a2SAndroid Build Coastguard Worker 200*621120a2SAndroid Build Coastguard Worker# in window 2 201*621120a2SAndroid Build Coastguard Workersudo lxc-unshare -s NETWORK bash 202*621120a2SAndroid Build Coastguard Workerps | grep bash # note pid 203*621120a2SAndroid Build Coastguard Worker 204*621120a2SAndroid Build Coastguard Worker# in window 1 205*621120a2SAndroid Build Coastguard Workersudo iw phy phy2 set netns $pid 206*621120a2SAndroid Build Coastguard Worker 207*621120a2SAndroid Build Coastguard Workersudo ip link set wlan1 down 208*621120a2SAndroid Build Coastguard Workersudo iw dev wlan1 set type mp 209*621120a2SAndroid Build Coastguard Workersudo ip link set addr 42:00:00:00:00:00 dev wlan1 210*621120a2SAndroid Build Coastguard Workersudo ip link set wlan1 up 211*621120a2SAndroid Build Coastguard Workersudo ip addr add 10.10.10.1/24 dev wlan1 212*621120a2SAndroid Build Coastguard Workersudo iw dev wlan1 set channel 149 213*621120a2SAndroid Build Coastguard Workersudo iw dev wlan1 mesh join meshabc 214*621120a2SAndroid Build Coastguard Worker 215*621120a2SAndroid Build Coastguard Worker# in window 2 216*621120a2SAndroid Build Coastguard Workerip link set lo 217*621120a2SAndroid Build Coastguard Worker 218*621120a2SAndroid Build Coastguard Workersudo ip link set wlan2 down 219*621120a2SAndroid Build Coastguard Workersudo iw dev wlan2 set type mp 220*621120a2SAndroid Build Coastguard Workersudo ip link set addr 42:00:00:00:01:00 dev wlan2 221*621120a2SAndroid Build Coastguard Workersudo ip link set wlan2 up 222*621120a2SAndroid Build Coastguard Workersudo ip addr add 10.10.10.2/24 dev wlan2 223*621120a2SAndroid Build Coastguard Workersudo iw dev wlan2 set channel 149 224*621120a2SAndroid Build Coastguard Workersudo iw dev wlan2 mesh join meshabc 225*621120a2SAndroid Build Coastguard Worker 226*621120a2SAndroid Build Coastguard Workeriperf -u -s -i 10 -B 10.10.10.2 227*621120a2SAndroid Build Coastguard Worker 228*621120a2SAndroid Build Coastguard Worker# in window 1 229*621120a2SAndroid Build Coastguard Workeriperf -u -c 10.10.10.2 -b 100M -i 10 -t 120 230*621120a2SAndroid Build Coastguard Worker``` 231