#!/bin/bash SUBNET=10.10.10 NUM_PHYS=2 if [[ $UID -ne 0 ]]; then echo "Sorry, run me as root." exit 1 fi function cleanup() { echo "Cleaning up!" # restore default routing rules echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore for i in `seq 0 $NUM_PHYS`; do prio=$((i+10)) prio2=$((256+prio)) tbl=$prio2 ip rule del priority $prio2 2> /dev/null ip rule del priority $prio 2> /dev/null ip route flush table $tbl 2> /dev/null done ip rule del priority 1000 ip rule add priority 0 table local # kill whatever we started killall wmediumd } trap 'cleanup' INT TERM EXIT modprobe -r mac80211_hwsim modprobe mac80211_hwsim radios=$NUM_PHYS # routing-based send-to-self (Patrick McHardy) # lower priority of kernel local table ip rule add priority 1000 lookup local ip rule del priority 0 &>/dev/null # only arp reply for self echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore i=0 # Assume most recently modified phys are hwsim phys (hence the ls -t) for phy in `ls -t /sys/class/ieee80211 | head -$NUM_PHYS`; do # The usual stuff dev=`ls /sys/class/ieee80211/$phy/device/net` ip=${SUBNET}.$((10 + i)) ip link set $dev down ip link set address 42:00:00:00:0${i}:00 dev $dev iw dev $dev set type mesh iw dev $dev set channel 36 ip link set $dev up iw dev $dev mesh join meshtest ip addr flush dev $dev ip addr add $ip/24 dev $dev # set up local delivery prio=$((i+10)) prio2=$((256+prio)) tbl=$prio2 # incoming traffic to us delivered via local table echo 1 > /proc/sys/net/ipv4/conf/$dev/accept_local ip rule del priority $prio 2> /dev/null ip rule add priority $prio iif $dev lookup local # outgoing frames with our ip will be generated on our interface # and go over the wire. ip rule del priority $prio2 2> /dev/null ip rule add priority $prio2 from $ip table $tbl ip route flush table $tbl 2> /dev/null ip route add default dev $dev table $tbl i=$((i+1)) done # enable wmediumd ../wmediumd/wmediumd -c 2node.cfg > wmediumd.log & # see if we can establish a mesh path ping -i 1 -c 5 -I ${SUBNET}.10 ${SUBNET}.11 || { echo FAIL; exit 1; } echo PASS