#!/bin/bash # run multiple mesh nodes in a linear topology # each node is in the same coverage area, so # total throughput is divided by n. num_nodes=${1:-4} daemon=${2:-iw} session=wmediumd subnet=10.10.10 macfmt='02:00:00:00:%02x:00' . func if [[ $UID -ne 0 ]]; then echo "Sorry, run me as root." exit 1 fi modprobe -r mac80211_hwsim modprobe mac80211_hwsim radios=$num_nodes for i in `seq 0 $((num_nodes-1))`; do addrs[$i]=`printf $macfmt $i` done echo "ifaces: { count = $num_nodes; ids = [" > linear.cfg for addr in "${addrs[@]}"; do echo -n '"'$addr'"' >> linear.cfg if [[ $addr != ${addrs[$((num_nodes-1))]} ]]; then echo ", " >> linear.cfg fi done echo "]; }" >> linear.cfg tmux new -s $session -d rm /tmp/netns.pid.* 2>/dev/null i=0 for addr in ${addrs[@]}; do phy=`addr2phy $addr` dev=`ls /sys/class/ieee80211/$phy/device/net` phys[$i]=$phy devs[$i]=$dev ip=${subnet}.$((10 + i)) # put this phy in own netns and tmux window, and start a mesh node win=$session:$((i+1)).0 tmux new-window -t $session -n $ip # start netns pidfile=/tmp/netns.pid.$i tmux send-keys -t $win 'lxc-unshare -s NETWORK /bin/bash' C-m tmux send-keys -t $win 'echo $$ > '$pidfile C-m # wait for netns to exist while [[ ! -e $pidfile ]]; do echo "Waiting for netns $i -- $pidfile" sleep 0.5 done tmux send-keys -t $session:0.0 'iw phy '$phy' set netns `cat '$pidfile'`' C-m # wait for phy to exist in netns while [[ -e /sys/class/ieee80211/$phy ]]; do echo "Waiting for $phy to move to netns..." sleep 0.5 done # start mesh node tmux send-keys -t $win '. func' C-m tmux send-keys -t $win 'meshup-'$daemon ' ' $dev' linear 2412 '$ip C-m i=$((i+1)) done winct=$i # wait a few beacon periods for everyone to discover each other sleep 3 # force a linear topology for i in `seq 0 $((${#addrs[@]} - 1))`; do win=$session:$((i+1)).0 addr=${addrs[$i]} dev=${devs[$i]} for j in `seq 0 $((${#addrs[@]} - 1))`; do oaddr=${addrs[$j]} if [[ $j -lt $((i-1)) || $j -gt $((i+1)) ]]; then tmux send-keys -t $win 'iw dev '$dev' station set '$oaddr' plink_action block' C-m fi done done # start wmediumd win=$session:$((winct+1)).0 winct=$((winct+1)) tmux new-window -t $session -n wmediumd tmux send-keys -t $win '../wmediumd/wmediumd -c linear.cfg' C-m tmux attach