#!/bin/bash # 4 mesh nodes in a diamond topology # paths must go through one of two intermediate nodes. num_nodes=4 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 if [[ $# -eq 0 ]]; then freq=2412 else freq=$1 fi modprobe -r mac80211_hwsim modprobe mac80211_hwsim radios=$num_nodes iw reg set US for i in `seq 0 $((num_nodes-1))`; do addrs[$i]=`printf $macfmt $i` done cat <<__EOM > diamond.cfg ifaces : { ids = [ "02:00:00:00:00:00", "02:00:00:00:01:00", "02:00:00:00:02:00", "02:00:00:00:03:00" ]; links = ( (0, 1, 10), (0, 2, 20), (0, 3, 0), (1, 2, 30), (1, 3, 10), (2, 3, 20) ); }; __EOM tmux new -s $session -d # find out the index of the first window as we can't assume zero-indexing first_idx=`tmux list-windows -t $session | head -n1 | cut -d: -f1` 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 tmux new-window -t $session # start netns pidfile=/tmp/netns.pid.$i win=$session:$((first_idx+i+1)) 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:$first_idx \ '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-iw '$dev' diamond '$freq' '$ip C-m i=$((i+1)) done # start wmediumd tmux send-keys -t $session:$first_idx '../wmediumd/wmediumd -c diamond.cfg' C-m # start iperf server on 10.10.10.13 node_idx=$((first_idx + 4)) tmux send-keys -t $session:$node_idx 'iperf -s' C-m # enable monitor tmux new-window -t $session cap_idx=$((first_idx + 5)) tmux send-keys -t $session:$cap_idx 'ip link set hwsim0 up' C-m # capture traffic as normal user (if possible) or root CAP_USER=${SUDO_USER:-root} tmux send-keys -t $session:$cap_idx "sudo -u $CAP_USER dumpcap -i hwsim0" C-m node_idx=$((first_idx + 1)) tmux select-window -t $session:$node_idx tmux send-keys -t $session:$node_idx 'ping -c 5 10.10.10.13' C-m tmux send-keys -t $session:$node_idx 'iperf -c 10.10.10.13 -i 5 -t 120' tmux attach