xref: /aosp_15_r20/external/wmediumd/README.md (revision 621120a22a0cd8ba80b131fe8bcb37c86ff453e3)
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