#!/usr/bin/bash
#
# Usage:
# This function can emulate those network environment:
#   1. Delay distribution
#   2. Packet loss
#   3. Packet duplication
#   4. Packet corruption
#   5. Packet re-ordering
# Parameter:
#   NIC_NAME: You shoule export this Parameter, or function will use default NIC
#   CONDITION: delay|loss|duplicate|corruption|reordering|easy|hard|tough
#   ACTION: new|start|stop
# Return:
#   NULL
# Example:
#   1. Start emulate delay
#	  netem start delay
#   2. Stop emulate
#	  netem stop

OUTPUTFILE=${OUTPUTFILE:-/dev/null}
getDefaultNic() {
        ip route | awk '/default/{match($0,"dev ([^ ]+)",M); print M[1]}'
}

_netem() {
	local ACTION=$1
	local CONDITION=none

	export DEFAULT_NIC=`getDefaultNic`
	export NIC_NAME=${NIC_NAME:-$DEFAULT_NIC}

	case ${ACTION} in
	new)
		tc qdisc del dev ${NIC_NAME} root netem
		tc qdisc add dev ${NIC_NAME} root netem;;
	start)
		netem new
		CONDITION=$2;;
	stop)
		tc qdisc del dev ${NIC_NAME} root netem;;
	esac
# Bandwidth without vs with following condition, tested with iperf between two BOS system.
	case ${CONDITION} in
	delay)
		# 912 Mbits/sec VS 11.7 Mbits/sec
		tc qdisc change dev ${NIC_NAME} root netem delay 100ms 20ms distribution normal;;
	loss)
		# 912 Mbits/sec VS 888 Mbits/sec
		tc qdisc change dev ${NIC_NAME} root netem loss 3% 50%;;
	duplicate)
		# 912 Mbits/sec VS 874 Mbits/sec
		tc qdisc change dev ${NIC_NAME} root netem duplicate 5% 50%;;
	corruption)
		# 912 Mbits/sec VS 896 Mbits/sec
		tc qdisc change dev ${NIC_NAME} root netem corrupt 3% 50%;;
	reordering)
		# 912 Mbits/sec VS 15.2 Mbits/sec
		tc qdisc change dev ${NIC_NAME} root netem delay 100ms reorder 25% 50%;;
	easy)
		# 912 Mbits/sec VS 20.1 Mbits/sec
		tc qdisc change dev ${NIC_NAME} root netem delay 100ms 10ms distribution normal loss 1% 50%;;
	hard)
		# 912 Mbits/sec VS 1.79 Mbits/sec
		tc qdisc change dev ${NIC_NAME} root netem delay 100ms 10ms distribution normal loss 3% 50% duplicate 3% corrupt 3%;;
	tough)
		# 912 Mbits/sec VS 238 Kbits/sec
		tc qdisc change dev ${NIC_NAME} root netem delay 200ms 20ms distribution normal loss 5% 50% duplicate 5% corrupt 5% reorder 50% 50%;;
	none)
		;;
	esac

	echo "Current network setting:" | tee -a "${OUTPUTFILE}"
	tc -s qdisc ls dev ${NIC_NAME} | tee -a "${OUTPUTFILE}"
}

_netem "$@"

