#!/bin/bash
# Sucht die optimale UP oder DOWN-Stream-
# Bandbreite für trafficcontrol
# (c) 2010 Martin Stern, Lizenz: GPL

###########################################
# Parameter
IFACE=$1     # Network Device
DIRECTION=$2 # Iterate über UP oder DOWN
INTERVALL=$3 # Bandbreitenintervall
STEP=$4      # Schrittweite
COUNT=$5     # Anzahl Pings pro Schritt
OTHERBW=$6   # Bandbr. der anderen Richtung

###########################################
# Globale Variablen
TCScript="/usr/local/bin/trafficcontrol-inetgw"
PingHost="www.google.de"

###########################################
# Functionen
function readtime {
  cat /proc/uptime | cut -d"." -f1
}

function CallTrafficcontrol {
  bw=$1
  if [ $DIRECTION = "UP" ]; then
    $TCScript $IFACE $OTHERBW $bw
  else
    $TCScript $IFACE $bw $OTHERBW
  fi
}

function PrintResult {
  RXallow=$1
  TXallow=$2
   printf "$format" "$RXallow"\
    "($RXusedBW)" "$TXallow"\
    "($TXusedBW)" "$RTT"
}

function CheckLatency {
  #Übertragene Bytes vor Ping
  t1=`readtime`
  s=`/sbin/ifconfig $IFACE | grep "RX.*TX"`
  rx1=`echo $s|cut -d":" -f2|cut -d" " -f1`
  tx1=`echo $s|cut -d":" -f3|cut -d" " -f1`

  ping -c$COUNT $PingHost -q > $TMP1 2>&1

  #Übertragene Bytes nach Ping
  t2=`readtime`
  s=`/sbin/ifconfig $IFACE | grep "RX.*TX"`
  rx2=`echo $s|cut -d":" -f2|cut -d" " -f1`
  tx2=`echo $s|cut -d":" -f3|cut -d" " -f1`

  #Genutzte Bandbreite ermitteln
  rxdelta=$[$rx2-$rx1]
  txdelta=$[$tx2-$tx1]
  tdelta=$[$t2-$t1]
  RXusedBW=$[$rxdelta/$tdelta*8/1024]
  TXusedBW=$[$txdelta/$tdelta*8/1024]

  #Durchschnittliche Antwortszeit
  RTT=`perl -wnl -e 'm|^rtt.*= [\d\.]*/([\d]*)[\d\.]*/[\d\.]*/[\d\.]* ms| and print $1' $TMP1`
}

########################################### 
# Main

#Temporäre Datei anlegen
TMP1="/tmp/trafficcontrol-searchbw.ping.$$"
touch $TMP1; chmod 600 $TMP1

#Oberes-/Unteres-Intervallende ermitteln
LowBW=`echo "$INTERVALL" | cut -d"-" -f1`
HighBW=`echo "$INTERVALL" | cut -d"-" -f2`
CurrentBW=$LowBW

echo "Allowed Bandw.:\
  Erlaubte Rohdatenbandbreite    (ATM)"
echo "Used    Bandw.:\
  Verwendete Nutzdatenbandbreite (IP)"
echo

format="%19s | %19s | %10s | \n"
printf "$format" "Allowed (Used)" \
  "Allowed (Used)"  " "
printf "$format" "Downstream Bandw." \
  "Upstream Bandw." "Avg. RTT"
printf "$format" "[kBit/s]" \
  "[kBit/s]"        "[ms]"
format="%9s %9s | %9s %9s | %10s | \n"

#Vergleichsmessung ohne TC
$TCScript $IFACE clear
sleep 10
CheckLatency
PrintResult "Inaktiv" "Inaktiv"

while [ $CurrentBW -le $HighBW ]; do
  CallTrafficcontrol $CurrentBW
  sleep 10
  CheckLatency
  if [ $DIRECTION = "UP" ]; then
    PrintResult "$OTHERBW" "$CurrentBW"
  else
    PrintResult "$CurrentBW" "$OTHERBW"
  fi
  CurrentBW=$[$CurrentBW+$STEP]
done
