#! /bin/bash
if [ "$(id -u)" != 0 ]; then
  echo 'Error: Please run as root (sudo etc.)'
  exit -1
fi

INPUT_ARGS=${@//[]/-} # replace bizarre minuses with normal one
EXTRA_INPUT_ARGS=""
ARCH=$(uname -m)

./trex-cfg $INPUT_ARGS
RESULT=$?

if [ $RESULT -eq 255 ]; then
  echo "ERROR encountered while configuring TRex system"
  exit $RESULT

elif [ $RESULT -eq 2 ]; then
  echo "ERROR encountered while configuring TRex system"
  exit $RESULT

elif [ $RESULT -eq 64 ]; then
  EXTRA_INPUT_ARGS="--ntacc-so"

elif [ $RESULT -eq 48 ]; then
  EXTRA_INPUT_ARGS="--mlx4-so --mlx5-so"

elif [ $RESULT -eq 32 ]; then
  EXTRA_INPUT_ARGS="--mlx5-so"

elif [ $RESULT -eq 16 ]; then
  EXTRA_INPUT_ARGS="--mlx4-so"

elif [ $RESULT -eq 128 ]; then
  EXTRA_INPUT_ARGS="--bnxt-so"

elif [ $RESULT -ne 0 ]; then
   echo "Bad return status from trex-cfg ($RESULT)"
   echo "Configuration failed"
   exit $RESULT
fi

if [[ ! "$INPUT_ARGS" =~ "--help" ]]; then
    pci_desc_re='^(\S+) - (.+)$'
    source find_python.sh --local
    while read line
    do
        if [[ "$line" =~ $pci_desc_re ]]; then
            pci_name="pci$(echo ${BASH_REMATCH[1]} | tr ':' '_' | tr '.' '_')" # make alphanumeric name
            export $pci_name="${BASH_REMATCH[2]}"
        fi
    done <<< "$($PYTHON dpdk_setup_ports.py --dump-pci-description)"
fi

cd $(dirname $0)
export LD_LIBRARY_PATH=$PWD

if [ -t 0 ] && [ -t 1 ]; then
    saveterm="$(stty -g)"
fi

function bird_preparation {
    BIRD_PID="$(pgrep trex_bird)"
    if [[ -n "$BIRD_PID" ]]; then
        kill $BIRD_PID
    fi
    mkdir -p "/tmp/trex-bird"
    chmod -R 777 "/tmp/trex-bird"
}

function cleanup {
    bird_preparation
    if [[ ! -z "$saveterm" ]]; then
        stty $saveterm
    fi
    ./dpdk_setup_ports.py --cleanup-servers --parent="$INPUT_ARGS"
}

trap cleanup EXIT


# if we have a new core run optimized trex
if [[ "$ARCH" == "x86_64" ]] ; then
    FLAG='avx'
elif [[ "$ARCH" == "aarch64" ]] ; then
    FLAG='evtstrm'
elif [[ "$ARCH" == "ppc64le" ]] ; then
    FLAG='POWER9'
fi

bird_preparation

if grep -q $FLAG /proc/cpuinfo  ; then
    ./_$(basename $0) $INPUT_ARGS $EXTRA_INPUT_ARGS
    RESULT=$?
    if [ $RESULT -eq 132 ]; then
        echo " WARNING this program is optimized for the new Intel processors.  "
        echo " try the ./t-rex-64-o application that should work for any Intel processor but might be slower. "
        echo " try to run t-rex-64-o .. "
        ./_t-rex-64-o $INPUT_ARGS  $EXTRA_INPUT_ARGS
        RESULT=$?
    fi
else
        ./_t-rex-64-o $INPUT_ARGS $EXTRA_INPUT_ARGS
        RESULT=$?
fi

exit $RESULT

