xref: /aosp_15_r20/external/wmediumd/tests/diamond.sh (revision 621120a22a0cd8ba80b131fe8bcb37c86ff453e3)
1*621120a2SAndroid Build Coastguard Worker#!/bin/bash
2*621120a2SAndroid Build Coastguard Worker# 4 mesh nodes in a diamond topology
3*621120a2SAndroid Build Coastguard Worker# paths must go through one of two intermediate nodes.
4*621120a2SAndroid Build Coastguard Worker
5*621120a2SAndroid Build Coastguard Workernum_nodes=4
6*621120a2SAndroid Build Coastguard Workersession=wmediumd
7*621120a2SAndroid Build Coastguard Workersubnet=10.10.10
8*621120a2SAndroid Build Coastguard Workermacfmt='02:00:00:00:%02x:00'
9*621120a2SAndroid Build Coastguard Worker
10*621120a2SAndroid Build Coastguard Worker. func
11*621120a2SAndroid Build Coastguard Worker
12*621120a2SAndroid Build Coastguard Workerif [[ $UID -ne 0 ]]; then
13*621120a2SAndroid Build Coastguard Worker	echo "Sorry, run me as root."
14*621120a2SAndroid Build Coastguard Worker	exit 1
15*621120a2SAndroid Build Coastguard Workerfi
16*621120a2SAndroid Build Coastguard Worker
17*621120a2SAndroid Build Coastguard Workerif [[ $# -eq 0 ]]; then
18*621120a2SAndroid Build Coastguard Worker	freq=2412
19*621120a2SAndroid Build Coastguard Workerelse
20*621120a2SAndroid Build Coastguard Worker	freq=$1
21*621120a2SAndroid Build Coastguard Workerfi
22*621120a2SAndroid Build Coastguard Worker
23*621120a2SAndroid Build Coastguard Workermodprobe -r mac80211_hwsim
24*621120a2SAndroid Build Coastguard Workermodprobe mac80211_hwsim radios=$num_nodes
25*621120a2SAndroid Build Coastguard Workeriw reg set US
26*621120a2SAndroid Build Coastguard Worker
27*621120a2SAndroid Build Coastguard Workerfor i in `seq 0 $((num_nodes-1))`; do
28*621120a2SAndroid Build Coastguard Worker	addrs[$i]=`printf $macfmt $i`
29*621120a2SAndroid Build Coastguard Workerdone
30*621120a2SAndroid Build Coastguard Worker
31*621120a2SAndroid Build Coastguard Workercat <<__EOM > diamond.cfg
32*621120a2SAndroid Build Coastguard Workerifaces :
33*621120a2SAndroid Build Coastguard Worker{
34*621120a2SAndroid Build Coastguard Worker	ids = [
35*621120a2SAndroid Build Coastguard Worker		"02:00:00:00:00:00",
36*621120a2SAndroid Build Coastguard Worker		"02:00:00:00:01:00",
37*621120a2SAndroid Build Coastguard Worker		"02:00:00:00:02:00",
38*621120a2SAndroid Build Coastguard Worker		"02:00:00:00:03:00"
39*621120a2SAndroid Build Coastguard Worker	];
40*621120a2SAndroid Build Coastguard Worker
41*621120a2SAndroid Build Coastguard Worker	links = (
42*621120a2SAndroid Build Coastguard Worker		(0, 1, 10),
43*621120a2SAndroid Build Coastguard Worker		(0, 2, 20),
44*621120a2SAndroid Build Coastguard Worker		(0, 3, 0),
45*621120a2SAndroid Build Coastguard Worker		(1, 2, 30),
46*621120a2SAndroid Build Coastguard Worker		(1, 3, 10),
47*621120a2SAndroid Build Coastguard Worker		(2, 3, 20)
48*621120a2SAndroid Build Coastguard Worker	);
49*621120a2SAndroid Build Coastguard Worker};
50*621120a2SAndroid Build Coastguard Worker__EOM
51*621120a2SAndroid Build Coastguard Worker
52*621120a2SAndroid Build Coastguard Workertmux new -s $session -d
53*621120a2SAndroid Build Coastguard Worker# find out the index of the first window as we can't assume zero-indexing
54*621120a2SAndroid Build Coastguard Workerfirst_idx=`tmux list-windows -t $session | head -n1 | cut -d: -f1`
55*621120a2SAndroid Build Coastguard Worker
56*621120a2SAndroid Build Coastguard Workerrm /tmp/netns.pid.* 2>/dev/null
57*621120a2SAndroid Build Coastguard Workeri=0
58*621120a2SAndroid Build Coastguard Workerfor addr in ${addrs[@]}; do
59*621120a2SAndroid Build Coastguard Worker	phy=`addr2phy $addr`
60*621120a2SAndroid Build Coastguard Worker	dev=`ls /sys/class/ieee80211/$phy/device/net`
61*621120a2SAndroid Build Coastguard Worker	phys[$i]=$phy
62*621120a2SAndroid Build Coastguard Worker	devs[$i]=$dev
63*621120a2SAndroid Build Coastguard Worker
64*621120a2SAndroid Build Coastguard Worker	ip=${subnet}.$((10 + i))
65*621120a2SAndroid Build Coastguard Worker
66*621120a2SAndroid Build Coastguard Worker	# put this phy in own netns and tmux window, and start a mesh node
67*621120a2SAndroid Build Coastguard Worker	tmux new-window -t $session
68*621120a2SAndroid Build Coastguard Worker
69*621120a2SAndroid Build Coastguard Worker	# start netns
70*621120a2SAndroid Build Coastguard Worker	pidfile=/tmp/netns.pid.$i
71*621120a2SAndroid Build Coastguard Worker	win=$session:$((first_idx+i+1))
72*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $win 'lxc-unshare -s NETWORK /bin/bash' C-m
73*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $win 'echo $$ > '$pidfile C-m
74*621120a2SAndroid Build Coastguard Worker
75*621120a2SAndroid Build Coastguard Worker	# wait for netns to exist
76*621120a2SAndroid Build Coastguard Worker	while [[ ! -e $pidfile ]]; do
77*621120a2SAndroid Build Coastguard Worker		echo "Waiting for netns $i -- $pidfile"
78*621120a2SAndroid Build Coastguard Worker		sleep 0.5
79*621120a2SAndroid Build Coastguard Worker	done
80*621120a2SAndroid Build Coastguard Worker
81*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $session:$first_idx \
82*621120a2SAndroid Build Coastguard Worker        'iw phy '$phy' set netns `cat '$pidfile'`' C-m
83*621120a2SAndroid Build Coastguard Worker
84*621120a2SAndroid Build Coastguard Worker	# wait for phy to exist in netns
85*621120a2SAndroid Build Coastguard Worker	while [[ -e /sys/class/ieee80211/$phy ]]; do
86*621120a2SAndroid Build Coastguard Worker		echo "Waiting for $phy to move to netns..."
87*621120a2SAndroid Build Coastguard Worker		sleep 0.5
88*621120a2SAndroid Build Coastguard Worker	done
89*621120a2SAndroid Build Coastguard Worker
90*621120a2SAndroid Build Coastguard Worker	# start mesh node
91*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $win '. func' C-m
92*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $win 'meshup-iw '$dev' diamond '$freq' '$ip C-m
93*621120a2SAndroid Build Coastguard Worker
94*621120a2SAndroid Build Coastguard Worker	i=$((i+1))
95*621120a2SAndroid Build Coastguard Workerdone
96*621120a2SAndroid Build Coastguard Worker
97*621120a2SAndroid Build Coastguard Worker# start wmediumd
98*621120a2SAndroid Build Coastguard Workertmux send-keys -t $session:$first_idx '../wmediumd/wmediumd -c diamond.cfg' C-m
99*621120a2SAndroid Build Coastguard Worker
100*621120a2SAndroid Build Coastguard Worker# start iperf server on 10.10.10.13
101*621120a2SAndroid Build Coastguard Workernode_idx=$((first_idx + 4))
102*621120a2SAndroid Build Coastguard Workertmux send-keys -t $session:$node_idx 'iperf -s' C-m
103*621120a2SAndroid Build Coastguard Worker
104*621120a2SAndroid Build Coastguard Worker# enable monitor
105*621120a2SAndroid Build Coastguard Workertmux new-window -t $session
106*621120a2SAndroid Build Coastguard Workercap_idx=$((first_idx + 5))
107*621120a2SAndroid Build Coastguard Workertmux send-keys -t $session:$cap_idx 'ip link set hwsim0 up' C-m
108*621120a2SAndroid Build Coastguard Worker# capture traffic as normal user (if possible) or root
109*621120a2SAndroid Build Coastguard WorkerCAP_USER=${SUDO_USER:-root}
110*621120a2SAndroid Build Coastguard Workertmux send-keys -t $session:$cap_idx "sudo -u $CAP_USER dumpcap -i hwsim0" C-m
111*621120a2SAndroid Build Coastguard Worker
112*621120a2SAndroid Build Coastguard Workernode_idx=$((first_idx + 1))
113*621120a2SAndroid Build Coastguard Workertmux select-window -t $session:$node_idx
114*621120a2SAndroid Build Coastguard Workertmux send-keys -t $session:$node_idx 'ping -c 5 10.10.10.13' C-m
115*621120a2SAndroid Build Coastguard Workertmux send-keys -t $session:$node_idx 'iperf -c 10.10.10.13 -i 5 -t 120'
116*621120a2SAndroid Build Coastguard Worker
117*621120a2SAndroid Build Coastguard Workertmux attach
118