#!/bin/sh

CWND_SIZE_3MSS=4380
CWND_SIZE_256K=262144
CWND_SIZE_2M=2097152

INSTANTA_EPOLL_ITER=0
INSTANTA_POLL_ITER=0
INSTANTA_SELECT_ITER=0

INSTANTA_LOG_LEVEL=1
INSTANTA_LATENCY_BEST=0

#Initial congestion window size(default 256K)
INSTANTA_TCP_CWND_INIT=$CWND_SIZE_256K

#Maximum congestion window value (default 2M)
INSTANTA_TCP_CWND_MAX=$CWND_SIZE_2M

#Initial Congestion avoidance threshold (default: 256K)
INSTANTA_TCP_SSTHRESH_INIT=$CWND_SIZE_256K

#tcp_slow_start_after_idle (default: disable)
INSTANTA_TCP_SS_AFTER_IDLE=0
INSTANTA_NO_BYPASS_TCP_PORTS=""
INSTANTA_NO_BYPASS_UDP_PORTS=""
lib_path=/usr/lib/libinstanta.so

INSTANTA_SNDLOWAT=0

show_usage() {
    echo "Usage:"                                                                               >&2
    echo "  $0 [options] <command>"                                                             >&2
    echo                                                                                        >&2
    echo "Options:"                                                                             >&2
    echo "  --log-level(default:1)     0: DEBUG, 1: INFO, 2: WARN, 3: ERROR, 4: FATAL, 5: OFF"  >&2
    echo "  --latency-best "                                                                    >&2
    echo "  --cwnd-init(default:262144)  [4380,2097152]"                                               >&2
    echo "  --cwnd-max(default:2097152)   [4380,2097152]"                                                 >&2
    echo "  --ssthresh-init(default:262144)   [4380,2097152]"                                          >&2
    echo "  --ss-after-idle (default:0) 0:close, other:Interval time (unit:250ms)"              >&2
    echo "  --lib-path(default:libinstanta.so)"                                                 >&2
    echo "  --epoll-iter(default:0) [0 , 16384]"                                                >&2
    echo "  --poll-iter(default:0) [0 , 16384]"                                           >&2
    echo "  --select-iter(default:0) [0 , 16384]"                                           >&2
    echo "  --send-lowat(default:0) [0 , 1460]"                                           >&2
    echo "  --no-bypass-tcp-ports(default:"") (0 , 65535]  2000,3000,4000,5000 Limit on the number of items:16"                  >&2
    echo "  --no-bypass-udp-ports(default:"") (0 , 65535]  2000,3000,4000,5000 Limit on the number of items:16"                  >&2
    exit 1
}

setup_preload() {
    if [ ! -e "$lib_path" ] ; then
        echo "Error: could not find $lib_path"                     >&2
        echo "Please install NOS SDK or set the correct lib path"  >&2
        exit 1
    fi

    # Set up LD_PRELOAD
    if [ -z "$LD_PRELOAD" ] ; then
        LD_PRELOAD="$lib_path"
    else
        LD_PRELOAD="$lib_path:$LD_PRELOAD"
    fi
    export LD_PRELOAD
}

check_env_var_range()
{
    env_value=$1
    min_value=$2
    max_value=$3
    if [ $env_value -ge $min_value ] && [ $env_value -le $max_value ]
    then
        return 0
    fi
    return -1
}

#Check that the value environment variable is in a valid range
env_var_check_and_export() {

    case "$INSTANTA_LOG_LEVEL" in
        [0-5])
            break
            ;;
         *)
            echo "--log-level($INSTANTA_LOG_LEVEL) set fail!!!"
            exit 1
            ;;
    esac

    check_env_var_range $INSTANTA_TCP_CWND_INIT $CWND_SIZE_3MSS $CWND_SIZE_2M
    if [ $? -ne 0 ]
    then
        echo "--cwnd-init($INSTANTA_TCP_CWND_INIT) set fail!!!"
        exit 1
    fi

    check_env_var_range $INSTANTA_TCP_CWND_MAX $CWND_SIZE_3MSS $CWND_SIZE_2M
    if [ $? -ne 0 ]
    then
        echo "--cwnd-max($INSTANTA_TCP_CWND_MAX) set fail!!!"
        exit 1
    fi

    check_env_var_range $INSTANTA_TCP_SSTHRESH_INIT $CWND_SIZE_3MSS $CWND_SIZE_2M
    if [ $? -ne 0 ]
    then
        echo "--ssthresh-init($INSTANTA_TCP_SSTHRESH_INIT) set fail!!!"
        exit 1
    fi

    check_env_var_range $INSTANTA_TCP_SS_AFTER_IDLE 0 255
    if [ $? -ne 0 ]
    then
        echo "--ss-after-idle($INSTANTA_TCP_SS_AFTER_IDLE) set fail!!!"
        exit 1
    fi

    check_env_var_range $INSTANTA_EPOLL_ITER 0 65535
    if [ $? -ne 0 ]
    then
        echo "--send-lowat($INSTANTA_EPOLL_ITER) set fail!!!"
        exit 1
    fi

    check_env_var_range $INSTANTA_SNDLOWAT 0 1460
    if [ $? -ne 0 ]
    then
        echo "--send-lowat($INSTANTA_SNDLOWAT) set fail!!!"
        exit 1
    fi

    check_env_var_range $INSTANTA_SELECT_ITER 0 16384
    if [ $? -ne 0 ]
    then
        echo "--epoll-iter($INSTANTA_SELECT_ITER) set fail!!!"
        exit 1
    fi

    check_env_var_range $INSTANTA_POLL_ITER 0 16384
    if [ $? -ne 0 ]
    then
        echo "--epoll-iter($INSTANTA_POLL_ITER) set fail!!!"
        exit 1
    fi


    export INSTANTA_LOG_LEVEL
    export INSTANTA_LATENCY_BEST

    export INSTANTA_TCP_CWND_INIT
    export INSTANTA_TCP_CWND_MAX
    export INSTANTA_TCP_SSTHRESH_INIT
    export INSTANTA_TCP_SS_AFTER_IDLE
    export INSTANTA_POLL_ITER
    export INSTANTA_SELECT_ITER
    export INSTANTA_EPOLL_ITER
    export INSTANTA_SNDLOWAT
    export INSTANTA_NO_BYPASS_TCP_PORTS
    export INSTANTA_NO_BYPASS_UDP_PORTS
}

while [ $# -gt 0 ]
do
    case "$1" in
    --log-level)
        shift
        INSTANTA_LOG_LEVEL="$1"
        ;;
    --latency-best)
        INSTANTA_LATENCY_BEST=1
        ;;
    --lib-path)
        shift
        lib_path="$1"
        ;;
    --cwnd-init)
        shift
        INSTANTA_TCP_CWND_INIT="$1"
        ;;
    --cwnd-max)
        shift
        INSTANTA_TCP_CWND_MAX="$1"
        ;;
    --ssthresh-init)
        shift
        INSTANTA_TCP_SSTHRESH_INIT="$1"
        ;;
    --ss-after-idle)
        shift
        INSTANTA_TCP_SS_AFTER_IDLE="$1"
        ;;
    --epoll-iter)
        shift
        INSTANTA_EPOLL_ITER="$1"
        ;;
    --poll-iter)
        shift
        INSTANTA_POLL_ITER="$1"
        ;;
    --select-iter)
        shift
        INSTANTA_SELECT_ITER="$1"
        ;;
    --send-lowat)
        shift
        INSTANTA_SNDLOWAT="$1"
        ;;
    --no-bypass-tcp-ports)
        shift
        INSTANTA_NO_BYPASS_TCP_PORTS="$1"
        ;;
    --no-bypass-udp-ports)
        shift
        INSTANTA_NO_BYPASS_UDP_PORTS="$1"
        ;;
    -*)
        show_usage
        ;;
    *)
        break
        ;;
    esac
    shift
done

env_var_check_and_export
setup_preload
exec "$@"
