blob: 736d229861ce44d54bdd2493dc066adadd755f53 [file] [log] [blame]
#!/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