#!/bin/sh
########################################################################
# tcp_throughput.sh
########################################################################
#
# This file is executed on each test node. It is not intended for
# direct execution. See run_test.sh instead.
#
# Note:
# In order to execute all necessary commands on test nodes, add
# the following line to your sudoers (visudo):
# brn ALL = (root) NOPASSWD: /sbin/route, /sbin/ifconfig, /usr/sbin/iptables
########################################################################
DEBUG=""
BRNSRC=""
BRNDST=""
TSTSRC=""
TSTDST=""
NODES=""
NODEDB=""
CLICK_SCRIPT=brn_master.click
CLICKPATH=/mnt/kurth
SCRIPTNAME="${0}"
TEST_ABORT=80
CLICK_PROC=/tmp/click
CHANNEL=15
#-----------------------------------------------------------------------
usage()
{
echo
echo "Usage: ${SCRIPTNAME} <options> <additional nodes>"
echo " options are..."
echo " -a brn-src IP of the input node into the BRN."
echo " -b brn-dst IP of the ouput node out of the BRN."
echo " -c tst-src IP of the test source generating the traffic."
echo " -d tst-dst IP of the test destination processing the traffic."
echo " --nodedb file The nodedb file to use."
echo " --clickpath path Path to the click bin dir."
echo " --clickscript scr The click script to execute."
echo " --debug Turn on debug (optional)"
echo " add. nodes Nodes over which the traffic is relayed."
echo ""
echo " note: all used nodes must be listed in the nodedb file."
exit 1
}
#-----------------------------------------------------------------------
error()
{
echo "ERROR: $1"
usage
exit 1
}
#-----------------------------------------------------------------------
warning()
{
echo "WARN: $1"
}
#-----------------------------------------------------------------------
debug()
{
if test ! -z "$DEBUG"
then
echo "DEBUG: $1"
fi
}
#-----------------------------------------------------------------------
nodedb_getath()
{
RETV=`grep -e "$1" ${NODEDB} | awk '{print $5}' | egrep -e '([0-9A-Fa-f]{2}:){5}[0-9a-fA-F]'`
debug "Node $1 has ath0 mac $RETV"
if test -z ${RETV}
then
error "Could not grep ath0 address of node $1 from node-db."
fi
echo ${RETV}
}
#-----------------------------------------------------------------------
nodedb_getmac()
{
RETV=`grep -e "$1" ${NODEDB} | awk '{print $4}' | egrep -e '([0-9A-Fa-f]{2}:){5}[0-9a-fA-F]'`
debug "Node $1 has mac $RETV"
if test -z ${RETV}
then
error "Could not grep ether address of node $1 from node-db."
fi
echo ${RETV}
}
#-----------------------------------------------------------------------
run_node0()
{
# Please set the -r option for the syslogd, so that it will accept
# remote logging messges (SYSLOGD_PARAMS="-r" in /etc/sysconfig/syslog
# or corresponding entry in /etc/syslog-ng/syslog-ng.conf)
sleep 12
debug "iperf -c ${BRNSRC} -p 4711 -t 5 -f k &"
iperf -c ${BRNSRC} -p 4711 -t 5 -f k &
sleep 15
debug "kill %1"
kill %1
debug "iperf -c ${BRNSRC} -p 4711 -t 30 -f k &"
sh -c "iperf -c ${BRNSRC} -p 4711 -t 30 -f k; killall sleep" &
sleep ${TEST_ABORT}
debug "killall -q -SIGKILL iperf"
killall -q -SIGKILL iperf
}
#-----------------------------------------------------------------------
run_node1()
{
debug "Executing iperf -s -p 4711 -f k &"
iperf -s -p 4711 -f k &
sleep ${TEST_ABORT}
debug "Executing killall -q -SIGKILL iperf"
killall -q -SIGKILL iperf
}
#-----------------------------------------------------------------------
shutdown_click()
{
IFCONFIG=ifconfig
UMOUNT=umount
RMMOD=rmmod
debug "Executing killall -q logserver"
killall -q -SIGKILL logserver
debug "Executing killall -q -SIGKILL click"
killall -q -SIGKILL click
debug "${IFCONFIG} ath0 down 2>&1 > /dev/null"
${IFCONFIG} ath0 down 2>&1 > /dev/null
debug "${UMOUNT} ${CLICK_PROC} 2>&1 > /dev/null"
${UMOUNT} ${CLICK_PROC} 2>&1 > /dev/null
debug "${RMMOD} click.ko"
${RMMOD} click.ko
debug "${RMMOD} proclikefs.ko"
${RMMOD} proclikefs.ko
debug "${RMMOD} ath_pci.ko"
${RMMOD} ath_pci.ko
debug "${RMMOD} ath_hal.ko"
${RMMOD} ath_hal.ko
#debug "killall -q syslogd"
#killall -q syslogd
#killall -SIGKILL -q syslogd
#debug "syslogd -C 16 < /dev/null > /dev/null 2>&1"
#syslogd -C 16 < /dev/null > /dev/null 2>&1
}
#-----------------------------------------------------------------------
setup_click()
{
IFCONFIG=ifconfig
MOUNT=mount
INSMOD=insmod
IWCONFIG=/usr/sbin/iwconfig
#debug "killall -q syslogd"
#killall -q syslogd
#debug "syslogd -R ${TSTSRC} -L -C 16"
#syslogd -R ${TSTSRC} -L -C 16
#export CLICKPATH
debug "${INSMOD} ./ath_hal.ko"
${INSMOD} ./ath_hal.ko
debug "${INSMOD} ./ath_pci.ko"
${INSMOD} ./ath_pci.ko countrycode=392
debug "${INSMOD} ./proclikefs.ko"
${INSMOD} ./proclikefs.ko
debug "${INSMOD} ./click.ko"
${INSMOD} ./click.ko
debug "mkdir -p ${CLICK_PROC}"
mkdir -p ${CLICK_PROC}
debug "${MOUNT} -t click none ${CLICK_PROC}"
${MOUNT} -t click none ${CLICK_PROC}
debug "${IFCONFIG} ath0 up"
${IFCONFIG} ath0 up
debug "iwconfig ath0 channel ${CHANNEL}"
${IWCONFIG} ath0 channel ${CHANNEL}
debug "Executing ./logserver 7777 &"
./logserver 7777 &
}
#-----------------------------------------------------------------------
run_node2()
{
BRNDSTMAC=`nodedb_getmac ${BRNDST}`
BRNSRCMAC=`nodedb_getmac ${BRNSRC}`
TSTDSTMAC=`nodedb_getmac ${TSTDST}`
TSTSRCMAC=`nodedb_getmac ${TSTSRC}`
# Prepare first rewriter
debug "echo \"${BRNDSTMAC}\" > ${CLICK_PROC}/rewriter1/ether_dst"
echo "${BRNDSTMAC}" > ${CLICK_PROC}/rewriter1/ether_dst
debug "echo \"${BRNSRCMAC}\" > ${CLICK_PROC}/rewriter1/ether_src"
echo "${BRNSRCMAC}" > ${CLICK_PROC}/rewriter1/ether_src
debug "echo \"${TSTDST}\" > ${CLICK_PROC}/rewriter1/ip_dst"
echo "${TSTDST}" > ${CLICK_PROC}/rewriter1/ip_dst
debug "echo \"${BRNDST}\" > ${CLICK_PROC}/rewriter1/ip_src"
echo "${BRNDST}" > ${CLICK_PROC}/rewriter1/ip_src
debug "echo \"true\" > ${CLICK_PROC}/rewriter1/active"
echo "true" > ${CLICK_PROC}/rewriter1/active
# Set up second rewriter
debug "echo \"${TSTSRCMAC}\" > ${CLICK_PROC}/rewriter2/ether_dst"
echo "${TSTSRCMAC}" > ${CLICK_PROC}/rewriter2/ether_dst
debug "echo \"${BRNSRCMAC}\" > ${CLICK_PROC}/rewriter2/ether_src"
echo "${BRNSRCMAC}" > ${CLICK_PROC}/rewriter2/ether_src
debug "echo \"${TSTSRC}\" > ${CLICK_PROC}/rewriter2/ip_dst"
echo "${TSTSRC}" > ${CLICK_PROC}/rewriter2/ip_dst
debug "echo \"${BRNSRC}\" > ${CLICK_PROC}/rewriter2/ip_src"
echo "${BRNSRC}" > ${CLICK_PROC}/rewriter2/ip_src
debug "echo \"true\" > ${CLICK_PROC}/rewriter2/active"
echo "true" > ${CLICK_PROC}/rewriter2/active
ROUTESTART="`nodedb_getmac ${BRNDST}` `nodedb_getath ${BRNDST}`"
ROUTEEND="`nodedb_getath ${BRNSRC}` `nodedb_getmac ${BRNSRC}`"
ROUTEINT=""
for node in ${NODES}
do
route_host=${node}
index=`expr index "${node}" "@"`
if test 0 != ${index}
then
route_host=`echo "${node}" | awk -F@ '{print $2}'`
fi
ROUTEINT="${ROUTEINT} `nodedb_getath ${route_host}`"
done
ROUTE="${ROUTESTART} ${ROUTEINT} ${ROUTEEND}"
echo "Node2 route = $ROUTE"
echo ${ROUTE} > ${CLICK_PROC}/dsr/querier/fixed_route
#echo "00:0F:B5:3F:49:EE 00:0F:B5:3F:58:49 00:0F:B5:3F:21:81 00:0F:B5:3F:21:60 00:0F:B5:3F:20:D6 00:0F:B5:3F:21:3C 00:0F:B5:3F:1E:EA 00:0F:B5:3F:1B:BF 00:0F:B5:3F:3E:D8" > ${CLICK_PROC}/dsr/querier/fixed_route
}
#-----------------------------------------------------------------------
run_node3()
{
BRNDSTMAC=`nodedb_getmac ${BRNDST}`
BRNSRCMAC=`nodedb_getmac ${BRNSRC}`
TSTDSTMAC=`nodedb_getmac ${TSTDST}`
TSTSRCMAC=`nodedb_getmac ${TSTSRC}`
# Prepare first rewriter
debug "Executing echo \"${BRNSRCMAC}\" > ${CLICK_PROC}/rewriter1/ether_dst"
echo "${BRNSRCMAC}" > ${CLICK_PROC}/rewriter1/ether_dst
debug "Executing echo \"${BRNDSTMAC}\" > ${CLICK_PROC}/rewriter1/ether_src"
echo "${BRNDSTMAC}" > ${CLICK_PROC}/rewriter1/ether_src
debug "Executing echo \"${TSTSRC}\" > ${CLICK_PROC}/rewriter1/ip_dst"
echo "${TSTSRC}" > ${CLICK_PROC}/rewriter1/ip_dst
debug "Executing echo \"${BRNSRC}\" > ${CLICK_PROC}/rewriter1/ip_src"
echo "${BRNSRC}" > ${CLICK_PROC}/rewriter1/ip_src
debug "Executing echo \"true\" > ${CLICK_PROC}/rewriter1/active"
echo "true" > ${CLICK_PROC}/rewriter1/active
# Set up second rewriter
debug "Executing echo \"${TSTDSTMAC}\" > ${CLICK_PROC}/rewriter2/ether_dst"
echo "${TSTDSTMAC}" > ${CLICK_PROC}/rewriter2/ether_dst
debug "Executing echo \"${BRNDSTMAC}\" > ${CLICK_PROC}/rewriter2/ether_src"
echo "${BRNDSTMAC}" > ${CLICK_PROC}/rewriter2/ether_src
debug "Executing echo \"${TSTDST}\" > ${CLICK_PROC}/rewriter2/ip_dst"
echo "${TSTDST}" > ${CLICK_PROC}/rewriter2/ip_dst
debug "Executing echo \"${BRNDST}\" > ${CLICK_PROC}/rewriter2/ip_src"
echo "${BRNDST}" > ${CLICK_PROC}/rewriter2/ip_src
debug "Executing echo \"true\" > ${CLICK_PROC}/rewriter2/active"
echo "true" > ${CLICK_PROC}/rewriter2/active
ROUTESTART="`nodedb_getmac ${BRNSRC}` `nodedb_getath ${BRNSRC}`"
ROUTEEND="`nodedb_getath ${BRNDST}` `nodedb_getmac ${BRNDST}`"
ROUTEINT=""
for node in ${NODES}
do
route_host=${node}
index=`expr index "${node}" "@"`
if test 0 != ${index}
then
route_host=`echo "${node}" | awk -F@ '{print $2}'`
fi
ROUTEINT="${ROUTEINT} `nodedb_getath ${route_host}`"
done
ROUTE="${ROUTESTART} ${ROUTEINT} ${ROUTEEND}"
echo "Node3 route = $ROUTE"
echo ${ROUTE} > ${CLICK_PROC}/dsr/querier/fixed_route
#echo "00:0F:B5:3F:3E:D8 00:0F:B5:3F:1B:BF 00:0F:B5:3F:1E:EA 00:0F:B5:3F:21:3C 00:0F:B5:3F:20:D6 00:0F:B5:3F:21:60 00:0F:B5:3F:21:81 00:0F:B5:3F:58:49 00:0F:B5:3F:49:EE" > ${CLICK_PROC}/dsr/querier/fixed_route
}
#-----------------------------------------------------------------------
# Runs the given click script using the click kernel module
# For the userland version, see former versions of this file.
run_others()
{
if test ! -x ${CLICKPATH}/click-align
then
error "Could not find click-align (expected ${CLICKPATH}/click-align)."
fi
if test ! -r ${CLICK_SCRIPT}
then
error "Could not find click script (expected ${CLICK_SCRIPT})."
fi
# Clear all click
shutdown_click
# Insert modules
setup_click
# Execute the click script
debug "${CLICKPATH}/click-align ${CLICK_SCRIPT} > ${CLICK_PROC}/config"
${CLICKPATH}/click-align ${CLICK_SCRIPT} > ${CLICK_PROC}/config
sleep 8
case "${NODE}" in
"2")
run_node2
;;
"3")
run_node3
;;
esac
sleep ${TEST_ABORT}
cat ${CLICK_PROC}/errors
cat ${CLICK_PROC}/messages
echo "" > ${CLICK_PROC}/config
# Clear all click
shutdown_click
}
#-----------------------------------------------------------------------
run_test()
{
case "${NODE}" in
"0")
run_node0
;;
"1")
run_node1
;;
*)
run_others
;;
esac
}
#-----------------------------------------------------------------------
# main()
#-----------------------------------------------------------------------
# Parse parameters
while [ $# -gt 0 ]; do # Until you run out of parameters . . .
case "$1" in
-a|--brn-src)
BRNSRC="$2"
shift
;;
-b|--brn-dst)
BRNDST="$2"
shift
;;
-c|--tst-src)
TSTSRC="$2"
shift
;;
-d|--tst-dst)
TSTDST="$2"
shift
;;
--clickpath)
CLICKPATH=$2
shift
;;
--clickscript)
CLICK_SCRIPT=$2
shift
;;
--nodedb)
NODEDB=$2
shift
;;
--debug)
DEBUG="--debug"
;;
-h|--help)
usage
exit 1
;;
*)
NODES="$*"
break
;;
esac
shift # Check next set of parameters.
done
debug "Param BRNSRC=${BRNSRC}"
debug "Param BRNDST=${BRNDST}"
debug "Param TSTSRC=${TSTSRC}"
debug "Param TSTDST=${TSTDST}"
debug "Param NODEDB=${NODEDB}"
debug "Param DEBUG=${DEBUG}"
debug "Param NODES=${NODES}"
debug "Param CLICKPATH=${CLICKPATH}"
debug "Param HOST=${HOST}"
debug "Param NODE=${NODE}"
debug "Param CLICK_SCRIPT=${CLICK_SCRIPT}"
debug "Param PWD=`pwd`"
# Check parameters
if test -z ${BRNSRC}
then
error "Parameter brn-src not specified."
fi
if test -z ${BRNDST}
then
error "Parameter brn-dst not specified."
fi
if test -z ${TSTDST}
then
error "Parameter tst-src not specified."
fi
if test -z ${TSTDST}
then
error "Parameter tst-dst not specified."
fi
if test ! -r ${NODEDB}
then
error "Node-DB not found (--nodedb=...)."
fi
# Run the test
run_test
exit 0