xref: /aosp_15_r20/external/wmediumd/tests/n-linear-mesh.sh (revision 621120a22a0cd8ba80b131fe8bcb37c86ff453e3)
1*621120a2SAndroid Build Coastguard Worker#!/bin/bash
2*621120a2SAndroid Build Coastguard Worker# run multiple mesh nodes in a linear topology
3*621120a2SAndroid Build Coastguard Worker# each node is in the same coverage area, so
4*621120a2SAndroid Build Coastguard Worker# total throughput is divided by n.
5*621120a2SAndroid Build Coastguard Worker
6*621120a2SAndroid Build Coastguard Workernum_nodes=${1:-4}
7*621120a2SAndroid Build Coastguard Workerdaemon=${2:-iw}
8*621120a2SAndroid Build Coastguard Worker
9*621120a2SAndroid Build Coastguard Workersession=wmediumd
10*621120a2SAndroid Build Coastguard Workersubnet=10.10.10
11*621120a2SAndroid Build Coastguard Workermacfmt='02:00:00:00:%02x:00'
12*621120a2SAndroid Build Coastguard Worker
13*621120a2SAndroid Build Coastguard Worker. func
14*621120a2SAndroid Build Coastguard Worker
15*621120a2SAndroid Build Coastguard Workerif [[ $UID -ne 0 ]]; then
16*621120a2SAndroid Build Coastguard Worker	echo "Sorry, run me as root."
17*621120a2SAndroid Build Coastguard Worker	exit 1
18*621120a2SAndroid Build Coastguard Workerfi
19*621120a2SAndroid Build Coastguard Worker
20*621120a2SAndroid Build Coastguard Workermodprobe -r mac80211_hwsim
21*621120a2SAndroid Build Coastguard Workermodprobe mac80211_hwsim radios=$num_nodes
22*621120a2SAndroid Build Coastguard Worker
23*621120a2SAndroid Build Coastguard Workerfor i in `seq 0 $((num_nodes-1))`; do
24*621120a2SAndroid Build Coastguard Worker	addrs[$i]=`printf $macfmt $i`
25*621120a2SAndroid Build Coastguard Workerdone
26*621120a2SAndroid Build Coastguard Worker
27*621120a2SAndroid Build Coastguard Workerecho "ifaces: { count = $num_nodes; ids = [" > linear.cfg
28*621120a2SAndroid Build Coastguard Workerfor addr in "${addrs[@]}"; do
29*621120a2SAndroid Build Coastguard Worker	echo -n '"'$addr'"' >> linear.cfg
30*621120a2SAndroid Build Coastguard Worker	if [[ $addr != ${addrs[$((num_nodes-1))]} ]]; then
31*621120a2SAndroid Build Coastguard Worker		echo ", " >> linear.cfg
32*621120a2SAndroid Build Coastguard Worker	fi
33*621120a2SAndroid Build Coastguard Workerdone
34*621120a2SAndroid Build Coastguard Workerecho "]; }" >> linear.cfg
35*621120a2SAndroid Build Coastguard Worker
36*621120a2SAndroid Build Coastguard Workertmux new -s $session -d
37*621120a2SAndroid Build Coastguard Worker
38*621120a2SAndroid Build Coastguard Workerrm /tmp/netns.pid.* 2>/dev/null
39*621120a2SAndroid Build Coastguard Workeri=0
40*621120a2SAndroid Build Coastguard Workerfor addr in ${addrs[@]}; do
41*621120a2SAndroid Build Coastguard Worker	phy=`addr2phy $addr`
42*621120a2SAndroid Build Coastguard Worker	dev=`ls /sys/class/ieee80211/$phy/device/net`
43*621120a2SAndroid Build Coastguard Worker	phys[$i]=$phy
44*621120a2SAndroid Build Coastguard Worker	devs[$i]=$dev
45*621120a2SAndroid Build Coastguard Worker
46*621120a2SAndroid Build Coastguard Worker	ip=${subnet}.$((10 + i))
47*621120a2SAndroid Build Coastguard Worker
48*621120a2SAndroid Build Coastguard Worker	# put this phy in own netns and tmux window, and start a mesh node
49*621120a2SAndroid Build Coastguard Worker	win=$session:$((i+1)).0
50*621120a2SAndroid Build Coastguard Worker	tmux new-window -t $session -n $ip
51*621120a2SAndroid Build Coastguard Worker
52*621120a2SAndroid Build Coastguard Worker	# start netns
53*621120a2SAndroid Build Coastguard Worker	pidfile=/tmp/netns.pid.$i
54*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $win 'lxc-unshare -s NETWORK /bin/bash' C-m
55*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $win 'echo $$ > '$pidfile C-m
56*621120a2SAndroid Build Coastguard Worker
57*621120a2SAndroid Build Coastguard Worker	# wait for netns to exist
58*621120a2SAndroid Build Coastguard Worker	while [[ ! -e $pidfile ]]; do
59*621120a2SAndroid Build Coastguard Worker		echo "Waiting for netns $i -- $pidfile"
60*621120a2SAndroid Build Coastguard Worker		sleep 0.5
61*621120a2SAndroid Build Coastguard Worker	done
62*621120a2SAndroid Build Coastguard Worker
63*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $session:0.0 'iw phy '$phy' set netns `cat '$pidfile'`' C-m
64*621120a2SAndroid Build Coastguard Worker
65*621120a2SAndroid Build Coastguard Worker	# wait for phy to exist in netns
66*621120a2SAndroid Build Coastguard Worker	while [[ -e /sys/class/ieee80211/$phy ]]; do
67*621120a2SAndroid Build Coastguard Worker		echo "Waiting for $phy to move to netns..."
68*621120a2SAndroid Build Coastguard Worker		sleep 0.5
69*621120a2SAndroid Build Coastguard Worker	done
70*621120a2SAndroid Build Coastguard Worker
71*621120a2SAndroid Build Coastguard Worker	# start mesh node
72*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $win '. func' C-m
73*621120a2SAndroid Build Coastguard Worker	tmux send-keys -t $win 'meshup-'$daemon ' ' $dev' linear 2412 '$ip C-m
74*621120a2SAndroid Build Coastguard Worker
75*621120a2SAndroid Build Coastguard Worker	i=$((i+1))
76*621120a2SAndroid Build Coastguard Workerdone
77*621120a2SAndroid Build Coastguard Workerwinct=$i
78*621120a2SAndroid Build Coastguard Worker
79*621120a2SAndroid Build Coastguard Worker# wait a few beacon periods for everyone to discover each other
80*621120a2SAndroid Build Coastguard Workersleep 3
81*621120a2SAndroid Build Coastguard Worker
82*621120a2SAndroid Build Coastguard Worker# force a linear topology
83*621120a2SAndroid Build Coastguard Workerfor i in `seq 0 $((${#addrs[@]} - 1))`; do
84*621120a2SAndroid Build Coastguard Worker	win=$session:$((i+1)).0
85*621120a2SAndroid Build Coastguard Worker	addr=${addrs[$i]}
86*621120a2SAndroid Build Coastguard Worker	dev=${devs[$i]}
87*621120a2SAndroid Build Coastguard Worker
88*621120a2SAndroid Build Coastguard Worker	for j in `seq 0 $((${#addrs[@]} - 1))`; do
89*621120a2SAndroid Build Coastguard Worker		oaddr=${addrs[$j]}
90*621120a2SAndroid Build Coastguard Worker		if [[ $j -lt $((i-1)) || $j -gt $((i+1)) ]]; then
91*621120a2SAndroid Build Coastguard Worker			tmux send-keys -t $win 'iw dev '$dev' station set '$oaddr' plink_action block' C-m
92*621120a2SAndroid Build Coastguard Worker		fi
93*621120a2SAndroid Build Coastguard Worker	done
94*621120a2SAndroid Build Coastguard Workerdone
95*621120a2SAndroid Build Coastguard Worker
96*621120a2SAndroid Build Coastguard Worker# start wmediumd
97*621120a2SAndroid Build Coastguard Workerwin=$session:$((winct+1)).0
98*621120a2SAndroid Build Coastguard Workerwinct=$((winct+1))
99*621120a2SAndroid Build Coastguard Workertmux new-window -t $session -n wmediumd
100*621120a2SAndroid Build Coastguard Workertmux send-keys -t $win '../wmediumd/wmediumd -c linear.cfg' C-m
101*621120a2SAndroid Build Coastguard Worker
102*621120a2SAndroid Build Coastguard Workertmux attach
103