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