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